bool Game_Battler::UseSkill(int skill_id) { const RPG::Skill& skill = Data::skills[skill_id - 1]; switch (skill.type) { case RPG::Skill::Type_normal: { int effect = skill.power; if (skill.variance > 0) { int var_perc = skill.variance * 5; int act_perc = rand() % (var_perc * 2) - var_perc; int change = effect * act_perc / 100; effect += change; } if (skill.affect_hp) { ChangeHp(effect); } if (skill.affect_sp) { SetSp(GetSp() + effect); } // ToDo return true; } case RPG::Skill::Type_teleport: case RPG::Skill::Type_escape: // ToDo: Show Teleport/Escape target menu break; case RPG::Skill::Type_switch: Game_Switches[skill.switch_id] = true; break; } return false; }
int cN2Prov0501::ProcessBx(unsigned char *data, int len, int pos) { if(data[pos-1]!=0xBC) { PRINTF(L_SYS_EMU,"%04X: bad nano %02X for ROM 120",id,data[pos-1]); return -1; } if(pos!=(0x93-0x80)) { // maybe exploitable PRINTF(L_SYS_EMU,"%04X: refuse to execute from %04x",id,0x80+pos); return -1; } if(Init(id,120)) { SetMem(0x80,data,len); SetPc(0x80+pos); SetSp(0x0FFF,0x0FE0); Set(0x0001,0xFF); Set(0x000E,0xFF); Set(0x0000,0x04); ClearBreakpoints(); AddBreakpoint(0x821f); AddBreakpoint(0x0000); AddRomCallbacks(); while(!Run(hasMaprom ? 20000:5000)) { if(GetPc()==0x821f) { GetMem(0x80,data,len); return a; } else if(GetPc()==0x0000) break; else if(!RomCallbacks()) break; } } return -1; }
/* ** PSF driver main() replacement */ int psfdrv(void) { unsigned long seq_size = *((unsigned long *)MY_SEQ); /* ** Initialize and startup stuff */ SetSp(0x800C58E4); SpuInit(); minit(); /* ** Load sound file for instrument set */ mopen_file(MY_INSTR); /* ** Load sound file for sequence */ if (seq_size != 0) { /* this call should always execute mopenplay_seq, since I modified mopen_file a lot */ mopen_file(MY_SEQ); mplay_seq(MY_SEQ, 0x1200); } else { die(); } /* ** Loop a while. */ loopforever(); return 0; }
void Game_Actor::SetLevel(int _level) { GetData().level = min(max(_level, 1), GetMaxLevel()); // Ensure current HP/SP remain clamped if new Max HP/SP is less. SetHp(GetHp()); SetSp(GetSp()); }
void Game_Actor::Init() { const std::vector<RPG::Learning>& skills = Data::actors[data.ID - 1].skills; for (int i = 0; i < (int) skills.size(); i++) if (skills[i].level <= GetLevel()) LearnSkill(skills[i].skill_id); SetHp(GetMaxHp()); SetSp(GetMaxSp()); SetExp(exp_list[GetLevel() - 1]); }
void Game_Actor::Init() { const std::vector<RPG::Learning>& skills = GetActor().skills; for (int i = 0; i < (int)skills.size(); i++) { if (skills[i].level <= GetLevel()) { LearnSkill(skills[i].skill_id); } } RemoveInvalidData(); if (GetLevel() > 0) { SetHp(GetMaxHp()); SetSp(GetMaxSp()); SetExp(exp_list[GetLevel() - 1]); } AddEquipmentStates(); }
int cN2Prov0501::RunEmu(unsigned char *data, int len, unsigned short load, unsigned short run, unsigned short stop, unsigned short fetch, int fetch_len) { if(Init(id,120)) { SetSp(0x0FFF,0x0EF8); SetMem(load,data,len); SetPc(run); ClearBreakpoints(); AddBreakpoint(stop); if(stop!=0x0000) AddBreakpoint(0x0000); AddRomCallbacks(); while(!Run(100000)) { if(GetPc()==0x0000 || GetPc()==stop) { GetMem(fetch,data,fetch_len); return 1; } else if(!RomCallbacks()) break; } } return -1; }
bool Game_Battler::UseItem(int item_id) { const RPG::Item& item = Data::items[item_id - 1]; if (item.type == RPG::Item::Type_medicine) { int hp_change = item.recover_hp_rate * GetMaxHp() / 100 + item.recover_hp; int sp_change = item.recover_sp_rate * GetMaxSp() / 100 + item.recover_sp; if (IsDead()) { // Check if item can revive if (item.state_set.empty() || !item.state_set[0]) { return false; } // Revive gives at least 1 Hp if (hp_change == 0) { ChangeHp(1); } } else if (item.ko_only) { // Must be dead return false; } ChangeHp(hp_change); SetSp(GetSp() + sp_change); for (std::vector<bool>::const_iterator it = item.state_set.begin(); it != item.state_set.end(); ++it) { if (*it) { RemoveState(*it); } } // TODO return true; } else if (item.type == RPG::Item::Type_material) { // TODO return false; } return false; }
// --------------------------------------------------------------------------- void TfrMaterialSquare::SetParams() { TfrMaterialLength::SetParams(); SetSp(); }
void Game_Actor::SetBaseMaxSp(int maxsp) { data.sp_mod += maxsp - GetBaseMaxSp(); SetSp(data.current_sp); }
void Game_Battler::ChangeSp(int sp) { SetSp(GetSp() + sp); }
void Game_Actor::SetBaseMaxSp(int maxsp) { int new_sp_mod = GetData().sp_mod + (maxsp - GetBaseMaxSp()); GetData().sp_mod = new_sp_mod; SetSp(GetData().current_sp); }