OSP Dark Souls Reference Pack
Эта тема будет содержать все сделанные автором OSP-коды, которые добавляют в Warband некоторые "отсылки" на Dark Souls. Если автор сделает больше в будущем, они тоже будут добавлены сюда. На данный момент есть:
Простая презентация с использованием наложения прогресса в качестве здоровья босса (все еще не идеальна, поскольку у нее есть ползунок и она не заполнена даже при максимальном значении). Цель состояла в том, чтобы воссоздать только визуальный эффект, а не саму систему боссов, поэтому автор назначил для этой цели только 1 конкретного воина. Если вы собираетесь создать несколько боссов, вам придется сильно изменить этот код (учитывая сдвиг презентации, когда в бою участвует более одного босса).
Этот код идет в module_mission_templates.py
boss_agent_set = (ti_on_agent_spawn, 0, 0,
[
(store_trigger_param_1, ":agent"),
(agent_get_troop_id, ":troop", ":agent"),
(eq, ":troop", "trp_npc12"), # list of your bosses
],
[
(store_trigger_param_1, ":agent"),
(agent_set_max_hit_points, ":agent", 1000, 1), # their hp
(assign, "$boss_agent", ":agent"), # if you have more than 1 boss, global variable is not the way to go, use agent slots
(start_presentation, "prsnt_boss_hp_bar"),
])
boss_agent_death = (ti_on_agent_killed_or_wounded, 0, 0,
[
(store_trigger_param_1, ":agent"),
(agent_get_troop_id, ":troop", ":agent"),
(eq, ":troop", "trp_npc12"),
],
[
(set_fixed_point_multiplier, 100),
(tutorial_message_set_size, 20, 100),
(tutorial_message_set_background, 1),
(tutorial_message_set_position, 500, 400),
(tutorial_message, "@ H E I R O F F I R E D E S T R O Y E D", 0xFFFAEA9D, 5), # spaces are needed to centrify the text
(play_sound, "snd_quest_failed", sf_vol_15),
])
Этот код идет в module_presentations.py
("boss_hp_bar", prsntf_read_only, 0,[
(ti_on_presentation_load,
[
(set_fixed_point_multiplier, 100),
(store_agent_hit_points, ":hp", "$boss_agent", 1),
(str_store_string, s1, "@Jeremus, High Priest of Calradia"), # here you can set some fancy name for your boss
#(str_store_agent_name, s1, "$boss_agent"), # or just take real name of the agent, if it's already fancy enough
(create_progress_overlay, "$boss_hp_bar", 0, ":hp"),
(create_text_overlay, "$boss_name", s1, tf_with_outline|tf_center_justify),
(overlay_set_val, "$boss_hp_bar", ":hp"),
(overlay_set_color, "$boss_name", 0xFAFAFA),
(position_set_x, pos1, 80),
(position_set_y, pos1, 80),
(overlay_set_size, "$boss_name", pos1),
(position_set_x, pos1, 200),
(position_set_y, pos1, 70),
(overlay_set_size, "$boss_hp_bar", pos1),
(position_set_x, pos1, 50),
(position_set_y, pos1, 10),
(overlay_set_position, "$boss_hp_bar", pos1),
(position_set_x, pos1, 35),
(position_set_y, pos1, 12),
(overlay_set_position, "$boss_name", pos1),
(presentation_set_duration, 999999),
]),
(ti_on_presentation_run,
[
(store_agent_hit_points, ":hp", "$boss_agent", 1),
(overlay_set_val, "$boss_hp_bar", ":hp"),
(try_begin),
(le, ":hp", 0),
(presentation_set_duration, 0),
(try_end),
]),
]),
Результат:
Этот код позволяет сделать любую стену иллюзорной. При попадании в такую стену она издает звук и исчезает, открывая проход или обнаруживая спрятанную добычу. Вы можете использовать иллюзорные стены, чтобы сделать локации более интересными для исследования. В каждой сцене используется только 1 иллюзорная стена. Если вы хотите создать целую систему иллюзорных стен, вам следует создать больше сцен и переработать скрытый код (hiding code) в ti_on_init_scene_prop.
Этот код идет в module_scene_props.py
("z_illusory_wall",sokf_moveable|sokf_missiles_not_attached,"village_wall_a","bo_village_wall_a", [ # you can put your own mesh and collision but keep the flags
(ti_on_init_scene_prop, # this will remove wall when entering scene if it has been revealed previously
[
(store_trigger_param_1, ":instance_no"),
(store_current_scene, ":cur_scene"),
(scene_slot_eq, ":cur_scene", 739, 1), # some random number instead of name to avoid declaring
(prop_instance_is_valid, ":instance_no"),
(scene_prop_set_visibility, ":instance_no", 0),
(prop_instance_get_position, pos1, ":instance_no"),
(position_move_z, pos1, -3000, 1),
(prop_instance_set_position, ":instance_no", pos1),
(rebuild_shadow_map),
]),
(ti_on_scene_prop_hit, # fading out should start at the moment of hit, but player should see it fully, so we
# need a delay. To avoid mission triggers we just animate wall to current position with
# some timer and move the rest of the hiding code to ti_on_scene_prop_animation_finished
[
(store_trigger_param_1, ":instance_no"),
(set_fixed_point_multiplier, 100),
(prop_instance_get_position, pos1, ":instance_no"),
(copy_position, pos2, pos1),
(prop_instance_animate_to_position, ":instance_no", pos2, 100),
(scene_prop_fade_out, ":instance_no", 100),
(prop_instance_enable_physics, ":instance_no", 0),
(prop_instance_play_sound, ":instance_no", "snd_quest_failed"),
]),
(ti_on_scene_prop_animation_finished,
[
(store_trigger_param_1, ":instance_no"),
(prop_instance_is_valid, ":instance_no"),
(scene_prop_set_visibility, ":instance_no", 0),
(prop_instance_get_position, pos1, ":instance_no"),
(position_move_z, pos1, -3000, 1),
(prop_instance_set_position, ":instance_no", pos1),
(rebuild_shadow_map),
(store_current_scene, ":cur_scene"),
(neg|scene_slot_eq, ":cur_scene", 739, 1),
(scene_set_slot, ":cur_scene", 739, 1),
]),
]),
Результат:
Этот код позволит вам превратить вашего персонажа в объект сцены, чтобы гармонировать с окружающей средой. Код для одиночного режима, но там он совершенно бесполезен - ваша коллизия по-прежнему человеческая (так что вы можете получить выстрел в голову, будучи стулом), враги все еще видят вас, вам нужно закодировать множество зависимостей, чтобы стать полноценным пропсом - предметом в сцене. Однако в многопользовательском режиме это будет работать как есть, потому что вы можете обмануть человеческий глаз с помощью одной трансформации и устроить засаду другим игрокам без дополнительного программирования. Просто замените код из одиночный игры get_player_agent_no на какой-нибудь многопользовательский эквивалент, который позволит вам получить правильный референс. А может быть, как-нибудь замаскировать звуки ходьбы.
Этот код идет в module_scene_props.py
# these are just duplicates of native props with removed collision. spr_tavern_barrel fits too, but it is spawned half underground so I excluded it
("cm_apple_basket", 0, "apple_basket", "0", []),
("cm_box_a", 0, "box_a", "0", []),
("cm_chair_trunk_b", 0, "chair_trunk_b", "0", []),
("cm_chair_trunk_c", 0, "chair_trunk_c", "0", []),
("cm_chest_b", 0, "chest_b", "0", []),
("cm_cupboard_a", 0, "cupboard_a", "0", []),
("cm_dummy_a", 0, "arena_archery_target_b", "0", []),
("cm_straw_c", 0, "straw_c", "0", []),
("cm_tavern_chair_b",0,"tavern_chair_b", "0", []),
("cm_torture_tool_c", 0, "torture_tool_c", "0", []),
("cm_tripod_cauldron_b", 0, "tripod_cauldron_b", "0", []),
("cm_water_well_a", 0, "water_well_a", "0", []),
("cm_wood_heap", 0, "wood_heap_a", "0", []),
("cm_prop_end", 0, "wood_heap_a", "0", []),
Этот код идет в module_constants.py
slot_agent_is_transformed = 797
slot_agent_target_prop = 798
Этот код идет в module_mission_templates.py
chameleon_1 = (0, 2, 0, # starting transformation
[
(key_clicked, key_numpad_slash), # replace with any button you want
(get_player_agent_no, ":player"),
(neg|agent_slot_eq, ":player", slot_agent_is_transformed, 1),
(agent_set_animation, ":player", "anim_cheer", 1), # this animation lasts around 4 sec so we
# put consequences delay on 2 for it to
# interrupt it on half
],
[
(get_player_agent_no, ":player"),
(agent_set_visibility, ":player", 0),
(agent_set_slot, ":player", slot_agent_is_transformed, 1),
(agent_get_position, pos1, ":player"),
(particle_system_burst, "psys_ladder_dust_14m", pos1, 300),
(play_sound_at_position, "snd_quest_failed", pos1),
(set_spawn_position, pos1),
(store_random_in_range, ":target_prop", "spr_cm_apple_basket", "spr_cm_prop_end"),
(spawn_scene_prop, ":target_prop"),
(agent_set_slot, ":player", slot_agent_target_prop, reg0),
])
chameleon_2 = (0, 0, 0, # this moves the prop to wherever we move
[
(get_player_agent_no, ":player"),
(agent_slot_eq, ":player", slot_agent_is_transformed, 1),
],
[
(get_player_agent_no, ":player"),
(agent_get_slot, ":instance_no", ":player", slot_agent_target_prop),
(agent_get_position, pos1, ":player"),
(position_rotate_z, pos1, 180),
(prop_instance_set_position, ":instance_no", pos1),
])
chameleon_3 = (0, 0, 0, # ending transformation
[
(get_player_agent_no, ":player"),
(agent_slot_eq, ":player", slot_agent_is_transformed, 1),
(this_or_next|game_key_clicked, gk_attack), # here are listed main actions which should turn you
(this_or_next|game_key_clicked, gk_defend), # human again. gk_attack also triggers when you choose
(this_or_next|game_key_clicked, gk_jump), # a dialog answer. You may contribute to this list
(game_key_clicked, gk_kick),
],
[
(get_player_agent_no, ":player"),
(agent_set_slot, ":player", slot_agent_is_transformed, 0),
(agent_get_slot, ":instance_no", ":player", slot_agent_target_prop),
(prop_instance_get_position, pos1, ":instance_no"),
(particle_system_burst, "psys_ladder_dust_14m", pos1, 300),
(position_move_z, pos1, -3000, 1),
(prop_instance_set_position, ":instance_no", pos1),
(rebuild_shadow_map),
(agent_set_visibility, ":player", 1),
(agent_set_slot, ":player", slot_agent_target_prop, -1),
])
Результат:
Наслаждайтесь!
Родная страница
Комментариев 2
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.