Bank error

Users who are viewing this thread

Keedo420

Knight at Arms
Along with Garnier's recruitment script, I have added his banks into my mod. However I am having a problem with them.
At the start of a new game (before doing anything at all) I go straight to the reports menu and select bank report, and this is what I see:


Then, after going to a town with a bank, I visit the bank and this is what I see:


Now, since there are only 5 banks and each one says I only have about 1k borrowed, there is still an incredibly large debt coming from somewhere. As a result, when the trigger to pay interest fires, this happens (NOTE: this one happened after only a few game hours just like the trigger for paying your troops sometimes does even though they are set to fire on a weekly basis):


And then again after a full week and having earned some more money.....


I've got these in module_constants:
slot_town_trade_route_11          = 200
slot_town_trade_route_12          = 201
slot_town_trade_route_13          = 202
slot_town_trade_route_14          = 203
slot_town_trade_route_15          = 204
slot_town_trade_routes_begin = slot_town_trade_route_1
slot_town_trade_routes_end = slot_town_trade_route_15 + 1


num_trade_goods = itm_siege_supply - itm_smoked_fish
slot_town_trade_good_productions_begin      = 205
slot_town_trade_good_prices_begin            = slot_town_trade_good_productions_begin + num_trade_goods + 1
slot_center_slave_labor          = 206

slot_town_has_bank        = 239
slot_town_bank_debt        = 240
slot_town_bank_deposit        = 241
slot_town_bank_debt_interest_rate        = 242
slot_town_bank_deposit_interest_rate        = 243

These in module_simple_triggers:
##############################################
############## GARNIERMOD BEGIN ##############
##############################################
  #Interest on deposits.
  (730,
  [
(try_for_range, ":center_no", towns_begin, towns_end),
(party_get_slot,":deposit",":center_no",slot_town_bank_deposit),
(party_get_slot,":deposit_interest_rate",":center_no",slot_town_bank_deposit_interest_rate),
(store_mul, ":deposit_interest",":deposit",":deposit_interest_rate"),
(val_div, ":deposit_interest",1000),
(val_add, ":deposit",":deposit_interest"),
(party_set_slot,":center_no", slot_town_bank_deposit,":deposit"),
  (try_end),
    ]),

  #Interest on debts.
  (24 * 7,
  [
(assign, ":total_bank_debt",0),
(try_for_range, ":center_no", towns_begin, towns_end),
(party_get_slot,":debt",":center_no",slot_town_bank_debt),
(val_add, ":total_bank_debt",":debt"),
(try_end),
    (try_begin),
      (gt, ":total_bank_debt", 0),
      (jump_to_menu,"mnu_debt_interest"),
    (try_end),
    ]),

This in the game_start part of module_scripts:
#only put banks in capitals
  (try_for_range, ":center_no", towns_begin, towns_end),
(this_or_next|eq,":center_no","p_town_1"),
(this_or_next|eq,":center_no","p_town_5"),
(this_or_next|eq,":center_no","p_town_6"),
(this_or_next|eq,":center_no","p_town_8"),
(eq,":center_no","p_town_10"),
(party_set_slot,":center_no", slot_town_has_bank,0),
  (else_try),
(party_set_slot,":center_no", slot_town_has_bank,1),
  (try_end),
 
  (try_for_range, ":center_no", towns_begin, towns_end),
(party_set_slot,":center_no", slot_town_bank_deposit_interest_rate,1),
(party_set_slot,":center_no", slot_town_bank_debt_interest_rate,400),
  (try_end),

And this additional script in module_scripts:
#Bank store debts/deposits
  ("bank_update_business",
    [
(party_set_slot,"$current_town",slot_town_bank_debt,"$g_player_debt"),
(party_set_slot,"$current_town",slot_town_bank_deposit,"$g_player_deposit"),
]),

This added to the reports menu in module_game_menus:
      ("view_bank_report",[],"View bank report.",
      [(jump_to_menu, "mnu_bank_report"),
        ]
      ),

This added to the town menu in module_game_menus:
      ("town_bank",
      [   
    (this_or_next|eq,"$current_town","p_town_1"),
    (this_or_next|eq,"$current_town","p_town_5"),
    (this_or_next|eq,"$current_town","p_town_6"),
    (this_or_next|eq,"$current_town","p_town_8"),
    (eq,"$current_town","p_town_10"),
      ],
      "Visit the bank.",
      [
          (jump_to_menu,"mnu_bank"),
        ]),

