Skip to content

Commit

Permalink
Merge upstream master (#203)
Browse files Browse the repository at this point in the history
## About The Pull Request

Merge upstream to master

## Why It's Good For The Game

New updates
  • Loading branch information
larentoun authored Apr 22, 2024
2 parents 9c6f511 + bb42f76 commit 2c10018
Show file tree
Hide file tree
Showing 186 changed files with 1,657 additions and 1,237 deletions.
10 changes: 10 additions & 0 deletions code/__DEFINES/ai/ai.dm
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,16 @@
///Flags for ai_behavior new()
#define AI_CONTROLLER_INCOMPATIBLE (1<<0)

//Return flags for ai_behavior/perform()
///Update this behavior's cooldown
#define AI_BEHAVIOR_DELAY (1<<0)
///Finish the behavior successfully
#define AI_BEHAVIOR_SUCCEEDED (1<<1)
///Finish the behavior unsuccessfully
#define AI_BEHAVIOR_FAILED (1<<1)

#define AI_BEHAVIOR_INSTANT (NONE)

///Does this task require movement from the AI before it can be performed?
#define AI_BEHAVIOR_REQUIRE_MOVEMENT (1<<0)
///Does this require the current_movement_target to be adjacent and in reach?
Expand Down
4 changes: 2 additions & 2 deletions code/__DEFINES/devices.dm
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
#define INSPECTOR_PRINT_SOUND_MODE_FAFAFOGGY 4
#define BANANIUM_CLOWN_INSPECTOR_PRINT_SOUND_MODE_LAST 4
#define CLOWN_INSPECTOR_PRINT_SOUND_MODE_LAST 4
#define INSPECTOR_ENERGY_USAGE_HONK (15 KILO JOULES)
#define INSPECTOR_ENERGY_USAGE_NORMAL (5 KILO JOULES)
#define INSPECTOR_ENERGY_USAGE_HONK (0.015 * STANDARD_CELL_CHARGE)
#define INSPECTOR_ENERGY_USAGE_NORMAL (0.005 * STANDARD_CELL_CHARGE)
#define INSPECTOR_TIME_MODE_SLOW 1
#define INSPECTOR_TIME_MODE_FAST 2
#define INSPECTOR_TIME_MODE_HONK 3
Expand Down
1 change: 0 additions & 1 deletion code/__DEFINES/footsteps.dm
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
#define FOOTSTEP_MOB_RUST "footstep_rust"
#define FOOTSTEP_OBJ_MACHINE "footstep_machine"
#define FOOTSTEP_OBJ_ROBOT "footstep_robot"
#define FOOTSTEP_OBJ_CYBORG_TRACK "footstep_cyborg_track"

//priority defines for the footstep_override element
#define STEP_SOUND_NO_PRIORITY 0
Expand Down
13 changes: 6 additions & 7 deletions code/__DEFINES/sound.dm
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@
// BANDASTATION ADDITION START
#define CHANNEL_TTS_RADIO 1013
// BANDASTATION EDIT END
//THIS SHOULD ALWAYS BE THE LOWEST ONE!
//KEEP IT UPDATED
#define CHANNEL_HIGHEST_AVAILABLE 1012

#define MAX_INSTRUMENT_CHANNELS (128 * 6)


///Default range of a sound.
#define SOUND_RANGE 17
Expand All @@ -26,13 +32,6 @@
///The default exponent of sound falloff
#define SOUND_FALLOFF_EXPONENT 6

//THIS SHOULD ALWAYS BE THE LOWEST ONE!
//KEEP IT UPDATED

#define CHANNEL_HIGHEST_AVAILABLE 1012 // BANDASTATION EDIT

#define MAX_INSTRUMENT_CHANNELS (128 * 6)

#define SOUND_MINIMUM_PRESSURE 10

#define INTERACTION_SOUND_RANGE_MODIFIER -3
Expand Down
2 changes: 1 addition & 1 deletion code/__DEFINES/tools.dm
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
#define TOOL_CROWBAR "crowbar"
#define TOOL_MULTITOOL "multitool"
#define TOOL_SCREWDRIVER "screwdriver"
#define TOOL_WIRECUTTER "wirecutter"
#define TOOL_WIRECUTTER "cutters"
#define TOOL_WRENCH "wrench"
#define TOOL_WELDER "welder"
#define TOOL_ANALYZER "analyzer"
Expand Down
2 changes: 2 additions & 0 deletions code/__DEFINES/vv.dm
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@

//Helpers for vv_get_dropdown()
#define VV_DROPDOWN_OPTION(href_key, name) . += "<option value='?_src_=vars;[HrefToken()];[href_key]=TRUE;target=[REF(src)]'>[name]</option>"
//Same with VV_DROPDOWN_OPTION, but global proc doesn't have src
#define VV_DROPDOWN_OPTION_APPEARANCE(thing, href_key, name) . += "<option value='?_src_=vars;[HrefToken()];[href_key]=TRUE;target=[REF(thing)]'>[name]</option>"

// VV HREF KEYS
#define VV_HK_TARGET "target"
Expand Down
20 changes: 19 additions & 1 deletion code/_onclick/ai.dm
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
ShiftClickOn(A)
return
if(LAZYACCESS(modifiers, ALT_CLICK)) // alt and alt-gr (rightalt)
A.ai_click_alt(src)
ai_base_click_alt(A)
return
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlClickOn(A)
Expand Down Expand Up @@ -121,6 +121,24 @@
target.AICtrlClick(src)


/// Reimplementation of base_click_alt for AI
/mob/living/silicon/ai/proc/ai_base_click_alt(atom/target)
// If for some reason we can't alt click
if(SEND_SIGNAL(src, COMSIG_MOB_ALTCLICKON, target) & COMSIG_MOB_CANCEL_CLICKON)
return

if(!isturf(target) && can_perform_action(target, (target.interaction_flags_click | SILENT_ADJACENCY)))
// Signal intercept
if(SEND_SIGNAL(target, COMSIG_CLICK_ALT, src) & CLICK_ACTION_ANY)
return

// AI alt click interaction succeeds
if(target.ai_click_alt(src) & CLICK_ACTION_ANY)
return

client.loot_panel.open(get_turf(target))


/*
The following criminally helpful code is just the previous code cleaned up;
I have no idea why it was in atoms.dm instead of respective files.
Expand Down
22 changes: 11 additions & 11 deletions code/_onclick/click_alt.dm
Original file line number Diff line number Diff line change
Expand Up @@ -10,32 +10,32 @@
if(SEND_SIGNAL(src, COMSIG_MOB_ALTCLICKON, target) & COMSIG_MOB_CANCEL_CLICKON)
return

// Is it visible (and we're not wearing it (our clothes are invisible))?
if(!(src in viewers(7, target)) && !CanReach(target))
return

var/turf/tile = get_turf(target)

// Ghosties just see loot
if(isobserver(src) || isrevenant(src))
open_lootpanel(tile)
client.loot_panel.open(tile)
return

// Turfs don't have a click_alt currently, so this saves some time.
if(!isturf(target) && can_perform_action(target, (target.interaction_flags_click | SILENT_ADJACENCY)))
// If it has a signal handler that returns a click action, done.
if(SEND_SIGNAL(target, COMSIG_CLICK_ALT, src) & CLICK_ACTION_ANY)
return

// If it has a custom click_alt that returns success/block, done.
if(target.click_alt(src) & CLICK_ACTION_ANY)
return

open_lootpanel(tile)


/// Helper for opening the lootpanel
/mob/proc/open_lootpanel(turf/target)
// No alt clicking to view turf from beneath
if(HAS_TRAIT(src, TRAIT_MOVE_VENTCRAWLING))
return

var/datum/lootpanel/panel = client?.loot_panel
if(isnull(panel))
return

panel.open(target)
client.loot_panel.open(tile)


/**
Expand Down
2 changes: 1 addition & 1 deletion code/datums/ai/_ai_behavior.dm
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
return TRUE

///Called by the AI controller when this action is performed
///Returns a set of flags defined in [code/__DEFINES/ai/ai.dm]
/datum/ai_behavior/proc/perform(seconds_per_tick, datum/ai_controller/controller, ...)
controller.behavior_cooldowns[src] = world.time + get_cooldown(controller)
return

///Called when the action is finished. This needs the same args as perform besides the default ones
Expand Down
24 changes: 16 additions & 8 deletions code/datums/ai/_ai_controller.dm
Original file line number Diff line number Diff line change
Expand Up @@ -359,14 +359,12 @@ multiple modular subtrees with behaviors
break

SEND_SIGNAL(src, COMSIG_AI_CONTROLLER_PICKED_BEHAVIORS, current_behaviors, planned_behaviors)
for(var/datum/ai_behavior/current_behavior as anything in current_behaviors)
if(LAZYACCESS(planned_behaviors, current_behavior))
continue
for(var/datum/ai_behavior/forgotten_behavior as anything in current_behaviors - planned_behaviors)
var/list/arguments = list(src, FALSE)
var/list/stored_arguments = behavior_args[type]
if(stored_arguments)
arguments += stored_arguments
current_behavior.finish_action(arglist(arguments))
forgotten_behavior.finish_action(arglist(arguments))

///This proc handles changing ai status, and starts/stops processing if required.
/datum/ai_controller/proc/set_ai_status(new_ai_status)
Expand All @@ -389,7 +387,7 @@ multiple modular subtrees with behaviors
paused_until = world.time + time

/datum/ai_controller/proc/modify_cooldown(datum/ai_behavior/behavior, new_cooldown)
behavior_cooldowns[behavior.type] = new_cooldown
behavior_cooldowns[behavior] = new_cooldown

///Call this to add a behavior to the stack.
/datum/ai_controller/proc/queue_behavior(behavior_type, ...)
Expand Down Expand Up @@ -419,13 +417,23 @@ multiple modular subtrees with behaviors
var/list/stored_arguments = behavior_args[behavior.type]
if(stored_arguments)
arguments += stored_arguments
behavior.perform(arglist(arguments))

var/process_flags = behavior.perform(arglist(arguments))
if(process_flags & AI_BEHAVIOR_DELAY)
behavior_cooldowns[behavior] = world.time + behavior.get_cooldown(src)
if(process_flags & AI_BEHAVIOR_FAILED)
arguments[1] = src
arguments[2] = FALSE
behavior.finish_action(arglist(arguments))
else if (process_flags & AI_BEHAVIOR_SUCCEEDED)
arguments[1] = src
arguments[2] = TRUE
behavior.finish_action(arglist(arguments))

/datum/ai_controller/proc/CancelActions()
if(!LAZYLEN(current_behaviors))
return
for(var/i in current_behaviors)
var/datum/ai_behavior/current_behavior = i
for(var/datum/ai_behavior/current_behavior as anything in current_behaviors)
var/list/arguments = list(src, FALSE)
var/list/stored_arguments = behavior_args[current_behavior.type]
if(stored_arguments)
Expand Down
10 changes: 5 additions & 5 deletions code/datums/ai/_item_behaviors.dm
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
/datum/ai_behavior/item_escape_grasp

/datum/ai_behavior/item_escape_grasp/perform(seconds_per_tick, datum/ai_controller/controller)
. = ..()
var/obj/item/item_pawn = controller.pawn
var/mob/item_holder = item_pawn.loc
if(!istype(item_holder))
finish_action(controller, FALSE) //We're no longer being held. abort abort!!
//We're no longer being held. abort abort!!
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
item_pawn.visible_message(span_warning("[item_pawn] slips out of the hands of [item_holder]!"))
item_holder.dropItemToGround(item_pawn, TRUE)
finish_action(controller, TRUE)
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED


///This behavior is for obj/items, it is used to move closer to a target and throw themselves towards them.
Expand All @@ -30,7 +30,6 @@
set_movement_target(controller, target)

/datum/ai_behavior/item_move_close_and_attack/perform(seconds_per_tick, datum/ai_controller/controller, target_key, throw_count_key)
. = ..()
var/obj/item/item_pawn = controller.pawn
var/atom/throw_target = controller.blackboard[target_key]

Expand All @@ -39,7 +38,8 @@
playsound(item_pawn.loc, attack_sound, 100, TRUE)
controller.add_blackboard_key(throw_count_key, 1)
if(controller.blackboard[throw_count_key] >= max_attempts)
finish_action(controller, TRUE, target_key, throw_count_key)
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
return AI_BEHAVIOR_DELAY

/datum/ai_behavior/item_move_close_and_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, throw_count_key)
. = ..()
Expand Down
18 changes: 6 additions & 12 deletions code/datums/ai/babies/babies_behaviors.dm
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
var/max_children = 3

/datum/ai_behavior/find_partner/perform(seconds_per_tick, datum/ai_controller/controller, target_key, partner_types_key, child_types_key)
. = ..()
max_children = controller.blackboard[BB_MAX_CHILDREN] || max_children
var/mob/pawn_mob = controller.pawn
var/list/partner_types = controller.blackboard[partner_types_key]
Expand All @@ -18,12 +17,10 @@
var/children = 0
for(var/mob/living/other in oview(range, pawn_mob))
if(!pawn_mob.faction_check_atom(other))
finish_action(controller, FALSE)
return
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED

if(children >= max_children)
finish_action(controller, FALSE)
return
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED

if(other.stat != CONSCIOUS) //Check if it's conscious FIRST.
continue
Expand All @@ -40,10 +37,9 @@

if(other.gender != living_pawn.gender && !(other.flags_1 & HOLOGRAM_1)) //Better safe than sorry ;_;
controller.set_blackboard_key(target_key, other)
finish_action(controller, TRUE)

finish_action(controller, FALSE)
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED

return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED

/**
* Reproduce.
Expand All @@ -59,15 +55,13 @@
set_movement_target(controller, target)

/datum/ai_behavior/make_babies/perform(seconds_per_tick, datum/ai_controller/controller, target_key, child_types_key)
. = ..()
var/mob/target = controller.blackboard[target_key]
if(QDELETED(target) || target.stat != CONSCIOUS)
finish_action(controller, FALSE, target_key)
return
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
var/mob/living/basic/living_pawn = controller.pawn
living_pawn.set_combat_mode(FALSE)
living_pawn.melee_attack(target)
finish_action(controller, TRUE, target_key)
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED

/datum/ai_behavior/make_babies/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
Expand Down
18 changes: 8 additions & 10 deletions code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,15 @@
if (isliving(controller.pawn))
var/mob/living/pawn = controller.pawn
if (world.time < pawn.next_move)
return
return AI_BEHAVIOR_INSTANT

. = ..()
var/mob/living/basic/basic_mob = controller.pawn
//targeting strategy will kill the action if not real anymore
var/atom/target = controller.blackboard[target_key]
var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])

if(!targeting_strategy.can_attack(basic_mob, target))
finish_action(controller, FALSE, target_key)
return
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED

var/hiding_target = targeting_strategy.find_hidden_mobs(basic_mob, target) //If this is valid, theyre hidden in something!

Expand All @@ -43,7 +41,8 @@
basic_mob.melee_attack(target)

if(terminate_after_action)
finish_action(controller, TRUE, target_key)
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
return AI_BEHAVIOR_DELAY

/datum/ai_behavior/basic_melee_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key)
. = ..()
Expand Down Expand Up @@ -82,22 +81,21 @@
var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])

if(!targeting_strategy.can_attack(basic_mob, target, chase_range))
finish_action(controller, FALSE, target_key)
return
return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED

var/atom/hiding_target = targeting_strategy.find_hidden_mobs(basic_mob, target) //If this is valid, theyre hidden in something!
var/atom/final_target = hiding_target ? hiding_target : target

if(!can_see(basic_mob, final_target, required_distance))
return
return AI_BEHAVIOR_INSTANT

if(avoid_friendly_fire && check_friendly_in_path(basic_mob, target, targeting_strategy))
adjust_position(basic_mob, target)
return ..()
return AI_BEHAVIOR_DELAY

controller.set_blackboard_key(hiding_location_key, hiding_target)
basic_mob.RangedAttack(final_target)
return ..() //only start the cooldown when the shot is shot
return AI_BEHAVIOR_DELAY //only start the cooldown when the shot is shot

/datum/ai_behavior/basic_ranged_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key)
. = ..()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,17 @@
/datum/ai_behavior/befriend_target

/datum/ai_behavior/befriend_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key, befriend_message)
. = ..()
var/mob/living/living_pawn = controller.pawn
var/mob/living/living_target = controller.blackboard[target_key]
if(QDELETED(living_target))
finish_action(controller, FALSE, target_key)
return
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED

living_pawn.befriend(living_target)
var/befriend_text = controller.blackboard[befriend_message]
if(befriend_text)
to_chat(living_target, span_nicegreen("[living_pawn] [befriend_text]"))

finish_action(controller, TRUE, target_key)
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED

/datum/ai_behavior/befriend_target/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
Expand Down
Loading

0 comments on commit 2c10018

Please sign in to comment.