本帖最后由 wei1786 于 2023-4-9 16:18 编辑  
 
基本逻辑是切换武器时,把不能用的弹药类型存储起来,然后弹药量设为0,等使用这件武器时再把弹药信息拿出来。 
 
 
记得好像有在中文站见过,找了半天没找着,就自己试着写了下。 
 
 
其实现在还没写完,现在打开背包时弹药还不会恢复,虽然不影响补弹药但总归是不好看,发这个贴子也是想问问怎么以打开背包为触发条件。 
 
代码部分: 
slot: 
 
slot_agent_weapon_1              = 30 
slot_agent_weapon_2              = 31 
slot_agent_weapon_3              = 32 
slot_agent_weapon_4              = 33 
slot_agent_weapon_num_1              = 34 
slot_agent_weapon_num_2              = 35 
slot_agent_weapon_num_3              = 36 
slot_agent_weapon_num_4              = 37 
slot_agent_last_weild_weapon         = 38 
slot_agent_ammo_changed_1            = 39 
slot_agent_ammo_changed_2            = 40 
slot_agent_ammo_changed_3            = 41 
slot_agent_ammo_changed_4            = 42 
 
两个战场触发器,我目前火器只有两种类型,所以直接判断,类型比较多的话可以用slot存储一下弹药类型。 
 
第一个是在开始时记录一下弹药量和拿着的武器。 
火枪什么的在开始时会在弹夹里有额外弹药,要是把系统搞得比较复杂的话这个应该也要初始化一下。 
 