And these menus in module_game_menus:
  ("bank_report",0,
  "{s1}  {s2}",
  "none",
    [
  (assign, reg1,0),#total_debt
          (assign, reg2,0),#weekly_debt_interest
          (assign, reg3,0),#total_deposit
          (assign, reg4,0),#monthly_deposit_interest

(try_for_range, ":center_no", towns_begin, towns_end),
(party_get_slot,":debt",":center_no",slot_town_bank_debt),
(val_add,reg1,":debt"),
(party_get_slot,":debt_interest_rate",":center_no",slot_town_bank_debt_interest_rate),
(store_div, ":debt_interest",":debt",52),
(val_mul, ":debt_interest",":debt_interest_rate"),
(val_div, ":debt_interest",100),
(val_add,reg2,":debt_interest"),
(try_end),

(try_for_range, ":center_no", towns_begin, towns_end),
(party_get_slot,":deposit",":center_no",slot_town_bank_deposit),
(val_add, reg3, ":deposit"),
(party_get_slot,":deposit_interest_rate",":center_no",slot_town_bank_deposit_interest_rate),
(assign, ":deposit_interest", ":deposit"),
(val_mul, ":deposit_interest",":deposit_interest_rate"),
(val_div, ":deposit_interest",1000),
(val_add, reg4, ":deposit_interest"),
(try_end),

  (try_begin),
    (gt, reg1,0),
            (str_store_string, s1, "@You have a total debt of {reg1} denars, on which you pay a weekly interest of {reg2} denars."),
          (else_try),
    (lt, reg1,1),
            (str_store_string, s1, "@You have no debts at this time."),
  (try_end),
  (try_begin),
    (gt, reg3,0),
            (str_store_string, s2, "@You have a total of {reg3} denars deposited in banks, on which you gain a monthly interest of {reg4} denars."),
          (else_try),
    (lt, reg3,1),
            (str_store_string, s2, "@You have no money deposited in banks."),
  (try_end),
    ],
    [
      ("continue",[],"Continue...",
      [(jump_to_menu, "mnu_reports"),
        ]
      ),
      ]
  ),

  (
    "debt_interest",mnf_scale_picture|mnf_disable_all_keys,
    "{s2}",
    "none",
    [
(str_clear,s2),
(assign, ":total_bank_debt",0),
(try_for_range, ":center_no", towns_begin, towns_end),
(party_get_slot,":debt",":center_no",slot_town_bank_debt),
(val_add, ":total_bank_debt",":debt"),
(try_end),
    (store_troop_gold, ":player_wealth", "trp_player"),

          (assign, reg1,0),#total_debt
          (val_add, reg1,":total_bank_debt"),
          (assign, reg2,0),#expected_interest
          (assign, reg3,0),#total_cash
          (val_add, reg3,":player_wealth"),
          (assign, reg4,0),#debt_interest_paid
          (assign, reg5,0),#debt_interest_unpaid
 
 
(try_for_range, ":center_no", towns_begin, towns_end),
(party_get_slot,":debt",":center_no",slot_town_bank_debt),
(party_get_slot,":debt_interest_rate",":center_no",slot_town_bank_debt_interest_rate),
(store_div, ":debt_interest",":debt",52),
(val_mul, ":debt_interest",":debt_interest_rate"),
(val_div, ":debt_interest",100),
(val_add,reg2,":debt_interest"),
  (try_begin),
            (ge, ":player_wealth", ":debt_interest"),
            (troop_remove_gold, "trp_player",":debt_interest"),
            (val_add, reg4,":debt_interest"),
      (else_try),
(gt, ":debt_interest",":player_wealth"),
(gt, ":player_wealth",0),
(store_sub, ":unpaid_interest", ":debt_interest",":player_wealth"),
            (troop_remove_gold, "trp_player",":player_wealth"),
            (val_add, reg4,":player_wealth"),
            (val_add, ":debt",":unpaid_interest"),
            (val_add, reg5,":unpaid_interest"),
      (else_try),
(gt, ":debt",0),
(eq, ":player_wealth",0),
(store_sub, ":unpaid_interest", ":debt_interest",":player_wealth"),
            (val_add, ":debt",":unpaid_interest"),
            (val_add, reg5,":unpaid_interest"),
  (try_end),
(try_end),
  (party_set_slot,":center_no",slot_town_bank_debt,":debt"),
          (store_troop_gold, ":player_wealth", "trp_player"),
          (assign, reg6,":player_wealth"),#cash_remaining

  (try_begin),
    (gt, reg4,0),
    (gt, reg3,reg2),
            (str_store_string, s2, "@You paid {reg4} of your {reg3} denars in interest on your debt. You have {reg6} denars left."),
          (else_try),
    (gt, reg4,0),
    (ge, reg3,reg2),
            (str_store_string, s2, "@You paid all of your {reg3} denars in interest on your debt. You are out of money."),
          (else_try),
    (lt, reg6,1),
    (gt, reg5,0),
            (str_store_string, s2, "@You paid all of your {reg3} denars in interest on your debt.  There were still {reg5} denars of the interest unpaid, which has been added to your debt.  You have 0 denars left."),
          (else_try),
    (lt, reg3,1),
            (str_store_string, s2, "@You had 0 denars left to pay the interest on your debt.  The interest of {reg2} denars has been added to your debt."),
  (try_end),
    ],
    [
      ("continue",[],"Continue...",
      [
        (change_screen_return,0),
        ]
      ),
    ]
  ),
 

  (
  "bank",0,
    "You visit the bank of {s1}.\
Here you can deposit money and earn interest over time, or take a loan.\
You currently have {reg6} denars deposited here.\
You currently have {reg7} denars borrowed from this bank.",
    "none",
    [
(str_store_party_name,s1,"$current_town"),
    (party_get_slot,"$g_player_debt","$current_town",slot_town_bank_debt),
    (party_get_slot,"$g_player_deposit","$current_town",slot_town_bank_deposit),
    (assign, reg6, "$g_player_deposit"),
    (assign, reg7, "$g_player_debt"),
    ],
    [
      ("take_loan",[(store_troop_gold, ":player_wealth", "trp_player"),(store_sub, ":player_real_wealth", ":player_wealth", "$g_player_debt"),(gt,":player_real_wealth",100)],"Take a loan of 1000 denars.",
      [
  (troop_remove_gold, "trp_player", 100),
          (troop_add_gold, "trp_player", 1000),
          (val_add, "$g_player_debt", 1000),
      (call_script, "script_bank_update_business"),
        ]),
      ("give_loan",[(store_troop_gold, ":player_wealth", "trp_player"),(gt,":player_wealth",1000),(gt,"$g_player_debt",1000)],"Repay 1000 denars of your debt.",
      [
  (troop_remove_gold, "trp_player", 1000),
          (val_sub, "$g_player_debt", 1000),
      (call_script, "script_bank_update_business"),
        ]),
      ("give_loan_all",[(store_troop_gold, ":player_wealth", "trp_player"),(gt,":player_wealth","$g_player_debt"),(gt,"$g_player_debt",0)],"Repay all of your debt.",
      [
  (troop_remove_gold, "trp_player", "$g_player_debt"),
          (val_sub, "$g_player_debt", "$g_player_debt"),
      (call_script, "script_bank_update_business"),
        ]),
      ("give_deposit",[(store_troop_gold, ":player_wealth", "trp_player"),(gt,":player_wealth",1000)],"Deposit 1000 denars in the bank.",
      [
  (troop_remove_gold, "trp_player", 1000),
          (val_add, "$g_player_deposit", 1000),
      (call_script, "script_bank_update_business"),
        ]),
      ("take_deposit",[(ge,"$g_player_deposit",1000)],"Withdraw 1000 denars from your deposit.",
      [
  (troop_add_gold, "trp_player", 1000),
          (val_sub, "$g_player_deposit", 1000),
      (call_script, "script_bank_update_business"),
        ]),
      ("take_deposit_all",[(ge,"$g_player_deposit",1)],"Withdraw your entire deposit.",
      [
  (troop_add_gold, "trp_player", reg6),
          (val_sub, "$g_player_deposit", reg6),
      (call_script, "script_bank_update_business"),
        ]),
      ("back_to_town_menu",[],"Head back.",
      [
          (jump_to_menu,"mnu_town"),
        ]),
    ]),

