/*

Static Books mod for Fallout 2 by NovaRain
------------------------------------------

- changes vanilla skill books to increase skills by a fixed amount
- reading a book gives +5% to a skill (+6% if tagged), +8% with the Comprehension perk
- books can still increase skills when over 91%

Requires sfall 3.5 or higher

*/

#include "..\headers\define.h"
#include "..\headers\command.h"
#include "..\headers\sfall\sfall.h"

#define BOOK_BONUS    (5)

procedure start;
procedure useobj_handler;

procedure start begin
   if game_loaded then begin
      register_hook_proc(HOOK_USEOBJ, useobj_handler);
   end
end

procedure useobj_handler begin
   variable
      user  := get_sfall_arg,
      obj   := get_sfall_arg,
      skill := -1,
      bonus := BOOK_BONUS,
      msg, skLevel;

   if (obj_item_subtype(obj) == item_type_misc_item) then begin
      switch obj_pid(obj) begin
      case PID_BIG_BOOK_OF_SCIENCE:
         skill := SKILL_SCIENCE;
         msg := 802;
      case PID_DEANS_ELECTRONICS:
         skill := SKILL_REPAIR;
         msg := 803;
      case PID_FIRST_AID_BOOK:
         skill := SKILL_FIRST_AID;
         msg := 804;
      case PID_SCOUT_HANDBOOK:
         skill := SKILL_OUTDOORSMAN;
         msg := 806;
      case PID_GUNS_AND_BULLETS:
         skill := SKILL_SMALL_GUNS;
         msg := 805;
      end

      // read book
      if (skill != -1) then begin
         if combat_is_initialized then begin
            display_msg(mstr_proto(902));
            set_sfall_return(0);
            return;
         end

         skLevel := has_skill(dude_obj, skill);
         if (dude_perk(PERK_comprehension_perk)) then begin
            bonus := (bonus * 3 + 1) / 2; // +50%, rounding up
         end
         if (bonus % 2) then begin
            bonus += is_skill_tagged(skill); // adjustment for tagged skill when the bonus is an odd number
         end
         critter_mod_skill(dude_obj, skill, bonus);
         gfade_out(1);
         game_time_advance(ONE_GAME_HOUR * (11 - dude_iq));
         exec_map_update_scripts;
         gfade_in(1);
         display_msg(mstr_proto(800));
         if (has_skill(dude_obj, skill) == skLevel) then begin
            msg := 801;
         end
         display_msg(mstr_proto(msg));
         set_sfall_return(1); // remove
      end
   end
end
