forked from blasthavers/blastmud
		
	Fix edge cases + use up charges when using "use"
This commit is contained in:
		
							parent
							
								
									385d2d1fd8
								
							
						
					
					
						commit
						8085689490
					
				@ -659,6 +659,16 @@ impl DBTrans {
 | 
				
			|||||||
        Ok(())
 | 
					        Ok(())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub async fn check_task_by_type_code<'a>(&'a self, task_type: &'a str, task_code: &'a str)
 | 
				
			||||||
 | 
					                                             -> DResult<bool> {
 | 
				
			||||||
 | 
					        let n : i64 = self.pg_trans()?.query_one(
 | 
				
			||||||
 | 
					            "SELECT COUNT(*) FROM tasks WHERE \
 | 
				
			||||||
 | 
					             details->>'task_type' = $1 AND \
 | 
				
			||||||
 | 
					             details->>'task_code' = $2", &[&task_type, &task_code]
 | 
				
			||||||
 | 
					        ).await?.get(0);
 | 
				
			||||||
 | 
					        Ok(n > 0)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    pub async fn alloc_item_code(&self) -> DResult<i64> {
 | 
					    pub async fn alloc_item_code(&self) -> DResult<i64> {
 | 
				
			||||||
        Ok(self.pg_trans()?.query_one("SELECT NEXTVAL('item_seq')", &[]).await?.get(0))
 | 
					        Ok(self.pg_trans()?.query_one("SELECT NEXTVAL('item_seq')", &[]).await?.get(0))
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -99,6 +99,14 @@ pub async fn describe_normal_item(ctx: &VerbContext<'_>, item: &Item) -> UResult
 | 
				
			|||||||
                                                    &item.pronouns.subject),
 | 
					                                                    &item.pronouns.subject),
 | 
				
			||||||
                                                &item.pronouns.possessive));
 | 
					                                                &item.pronouns.possessive));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if ctx.trans.check_task_by_type_code("DelayedHealth",
 | 
				
			||||||
 | 
					                                       &format!("{}/{}/bandage", &item.item_type, &item.item_code)
 | 
				
			||||||
 | 
					            ).await? {
 | 
				
			||||||
 | 
					                contents_desc.push_str(&format!("{} is wrapped up in bandages.\n",
 | 
				
			||||||
 | 
					                                                &language::caps_first(&item.pronouns.subject))
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        } else if item.item_type == "possession" {
 | 
					        } else if item.item_type == "possession" {
 | 
				
			||||||
            if health_ratio == 1.0 {
 | 
					            if health_ratio == 1.0 {
 | 
				
			||||||
                contents_desc.push_str(&format!("{}'s in perfect condition.\n", &language::caps_first(&item.pronouns.subject)));
 | 
					                contents_desc.push_str(&format!("{}'s in perfect condition.\n", &language::caps_first(&item.pronouns.subject)));
 | 
				
			||||||
 | 
				
			|||||||
@ -26,6 +26,7 @@ use crate::{
 | 
				
			|||||||
        skills::skill_check_and_grind,
 | 
					        skills::skill_check_and_grind,
 | 
				
			||||||
        effect::run_effects,
 | 
					        effect::run_effects,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    language,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use async_trait::async_trait;
 | 
					use async_trait::async_trait;
 | 
				
			||||||
use std::time;
 | 
					use std::time;
 | 
				
			||||||
@ -156,17 +157,41 @@ impl QueueCommandHandler for QueueHandler {
 | 
				
			|||||||
                                   1, false),
 | 
					                                   1, false),
 | 
				
			||||||
                               target_name, target_name
 | 
					                               target_name, target_name
 | 
				
			||||||
            ))?
 | 
					            ))?
 | 
				
			||||||
        }
 | 
					            }
 | 
				
			||||||
        let use_data = match  item.possession_type.as_ref()
 | 
					        let use_data = match item.possession_type.as_ref()
 | 
				
			||||||
            .and_then(|poss_type| possession_data().get(&poss_type))
 | 
					            .and_then(|poss_type| possession_data().get(&poss_type))
 | 
				
			||||||
            .and_then(|poss_data| poss_data.use_data.as_ref()) {
 | 
					            .and_then(|poss_data| poss_data.use_data.as_ref()) {
 | 
				
			||||||
                None => user_error("You can't use that!".to_owned())?,
 | 
					                None => user_error("You can't use that!".to_owned())?,
 | 
				
			||||||
                Some(d) => d
 | 
					                Some(d) => d
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					        if let Some(charge_data) = item.possession_type.as_ref()
 | 
				
			||||||
 | 
					            .and_then(|poss_type| possession_data().get(&poss_type))
 | 
				
			||||||
 | 
					            .and_then(|poss_data| poss_data.charge_data.as_ref()) {
 | 
				
			||||||
 | 
					                if item.charges < 1 {
 | 
				
			||||||
 | 
					                    user_error(
 | 
				
			||||||
 | 
					                        format!("{} has no {} {} left",
 | 
				
			||||||
 | 
					                                item.display_for_sentence(!ctx.session_dat.less_explicit_mode,
 | 
				
			||||||
 | 
					                                                          1, true),
 | 
				
			||||||
 | 
					                                &language::pluralise(charge_data.charge_name_prefix),
 | 
				
			||||||
 | 
					                                charge_data.charge_name_suffix
 | 
				
			||||||
 | 
					                    ))?;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        if let Some(err) = (use_data.errorf)(&item, &target) {
 | 
					        if let Some(err) = (use_data.errorf)(&item, &target) {
 | 
				
			||||||
            user_error(err)?;
 | 
					            user_error(err)?;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        if ctx.trans.check_task_by_type_code(
 | 
				
			||||||
 | 
					            "DelayedHealth",
 | 
				
			||||||
 | 
					            &format!("{}/{}/{}", &target.item_type, &target.item_code,
 | 
				
			||||||
 | 
					                     use_data.task_ref)
 | 
				
			||||||
 | 
					        ).await? {
 | 
				
			||||||
 | 
					            user_error(format!("You see no reason to use {} on {}",
 | 
				
			||||||
 | 
					                               item.display_for_sentence(!ctx.session_dat.less_explicit_mode,
 | 
				
			||||||
 | 
					                                                         1, false),
 | 
				
			||||||
 | 
					                               target.display_for_sentence(!ctx.session_dat.less_explicit_mode,
 | 
				
			||||||
 | 
					                                                         1, false)
 | 
				
			||||||
 | 
					            ))?;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        let is_self_use = target_type == &"player" && target_code == &player_item.item_code;
 | 
					        let is_self_use = target_type == &"player" && target_code == &player_item.item_code;
 | 
				
			||||||
        let mut player_mut = (*player_item).clone();
 | 
					        let mut player_mut = (*player_item).clone();
 | 
				
			||||||
        let skillcheck = skill_check_and_grind(&ctx.trans, &mut player_mut,
 | 
					        let skillcheck = skill_check_and_grind(&ctx.trans, &mut player_mut,
 | 
				
			||||||
@ -188,6 +213,13 @@ impl QueueCommandHandler for QueueHandler {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        ctx.trans.save_item_model(&player_mut).await?;
 | 
					        ctx.trans.save_item_model(&player_mut).await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if item.possession_type.as_ref()
 | 
				
			||||||
 | 
					            .and_then(|poss_type| possession_data().get(&poss_type))
 | 
				
			||||||
 | 
					            .and_then(|poss_data| poss_data.charge_data.as_ref()).is_some() {
 | 
				
			||||||
 | 
					                let mut item_mut = (*item).clone();
 | 
				
			||||||
 | 
					                item_mut.charges -= 1;
 | 
				
			||||||
 | 
					                ctx.trans.save_item_model(&item_mut).await?;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        Ok(())
 | 
					        Ok(())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,4 @@
 | 
				
			|||||||
use crate::{
 | 
					use crate::{
 | 
				
			||||||
    db::DBTrans,
 | 
					 | 
				
			||||||
    models::{
 | 
					    models::{
 | 
				
			||||||
        item::Item,
 | 
					        item::Item,
 | 
				
			||||||
        task::{
 | 
					        task::{
 | 
				
			||||||
@ -28,6 +27,8 @@ use serde::{Serialize, Deserialize};
 | 
				
			|||||||
use std::collections::{BTreeMap, VecDeque};
 | 
					use std::collections::{BTreeMap, VecDeque};
 | 
				
			||||||
use chrono::Utc;
 | 
					use chrono::Utc;
 | 
				
			||||||
use log::info;
 | 
					use log::info;
 | 
				
			||||||
 | 
					use mockall_double::double;
 | 
				
			||||||
 | 
					#[double] use crate::db::DBTrans;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
 | 
					#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
 | 
				
			||||||
pub struct DelayedHealthEffect {
 | 
					pub struct DelayedHealthEffect {
 | 
				
			||||||
@ -58,6 +59,9 @@ impl TaskHandler for DelayedHealthTaskHandler {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            Some(it) => it
 | 
					            Some(it) => it
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					        if item.is_dead {
 | 
				
			||||||
 | 
					            return Ok(None);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        match item_effect_series.1.pop_front() {
 | 
					        match item_effect_series.1.pop_front() {
 | 
				
			||||||
            None => Ok(None),
 | 
					            None => Ok(None),
 | 
				
			||||||
            Some(DelayedHealthEffect { magnitude, message, message_nonexp, .. }) => {
 | 
					            Some(DelayedHealthEffect { magnitude, message, message_nonexp, .. }) => {
 | 
				
			||||||
 | 
				
			|||||||
@ -64,7 +64,7 @@ impl Default for ChargeData {
 | 
				
			|||||||
        Self {
 | 
					        Self {
 | 
				
			||||||
            max_charges: 1,
 | 
					            max_charges: 1,
 | 
				
			||||||
            charge_name_prefix: "charge",
 | 
					            charge_name_prefix: "charge",
 | 
				
			||||||
            charge_name_suffix: ""
 | 
					            charge_name_suffix: "",
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -484,6 +484,16 @@ pub fn possession_data() -> &'static BTreeMap<PossessionType, PossessionData> {
 | 
				
			|||||||
                            )
 | 
					                            )
 | 
				
			||||||
                        },
 | 
					                        },
 | 
				
			||||||
                    ),
 | 
					                    ),
 | 
				
			||||||
 | 
					                    task_ref: "bandage",
 | 
				
			||||||
 | 
					                    errorf: Box::new(
 | 
				
			||||||
 | 
					                        |_item, target|
 | 
				
			||||||
 | 
					                        if target.is_dead {
 | 
				
			||||||
 | 
					                            Some(format!("It is too late, {}'s dead", target.pronouns.subject))
 | 
				
			||||||
 | 
					                        } else if target.item_type != "player" && target.item_type != "npc" {
 | 
				
			||||||
 | 
					                            Some("It only works on animals.".to_owned())
 | 
				
			||||||
 | 
					                        } else {
 | 
				
			||||||
 | 
					                            None
 | 
				
			||||||
 | 
					                        }),
 | 
				
			||||||
                    ..Default::default()
 | 
					                    ..Default::default()
 | 
				
			||||||
                }),
 | 
					                }),
 | 
				
			||||||
                ..Default::default()
 | 
					                ..Default::default()
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user