common_init_item_slot = ( 
  ti_on_agent_spawn,0,ti_once, 
  [], 
  [ 
    (store_trigger_param_1, ":agent_no"), 
    (agent_set_slot,":agent_no",slot_agent_defeat_enemy_num,0),#just add there 
    (agent_set_slot,":agent_no",slot_agent_last_weild_weapon,-1), 
    (try_for_range,":inv_no",0,4), 
      (agent_get_item_slot,":cur_item",":agent_no",":inv_no"), 
      (gt,":cur_item",0), 
      (item_get_type,":cur_item_type",":cur_item"), 
      (eq,":cur_item_type",itp_type_bullets), 
      (agent_get_item_cur_ammo,":ammo",":agent_no",":inv_no"), 
      (store_add,":slot_weapon",slot_agent_weapon_1,":inv_no"), 
      (store_add,":slot_weapon_ammo",slot_agent_weapon_num_1,":inv_no"), 
      (store_add,":slot_weapon_changed",slot_agent_ammo_changed_1,":inv_no"), 
      (agent_set_slot,":agent_no",":slot_weapon",":cur_item"), 
      (agent_set_slot,":agent_no",":slot_weapon_ammo",":ammo"), 
      (agent_set_slot,":agent_no",":slot_weapon_changed",0),#not change 
    (try_end), 
  ] 
) 
更换武器时,更新弹药 
我这里itm_heavy_muscket1,itm_heavy_muscket2和itm_cartridges1匹配 
其他火器和itm_cartridges对应 
common_init_item_in_battle = (#libwe 
  0,0,0, 
  [], 
  [ 
    (try_for_agents,":agent_no"), 
      (agent_get_troop_id,":troop_no",":agent_no"), 
      (troop_is_hero,":troop_no"), 
       
      # (agent_get_item_cur_ammo,":ammo",":agent_no",1), 
      # (assign,reg1,":ammo"), 
      # (display_message,"@{reg1}"), 
      (agent_get_wielded_item,":item_no",":agent_no",0), 
      (agent_get_slot,":last_weild",":agent_no",slot_agent_last_weild_weapon), 
 
      (neq,":last_weild",":item_no"),#if change weapon, continue 
       
      (agent_set_slot,":agent_no",slot_agent_last_weild_weapon,":item_no"), 
      (gt, ":item_no", 0), 
      (item_get_type,":item_type",":item_no"), 
      (this_or_next|eq,":item_type",itp_type_pistol), 
      (eq,":item_type",itp_type_musket), 
       
      (try_begin), 
        (display_message,"@weapon"), 
        (this_or_next|eq,":item_no","itm_heavy_muscket1"),#heavey pistol 
        (eq,":item_no","itm_heavy_muscket2"), 
 
        (try_for_range,":inv_no",0,4), 
          (agent_get_item_slot,":cur_item",":agent_no",":inv_no"), 
 
          (store_add,":slot_weapon",slot_agent_weapon_1,":inv_no"), 
          (store_add,":slot_weapon_ammo",slot_agent_weapon_num_1,":inv_no"), 
          (store_add,":slot_weapon_changed",slot_agent_ammo_changed_1,":inv_no"), 
 
          (try_begin), 
            (gt,":cur_item",0), 
          (else_try), 
            (agent_get_slot,":cur_item",":agent_no",":slot_weapon"), 
          (try_end), 
          (gt,":cur_item",0), 
          (item_get_type,":cur_item_type",":cur_item"), 
          (eq,":cur_item_type",itp_type_bullets), 
 
          (try_begin), 
            (eq,":cur_item","itm_cartridges1"), 
            (agent_get_slot,":is_changed",":agent_no",":slot_weapon_changed"), 
            (eq,":is_changed",1), 
            # (agent_get_slot,":item_no",":agent_no",":slot_weapon"), 
            # (eq,":cur_item",":item_no"), 
            (agent_get_slot,":ammo",":agent_no",":slot_weapon_ammo"), 
            # (agent_set_ammo,":agent_no",":item_no",":ammo"), 
            (store_add,":weapon_slot",":inv_no",1), 
            (agent_equip_item,":agent_no",":cur_item",":weapon_slot"), 
            (agent_set_ammo,":agent_no",":cur_item",":ammo"), 
            (agent_set_slot,":agent_no",":slot_weapon_changed",0), 
            (agent_set_slot,":agent_no",":slot_weapon",-1), 
          (else_try), 
            (eq,":cur_item","itm_cartridges"), 
            (agent_get_item_cur_ammo,":ammo",":agent_no",":inv_no"), 
            (agent_set_slot,":agent_no",":slot_weapon",":cur_item"), 
            (agent_set_slot,":agent_no",":slot_weapon_ammo",":ammo"), 
            # (agent_set_ammo,":agent_no",":cur_item",0), 
            (store_add,":weapon_slot",":inv_no",1), 
            (agent_unequip_item,":agent_no",":cur_item",":weapon_slot"), 
            (agent_set_slot,":agent_no",":slot_weapon_changed",1), 
          (try_end), 
        (try_end), 
 
      (else_try),#other pistol 
        (try_for_range,":inv_no",0,4), 
          (agent_get_item_slot,":cur_item",":agent_no",":inv_no"), 
           
          (store_add,":slot_weapon",slot_agent_weapon_1,":inv_no"), 
          (store_add,":slot_weapon_ammo",slot_agent_weapon_num_1,":inv_no"), 
          (store_add,":slot_weapon_changed",slot_agent_ammo_changed_1,":inv_no"), 
 
          (try_begin), 
            (gt,":cur_item",0), 
          (else_try), 
            (agent_get_slot,":cur_item",":agent_no",":slot_weapon"), 
          (try_end), 
          (gt,":cur_item",0), 
          (item_get_type,":cur_item_type",":cur_item"), 
          (eq,":cur_item_type",itp_type_bullets), 
 
          (try_begin), 
            (eq,":cur_item","itm_cartridges1"), 
            (agent_get_item_cur_ammo,":ammo",":agent_no",":inv_no"), 
            (agent_set_slot,":agent_no",":slot_weapon",":cur_item"), 
            (agent_set_slot,":agent_no",":slot_weapon_ammo",":ammo"), 
            # (agent_set_ammo,":agent_no",":cur_item",0), 
            (store_add,":weapon_slot",":inv_no",1), 
            (agent_unequip_item,":agent_no",":cur_item",":weapon_slot"), 
            (agent_set_slot,":agent_no",":slot_weapon_changed",1), 
          (else_try), 
            (eq,":cur_item","itm_cartridges"), 
            (agent_get_slot,":is_changed",":agent_no",":slot_weapon_changed"), 
            (eq,":is_changed",1), 
            # (agent_get_slot,":item_no",":agent_no",":slot_weapon"), 
            # (eq,":item_no",":cur_item"), 
            (agent_get_slot,":ammo",":agent_no",":slot_weapon_ammo"), 
            (store_add,":weapon_slot",":inv_no",1), 
            (agent_equip_item,":agent_no",":cur_item",":weapon_slot"), 
            (agent_set_ammo,":agent_no",":cur_item",":ammo"), 
            # (agent_set_ammo,":agent_no",":item_no",":ammo"), 
            (agent_set_slot,":agent_no",":slot_weapon_changed",0), 
            (agent_set_slot,":agent_no",":slot_weapon",-1), 
          (try_end), 
        (try_end), 
 
      (try_end), 
 
    (try_end), 
 
顺便问一下,把武器和弹药伤害设置成0的话好像还是会有一点点伤害,还是会加熟练度,有什么办法让伤害彻底为0吗? 
武器的伤害和速度等如果设置为0的话是不会显示信息的,我在想能不能把一些武器的各种属性完全在战场触发器里面定义,然后通过给物品加额外信息和触发器仿造出一些新的伤害类型。 
 
 
解决不了问题就解决出问题的东西,直接把箱子给删了然后允许按i呼出物品栏 
 
common_open_inv_refill_ammmo = ( 
  ti_inventory_key_pressed, 0, 0,  
      [(set_trigger_result,1)],#must open inv 
      [  
        (get_player_agent_no, ":agent_no"), 
        (try_for_range,":inv_no",0,4), 
          (agent_get_item_slot,":cur_item",":agent_no",":inv_no"), 
 
          (store_add,":slot_weapon",slot_agent_weapon_1,":inv_no"), 
          (store_add,":slot_weapon_ammo",slot_agent_weapon_num_1,":inv_no"), 
          (store_add,":slot_weapon_changed",slot_agent_ammo_changed_1,":inv_no"), 
 
          (le,":cur_item",0), 
          (agent_get_slot,":cur_item",":agent_no",":slot_weapon"), 
          (gt,":cur_item",0), 
 
          (item_get_type,":cur_item_type",":cur_item"), 
          (eq,":cur_item_type",itp_type_bullets), 
          (agent_get_ammo_for_slot,":cur_ammo",":agent_no",":inv_no"), 
          (eq,":cur_ammo",0), 
          (agent_get_slot,":is_changed",":agent_no",":slot_weapon_changed"), 
          (eq,":is_changed",1), 
          # (agent_get_slot,":item_no",":agent_no",":slot_weapon"), 
          # (eq,":item_no",":cur_item"), 
          (agent_get_slot,":ammo",":agent_no",":slot_weapon_ammo"), 
          # (agent_set_ammo,":agent_no",":item_no",":ammo"), 
          (store_add,":weapon_slot",":inv_no",1), 
          (agent_equip_item,":agent_no",":cur_item",":weapon_slot"), 
          (agent_set_ammo,":agent_no",":cur_item",":ammo"), 
          (agent_set_slot,":agent_no",":slot_weapon",-1), 
          (agent_set_slot,":agent_no",":slot_weapon_changed",0), 
          (agent_set_slot,":agent_no",slot_agent_last_weild_weapon,-1), 
        (try_end), 
      ]) 
删箱子直接把随机场景的scene_prop文件删了,然后加上(来自rubik的战前选择场景大小) 
(0, 0, ti_once, [], [(assign,"$g_battle_won",0), 
                          ## CC 
                           (try_begin), 
 
                            (try_begin), 
 
                           # banner 
                             (troop_get_slot, ":troop_banner_object", "trp_player", slot_troop_banner_scene_prop), 
                             (try_begin), 
                               (gt, ":troop_banner_object", 0), 
                               # banner pole 
                               (position_move_y, pos1, -200), 
                               (position_set_z_to_ground_level, pos1), 
                               (set_spawn_position, pos1), 
                               (spawn_scene_prop, "spr_banner_pole", 0), 
                               # banner 
                               (position_move_z, pos1, 320), 
                               (set_spawn_position, pos1), 
                               (spawn_scene_prop, ":troop_banner_object", 0), 
                             (try_end), 
                           (try_end), 
                          ## CC 
                           (assign,"$defender_reinforcement_stage",0), 
                           (assign,"$attacker_reinforcement_stage",0), 
                           (call_script, "script_place_player_banner_near_inventory"), 
                           (call_script, "script_combat_music_set_situation_with_culture"), 
                           (assign, "$g_defender_reinforcement_limit", 2), 
                           ]), 
 
有个bug,如果武器类型中有可以单手使用,且只有这一件武器,关闭背包后会自动使用这个武器。 
而不知道出于什么原因我的代码对这个时候掏出的武器无效。。。 
 
2023.4.9更新了一下,之前是把弹药设为0,现在是直接移除,不会让普通手枪弹夹里的弹药变成什么乱七八糟的东西了,不过还是有瑕疵就是。 
我是懒得记录弹药的前缀了,现在应该是会自动清理前缀,想改的话参考记录武器加slot吧。 
 
 |