/*

Static Books mod for Fallout 2 by NovaRain
------------------------------------------

- changes skill books to increase skills by a fixed amount
- books can still increase skills when it's over 91%

*/

#include ".\headers\define.h"
#include ".\headers\command.h"
#include ".\headers\sfall\sfall.h"

procedure start;
procedure UseObjHandler;
procedure UpSkill(variable skill);

procedure UpSkill(variable skill) begin
   variable
      bonus,
      skLevel;

   if (skill == -1) then return "";

   skLevel := has_skill(dude_obj, skill);
   bonus := round((300 - skLevel) * (dude_iq + dude_perception) / 1200);
   if (has_trait(TRAIT_PERK,dude_obj, PERK_comprehension_perk)) then begin
      bonus := round(bonus * 1.5); // +50%
   end
   if (is_skill_tagged(skill)) then begin
      bonus *= 2; // adjustment for tagged skill, bonus is being doubled
   end
   critter_mod_skill(dude_obj, skill, bonus);
   return message_str_game(GAME_MSG_SKILL, skill + 100) + " " + bonus;
end

procedure UseObjHandler begin
   variable
      user  := get_sfall_arg,
      obj   := get_sfall_arg,
      skill1 := -1, skill2 := -1, skill3 := -1, skill4 := -1, skill5 := -1, skill6 := -1,
      msg;

   if (obj_item_subtype(obj) == item_type_misc_item) then begin
      switch obj_pid(obj) begin
      case PID_BIG_BOOK_OF_SCIENCE:
         skill1 := SKILL_LOCKPICK;
         skill2 := SKILL_TRAPS;
         skill3 := SKILL_SCIENCE;
         skill4 := SKILL_CONVERSANT;
         skill5 := SKILL_BARTER;
         skill6 := SKILL_GAMBLING;
      case PID_DEANS_ELECTRONICS:
         skill1 := SKILL_LOCKPICK;
         skill2 := SKILL_TRAPS;
         skill3 := SKILL_REPAIR;
      case PID_FIRST_AID_BOOK:
         skill1 := SKILL_FIRST_AID;
         skill2 := SKILL_DOCTOR;
         skill3 := SKILL_UNARMED_COMBAT;
      case PID_SCOUT_HANDBOOK:
         skill1 := SKILL_OUTDOORSMAN;
         skill2 := SKILL_TRAPS;
         skill3 := SKILL_SNEAK;
         skill4 := SKILL_STEAL;
         skill5 := SKILL_LOCKPICK;
      case PID_GUNS_AND_BULLETS:
         skill1 := SKILL_SMALL_GUNS;
         skill2 := SKILL_BIG_GUNS;
         skill3 := SKILL_ENERGY_WEAPONS;
         skill4 := SKILL_MELEE;
         skill5 := SKILL_THROWING;
         skill6 := SKILL_UNARMED_COMBAT;
      end

      if (skill1 != -1) then begin //that means right book is applied, skill1 is not -1 then
         if combat_is_initialized then begin
            display_msg(mstr_proto(902));
            set_sfall_return(0);
            return;
         end

         msg := "You've gained skill points: " + UpSkill(skill1) + ", " + UpSkill(skill2) + ", " + UpSkill(skill3);
         if (skill4 != -1) then msg := msg + ", " + UpSkill(skill4);
         if (skill5 != -1) then msg := msg + ", " + UpSkill(skill5);
         if (skill6 != -1) then msg := msg + ", " + UpSkill(skill6);
         msg  := msg + ".";

         // read book
         display_msg(mstr_proto(800));
         display_msg(msg);
         gfade_out(1);
         game_time_advance(ONE_GAME_HOUR * (11 - dude_iq));
         exec_map_update_scripts;
         gfade_in(1);
         set_sfall_return(1); // remove book
      end
   end
end

procedure start begin
   if game_loaded then begin
      register_hook_proc(HOOK_USEOBJ, UseObjHandler);
   end
end