Now as far as I can tell, none of the new town slots conflict with other town slots, so I am guessing it is related to the registers. But they all seem to be set to 0 before interest on debts or deposits is calculated. I have played garnier's mod and it plays with no errors, so the problem must be a conflict with something in my mod or something I missed while porting the code. I just can't seem to figure out what it is. :sad:
 
Are you sure the slot nrs aren't accidentally conflicting with other new nrs you added? doesn't seem like it from the code you posted but just make sure you're not setting them somewhere else already. From your screenshot, it would seem that this is what's happening if you start the game with 24k deposited and debt. Another pointer to this is that the debts per bank don't add up to the total debt. If the slot is already being used, then it will get set even for towns that don't have a bank. When the report retrieves the total debt, it counts those towns as well, since it just iterates over all of them, and then of course since those towns don't actually have a bank, you can never go in and repay said debt.

Basically if you didn't change anything, it should work. I implemented this for SWC the other day, although I pretty much rewrote the whole code in the end to make it work differently.

There's no real magic here.. it's basic use of slots and global vars. like you say, there could be a problem with persistant numbers in the regs but if those get reset, there shouldn't be, really and that still doesn't explain the big debt. The only thing that does, is slots.
 
OK, problem solved! Apparently the issue was with slot_town_trade_good_productions_begin....
num_trade_goods = itm_siege_supply - itm_smoked_fish
slot_town_trade_good_productions_begin      = 255
slot_town_trade_good_prices_begin            = slot_town_trade_good_productions_begin + num_trade_goods + 1
slot_center_slave_labor          = 206

slot_town_has_bank        = 239
slot_town_bank_debt        = 240
slot_town_bank_deposit        = 241
slot_town_bank_debt_interest_rate        = 242
slot_town_bank_deposit_interest_rate        = 243
This is normally set at 205. In Garnier's mod, it is set at 255. I had chosen not to change it because I thought it was related to something else in his mod that I wasn't incorporating into mine. After changing it to 255 in mine, the player no longer has debt or money deposited at the start of a new game.
 
Back
Top Bottom