From 7eaef36e11dfdbbaccf303f7e307fdb2daec6131 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Wed, 3 Jan 2024 22:42:03 -0300 Subject: [PATCH 1/9] d k daunkey kaung --- code/__DEFINES/_click.dm | 2 + code/__DEFINES/dcs/signals.dm | 12 - code/__DEFINES/dcs/signals/signals_action.dm | 6 + .../signals_atom/signals_atom_mouse.dm | 25 + code/__DEFINES/hud.dm | 231 +++++++- code/__DEFINES/maths.dm | 2 + code/__DEFINES/misc.dm | 4 - code/__HELPERS/screen_objs.dm | 91 ++++ code/__HELPERS/view.dm | 18 +- code/_onclick/drag_drop.dm | 36 +- code/_onclick/hud/_defines.dm | 195 ------- code/_onclick/hud/action_button.dm | 509 ++++++++++++------ code/_onclick/hud/hud.dm | 341 +++++++++++- code/_onclick/hud/movable_screen_objects.dm | 41 +- code/_onclick/hud/screentip.dm | 2 +- code/controllers/subsystem/augury.dm | 6 +- code/datums/action.dm | 315 +++++++---- code/datums/brain_damage/imaginary_friend.dm | 2 +- code/datums/mind.dm | 2 +- code/datums/view.dm | 54 +- code/game/objects/items.dm | 2 +- code/game/objects/items/defib.dm | 2 +- code/game/objects/items/devices/flashlight.dm | 2 +- code/game/objects/items/granters.dm | 8 +- .../objects/items/robot/robot_upgrades.dm | 2 +- code/game/objects/items/tanks/jetpack.dm | 2 +- code/game/objects/structures/manned_turret.dm | 2 +- .../abductor/equipment/abduction_gear.dm | 2 +- .../bloodsucker/bloodsucker_life.dm | 4 +- .../bloodsucker/bloodsucker_powers.dm | 116 ++-- .../bloodsucker/bloodsucker_sunlight.dm | 8 +- .../antagonists/bloodsucker/bloodsucker_ui.dm | 2 +- .../bloodsucker/datum_bloodsucker.dm | 18 +- .../antagonists/bloodsucker/datum_hunter.dm | 10 +- .../antagonists/bloodsucker/datum_vassal.dm | 2 +- .../antagonists/bloodsucker/powers/brawn.dm | 18 +- .../antagonists/bloodsucker/powers/cloak.dm | 12 +- .../antagonists/bloodsucker/powers/feed.dm | 20 +- .../bloodsucker/powers/fortitude.dm | 10 +- .../antagonists/bloodsucker/powers/go_home.dm | 10 +- .../antagonists/bloodsucker/powers/haste.dm | 16 +- .../antagonists/bloodsucker/powers/lunge.dm | 16 +- .../bloodsucker/powers/masquerade.dm | 12 +- .../bloodsucker/powers/mesmerize.dm | 18 +- .../bloodsucker/powers/recuperate.dm | 10 +- .../bloodsucker/powers/trespass.dm | 14 +- .../antagonists/bloodsucker/powers/veil.dm | 16 +- .../changeling/cellular_emporium.dm | 1 - .../changeling/powers/fakedeath.dm | 4 +- .../clockcult/clock_items/clockwork_slab.dm | 2 +- code/modules/antagonists/cult/blood_magic.dm | 45 +- code/modules/antagonists/cult/cult_items.dm | 3 +- .../revenant/revenant_abilities.dm | 2 +- .../traitor/equipment/Malf_Modules.dm | 28 +- code/modules/client/client_defines.dm | 15 +- code/modules/client/client_procs.dm | 17 +- code/modules/client/preferences.dm | 5 - code/modules/client/preferences_savefile.dm | 3 - code/modules/clothing/chameleon.dm | 14 +- code/modules/clothing/clothing.dm | 2 +- .../clothing/glasses/engine_goggles.dm | 2 +- code/modules/clothing/head/helmet.dm | 2 +- code/modules/clothing/masks/gasmask.dm | 6 +- code/modules/clothing/masks/miscellaneous.dm | 4 +- code/modules/clothing/shoes/magboots.dm | 2 +- .../modules/clothing/spacesuits/chronosuit.dm | 4 +- code/modules/clothing/spacesuits/hardsuit.dm | 4 +- code/modules/clothing/suits/toggles.dm | 2 +- code/modules/keybindings/keybind/mob.dm | 2 +- .../carbon/alien/humanoid/alien_powers.dm | 4 +- .../carbon/human/innate_abilities/blobform.dm | 6 +- .../carbon/human/species_types/golems.dm | 6 +- .../carbon/human/species_types/jellypeople.dm | 10 +- code/modules/mob/living/living.dm | 2 +- .../modules/mob/living/living_active_parry.dm | 2 +- .../mob/living/simple_animal/constructs.dm | 21 +- .../simple_animal/hostile/bosses/boss.dm | 2 +- .../simple_animal/hostile/giant_spider.dm | 6 +- .../hostile/mining_mobs/elites/elite.dm | 37 +- code/modules/power/singularity/emitter.dm | 4 +- code/modules/projectiles/gun.dm | 6 +- .../projectiles/guns/misc/beam_rifle.dm | 8 +- code/modules/projectiles/projectile.dm | 8 +- code/modules/spells/spell.dm | 12 +- code/modules/spells/spell_types/aimed.dm | 2 +- .../spells/spell_types/pointed/pointed.dm | 2 +- code/modules/spells/spell_types/taeclowndo.dm | 2 +- .../spells/spell_types/touch_attacks.dm | 2 +- code/modules/surgery/dental_implant.dm | 9 +- code/modules/tooltip/tooltip.dm | 4 +- code/modules/tooltip/tooltip.html | 30 +- code/modules/vehicles/mecha/combat/durand.dm | 2 +- code/modules/vehicles/mecha/mecha_actions.dm | 18 +- icons/effects/mouse_pointers/screen_drag.dmi | Bin 0 -> 326 bytes icons/hud/64x16_actions.dmi | Bin 0 -> 3404 bytes icons/mob/screen_ai.dmi | Bin 2543 -> 6401 bytes icons/mob/screen_alien.dmi | Bin 17751 -> 18617 bytes icons/mob/screen_clockwork.dmi | Bin 15985 -> 17293 bytes icons/mob/screen_cyborg.dmi | Bin 30735 -> 31567 bytes icons/mob/screen_gen.dmi | Bin 122121 -> 123214 bytes icons/mob/screen_midnight.dmi | Bin 25366 -> 26389 bytes icons/mob/screen_operative.dmi | Bin 28168 -> 29033 bytes icons/mob/screen_plasmafire.dmi | Bin 27392 -> 28383 bytes icons/mob/screen_retro.dmi | Bin 11978 -> 12699 bytes icons/mob/screen_slimecore.dmi | Bin 25917 -> 26982 bytes tgstation.dme | 5 +- 106 files changed, 1687 insertions(+), 940 deletions(-) create mode 100644 code/__DEFINES/_click.dm create mode 100644 code/__DEFINES/dcs/signals/signals_action.dm create mode 100644 code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm create mode 100644 code/__HELPERS/screen_objs.dm delete mode 100644 code/_onclick/hud/_defines.dm create mode 100644 icons/effects/mouse_pointers/screen_drag.dmi create mode 100644 icons/hud/64x16_actions.dmi diff --git a/code/__DEFINES/_click.dm b/code/__DEFINES/_click.dm new file mode 100644 index 000000000000..4118fb873d32 --- /dev/null +++ b/code/__DEFINES/_click.dm @@ -0,0 +1,2 @@ +//The button used for dragging (only sent for unrelated mouse up/down messages during a drag) +#define DRAG "drag" diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 4477c8aee89f..6b9fc0d6ba2e 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -196,18 +196,6 @@ #define COMSIG_ENTER_AREA "enter_area" //from base of area/Entered(): (/area) #define COMSIG_EXIT_AREA "exit_area" //from base of area/Exited(): (/area) -#define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params, mob/user) -#define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob), return flags also used by other signals. - #define COMPONENT_ALLOW_EXAMINATE 1 - #define COMPONENT_DENY_EXAMINATE 2 //Higher priority compared to the above one - -#define COMSIG_CLICK_CTRL "ctrl_click" //from base of atom/CtrlClickOn(): (/mob) -#define COMSIG_CLICK_ALT "alt_click" //from base of atom/AltClick(): (/mob) -#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //from base of atom/CtrlShiftClick(/mob) -#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" //from base of atom/MouseDrop(): (/atom/over, /mob/user) - #define COMPONENT_NO_MOUSEDROP 1 -#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //from base of atom/MouseDrop_T: (/atom/from, /mob/user) - // /area signals #define COMSIG_AREA_ENTERED "area_entered" //from base of area/Entered(): (atom/movable/M) #define COMSIG_AREA_EXITED "area_exited" //from base of area/Exited(): (atom/movable/M) diff --git a/code/__DEFINES/dcs/signals/signals_action.dm b/code/__DEFINES/dcs/signals/signals_action.dm new file mode 100644 index 000000000000..62eccf282397 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_action.dm @@ -0,0 +1,6 @@ +/// From base of /datum/action/cooldown/proc/PreActivate(), sent to the action owner: (datum/action/cooldown/activated) +#define COMSIG_MOB_ABILITY_STARTED "mob_ability_base_started" + /// Return to block the ability from starting / activating + #define COMPONENT_BLOCK_ABILITY_START (1<<0) +/// From base of /datum/action/cooldown/proc/PreActivate(), sent to the action owner: (datum/action/cooldown/finished) +#define COMSIG_MOB_ABILITY_FINISHED "mob_ability_base_finished" diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm new file mode 100644 index 000000000000..2b0c9c297e76 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm @@ -0,0 +1,25 @@ +// mouse signals. Format: +// When the signal is called: (signal arguments) +// All signals send the source datum of the signal as the first argument + +///from base of client/Click(): (atom/target, atom/location, control, params, mob/user) +#define COMSIG_CLIENT_CLICK "atom_client_click" +///from base of atom/Click(): (atom/location, control, params, mob/user) +#define COMSIG_CLICK "atom_click" +///from base of atom/ShiftClick(): (/mob) +#define COMSIG_CLICK_SHIFT "shift_click" + /// Allows the user to examinate regardless of client.eye. + #define COMPONENT_ALLOW_EXAMINATE (1<<0) + /// Higher priority compared to the above one + #define COMPONENT_DENY_EXAMINATE (1<<1) +///from base of atom/CtrlClickOn(): (/mob) +#define COMSIG_CLICK_CTRL "ctrl_click" +///from base of atom/AltClick(): (/mob) +#define COMSIG_CLICK_ALT "alt_click" +///from base of atom/CtrlShiftClick(/mob) +#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" +///from base of atom/MouseDrop(): (/atom/over, /mob/user) +#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" + #define COMPONENT_NO_MOUSEDROP (1<<0) +///from base of atom/MouseDrop_T: (/atom/from, /mob/user) +#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //from base of atom/MouseDrop_T: (/atom/from, /mob/user) diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 88cba1c449c6..94755e3bd28f 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -1,9 +1,232 @@ //HUD styles. Index order defines how they are cycled in F12. -#define HUD_STYLE_STANDARD 1 //Standard hud -#define HUD_STYLE_REDUCED 2 //Reduced hud (just hands and intent switcher) -#define HUD_STYLE_NOHUD 3 //No hud (for screenshots) +/// Standard hud +#define HUD_STYLE_STANDARD 1 +/// Reduced hud (just hands and intent switcher) +#define HUD_STYLE_REDUCED 2 +/// No hud (for screenshots) +#define HUD_STYLE_NOHUD 3 -#define HUD_VERSIONS 3 //Used in show_hud(); Please ensure this is the same as the maximum index. +/// Used in show_hud(); Please ensure this is the same as the maximum index. +#define HUD_VERSIONS 3 +// Consider these images/atoms as part of the UI/HUD (apart of the appearance_flags) +/// Used for progress bars and chat messages +#define APPEARANCE_UI_IGNORE_ALPHA (RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|RESET_ALPHA|PIXEL_SCALE) +/// Used for HUD objects +#define APPEARANCE_UI (RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|PIXEL_SCALE) + +/* + These defines specificy screen locations. For more information, see the byond documentation on the screen_loc var. + + The short version: + + Everything is encoded as strings because apparently that's how Byond rolls. + + "1,1" is the bottom left square of the user's screen. This aligns perfectly with the turf grid. + "1:2,3:4" is the square (1,3) with pixel offsets (+2, +4); slightly right and slightly above the turf grid. + Pixel offsets are used so you don't perfectly hide the turf under them, that would be crappy. + + In addition, the keywords NORTH, SOUTH, EAST, WEST and CENTER can be used to represent their respective + screen borders. NORTH-1, for example, is the row just below the upper edge. Useful if you want your + UI to scale with screen size. + + The size of the user's screen is defined by client.view (indirectly by world.view), in our case "15x15". + Therefore, the top right corner (except during admin shenanigans) is at "15,15" +*/ + +/proc/ui_hand_position(i) //values based on old hand ui positions (CENTER:-/+16,SOUTH:5) + var/x_off = -(!(i % 2)) + var/y_off = round((i-1) / 2) + return"CENTER+[x_off]:16,SOUTH+[y_off]:5" + +/proc/ui_equip_position(mob/M) + var/y_off = round((M.held_items.len-1) / 2) //values based on old equip ui position (CENTER: +/-16,SOUTH+1:5) + return "CENTER:-16,SOUTH+[y_off+1]:5" + +/proc/ui_swaphand_position(mob/M, which = 1) //values based on old swaphand ui positions (CENTER: +/-16,SOUTH+1:5) + var/x_off = which == 1 ? -1 : 0 + var/y_off = round((M.held_items.len-1) / 2) + return "CENTER+[x_off]:16,SOUTH+[y_off+1]:5" + +//Lower left, persistent menu +#define ui_inventory "WEST:6,SOUTH:5" + +//Middle left indicators +#define ui_lingchemdisplay "WEST,CENTER-1:15" +#define ui_lingstingdisplay "WEST:6,CENTER-3:11" + +#define ui_devilsouldisplay "WEST:6,CENTER-1:15" + +//Lower center, persistent menu +#define ui_sstore1 "CENTER-5:10,SOUTH:5" +#define ui_id "CENTER-4:12,SOUTH:5" +#define ui_belt "CENTER-3:14,SOUTH:5" +#define ui_back "CENTER-2:14,SOUTH:5" +#define ui_storage1 "CENTER+1:18,SOUTH:5" +#define ui_storage2 "CENTER+2:20,SOUTH:5" +#define ui_combo "CENTER+4:24,SOUTH+1:7" // combo meter for martial arts + +//Lower right, persistent menu +#define ui_drop_throw "EAST-1:28,SOUTH+1:7" +#define ui_pull_resist "EAST-2:26,SOUTH+1:7" +#define ui_movi "EAST-2:26,SOUTH:5" +#define ui_sprintbufferloc "EAST-2:26,SOUTH:18" +#define ui_acti "EAST-3:24,SOUTH:5" +#define ui_zonesel "EAST-1:28,SOUTH:5" +#define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12) +#define ui_crafting "EAST-5:20,SOUTH:5"//CIT CHANGE - moves this over one tile to accommodate for combat mode toggle +#define ui_building "EAST-5:20,SOUTH:21"//CIT CHANGE - ditto +#define ui_language_menu "EAST-5:4,SOUTH:21"//CIT CHANGE - ditto +#define ui_voremode "EAST-5:20,SOUTH:5" + +//Upper-middle right (alerts) +#define ui_alert1 "EAST-1:28,CENTER+5:27" +#define ui_alert2 "EAST-1:28,CENTER+4:25" +#define ui_alert3 "EAST-1:28,CENTER+3:23" +#define ui_alert4 "EAST-1:28,CENTER+2:21" +#define ui_alert5 "EAST-1:28,CENTER+1:19" + +//Upper left (action buttons) +#define ui_action_palette "WEST+0:23,NORTH-1:5" +#define ui_action_palette_offset(north_offset) ("WEST+0:23,NORTH-[1+north_offset]:5") + +#define ui_palette_scroll "WEST+1:8,NORTH-6:28" +#define ui_palette_scroll_offset(north_offset) ("WEST+1:8,NORTH-[6+north_offset]:28") + +//Middle right (status indicators) +#define ui_healthdoll "EAST-1:28,CENTER-2:13" +#define ui_health "EAST-1:28,CENTER-1:15" +#define ui_internal "EAST-1:28,CENTER+1:19"//CIT CHANGE - moves internal icon up a little bit to accommodate for the stamina meter +#define ui_mood "EAST-1:28,CENTER-3:10" +// #define ui_spacesuit "EAST-1:28,CENTER-4:10" + +//Pop-up inventory +#define ui_shoes "WEST+1:8,SOUTH:5" +#define ui_iclothing "WEST:6,SOUTH+1:7" +#define ui_oclothing "WEST+1:8,SOUTH+1:7" +#define ui_gloves "WEST+2:10,SOUTH+1:7" +#define ui_glasses "WEST:6,SOUTH+3:11" +#define ui_mask "WEST+1:8,SOUTH+2:9" +#define ui_ears "WEST+2:10,SOUTH+2:9" +#define ui_neck "WEST:6,SOUTH+2:9" +#define ui_head "WEST+1:8,SOUTH+3:11" + +//Generic living +#define ui_living_pull "EAST-1:28,CENTER-2:15" +#define ui_living_health "EAST-1:28,CENTER:15" +#define ui_living_healthdoll "EAST-1:28,CENTER-1:15" + +//Monkeys +#define ui_monkey_head "CENTER-5:13,SOUTH:5" +#define ui_monkey_mask "CENTER-4:14,SOUTH:5" +#define ui_monkey_neck "CENTER-3:15,SOUTH:5" +#define ui_monkey_back "CENTER-2:16,SOUTH:5" + +//Drones +#define ui_drone_drop "CENTER+1:18,SOUTH:5" +#define ui_drone_pull "CENTER+2:2,SOUTH:5" +#define ui_drone_storage "CENTER-2:14,SOUTH:5" +#define ui_drone_head "CENTER-3:14,SOUTH:5" + +//Cyborgs +#define ui_borg_health "EAST-1:28,CENTER-1:15" +#define ui_borg_pull "EAST-2:26,SOUTH+1:7" +#define ui_borg_radio "EAST-1:28,SOUTH+1:7" +#define ui_borg_intents "EAST-2:26,SOUTH:5" +#define ui_borg_lamp "CENTER-3:16, SOUTH:5" +#define ui_borg_tablet "CENTER-4:16, SOUTH:5" +#define ui_inv1 "CENTER-2:16,SOUTH:5" +#define ui_inv2 "CENTER-1 :16,SOUTH:5" +#define ui_inv3 "CENTER :16,SOUTH:5" +#define ui_borg_module "CENTER+1:16,SOUTH:5" +#define ui_borg_store "CENTER+2:16,SOUTH:5" +#define ui_borg_camera "CENTER+3:21,SOUTH:5" +#define ui_borg_alerts "CENTER+4:21,SOUTH:5" +#define ui_borg_language_menu "CENTER+4:21,SOUTH+1:5" #define ui_borg_pda_send "CENTER+5:21,SOUTH:5" // To the right of the alert panel #define ui_borg_pda_log "CENTER+6:21,SOUTH:5" +#define ui_borg_sensor "CENTER-6:16, SOUTH:5" //LEGACY +#define ui_borg_thrusters "CENTER-5:16, SOUTH:5" //LEGACY + +//Aliens +#define ui_alien_health "EAST,CENTER-1:15" +#define ui_alienplasmadisplay "EAST,CENTER-2:15" +#define ui_alien_queen_finder "EAST,CENTER-3:15" +#define ui_alien_storage_r "CENTER+1:18,SOUTH:5" +#define ui_alien_language_menu "EAST-3:26,SOUTH:5" + +//Constructs +#define ui_construct_pull "EAST,CENTER-2:15" +#define ui_construct_health "EAST,CENTER:15" + +//AI +#define ui_ai_core "BOTTOM:6,RIGHT-4" +#define ui_ai_shuttle "BOTTOM:6,RIGHT-3" +#define ui_ai_announcement "BOTTOM:6,RIGHT-2" +#define ui_ai_state_laws "BOTTOM:6,RIGHT-1" +#define ui_ai_pda_log "BOTTOM:6,RIGHT" +#define ui_ai_pda_send "BOTTOM+1:6,RIGHT" +#define ui_ai_language_menu "BOTTOM+1:8,RIGHT-2:30" + +#define ui_ai_crew_monitor "BOTTOM:6,CENTER-1" +#define ui_ai_crew_manifest "BOTTOM:6,CENTER" +#define ui_ai_alerts "BOTTOM:6,CENTER+1" + +#define ui_ai_view_images "BOTTOM:6,LEFT+4" +#define ui_ai_camera_list "BOTTOM:6,LEFT+3" +#define ui_ai_track_with_camera "BOTTOM:6,LEFT+2" +#define ui_ai_camera_light "BOTTOM:6,LEFT+1" +#define ui_ai_sensor "BOTTOM:6,LEFT" +#define ui_ai_multicam "BOTTOM+1:6,LEFT+1" +#define ui_ai_add_multicam "BOTTOM+1:6,LEFT" +#define ui_ai_take_picture "BOTTOM+2:6,LEFT" + + +// pAI +// #define ui_pai_software "SOUTH:6,WEST" +// #define ui_pai_shell "SOUTH:6,WEST+1" +// #define ui_pai_chassis "SOUTH:6,WEST+2" +// #define ui_pai_rest "SOUTH:6,WEST+3" +// #define ui_pai_light "SOUTH:6,WEST+4" +// #define ui_pai_newscaster "SOUTH:6,WEST+5" +// #define ui_pai_host_monitor "SOUTH:6,WEST+6" +// #define ui_pai_crew_manifest "SOUTH:6,WEST+7" +// #define ui_pai_state_laws "SOUTH:6,WEST+8" +// #define ui_pai_pda_send "SOUTH:6,WEST+9" +// #define ui_pai_pda_log "SOUTH:6,WEST+10" +// #define ui_pai_take_picture "SOUTH:6,WEST+12" +// #define ui_pai_view_images "SOUTH:6,WEST+13" + +//Ghosts +#define ui_ghost_jumptomob "SOUTH:6,CENTER-3:24" +#define ui_ghost_orbit "SOUTH:6,CENTER-2:24" +#define ui_ghost_reenter_corpse "SOUTH:6,CENTER-1:24" +#define ui_ghost_teleport "SOUTH:6,CENTER:24" +#define ui_ghost_pai "SOUTH: 6, CENTER+1:24" +#define ui_ghost_mafia "SOUTH: 6, CENTER+2:24" +#define ui_ghost_spawners "SOUTH: 6, CENTER+1:24" // LEGACY. SAME LOC AS PAI + +//UI position overrides for 1:1 screen layout. (default is 7:5) +#define ui_stamina "EAST-1:28,CENTER:17" // replacing internals button +#define ui_overridden_resist "EAST-3:24,SOUTH+1:7" +#define ui_clickdelay "CENTER,SOUTH+1:-31" +#define ui_resistdelay "EAST-3:24,SOUTH+1:4" +#define ui_combat_toggle "EAST-4:22,SOUTH:5" + +#define ui_boxcraft "EAST-4:22,SOUTH+1:6" +#define ui_boxarea "EAST-4:6,SOUTH+1:6" +#define ui_boxlang "EAST-5:22,SOUTH+1:6" +#define ui_boxvore "EAST-5:22,SOUTH+1:6" + +#define ui_wanted_lvl "NORTH,11" + +// Defines relating to action button positions + +/// Whatever the base action datum thinks is best +#define SCRN_OBJ_DEFAULT "default" +/// Floating somewhere on the hud, not in any predefined place +#define SCRN_OBJ_FLOATING "floating" +/// In the list of buttons stored at the top of the screen +#define SCRN_OBJ_IN_LIST "list" +/// In the collapseable palette +#define SCRN_OBJ_IN_PALETTE "palette" diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index 60d02c1e49a1..01a295634f10 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -30,6 +30,8 @@ #define CEILING(x, y) ( -round(-(x) / (y)) * (y) ) +#define ROUND_UP(x) ( -round(-(x))) + // round() acts like floor(x, 1) by default but can't handle other values #define FLOOR(x, y) ( round((x) / (y)) * (y) ) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 4165b1cec3f1..da01956e641a 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -304,10 +304,6 @@ GLOBAL_LIST_INIT(pda_reskins, list( */ -// Consider these images/atoms as part of the UI/HUD -#define APPEARANCE_UI_IGNORE_ALPHA (RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|RESET_ALPHA|PIXEL_SCALE) -#define APPEARANCE_UI (RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|PIXEL_SCALE) - //Just space #define SPACE_ICON_STATE "[((x + y) ^ ~(x * y) + z) % 25]" diff --git a/code/__HELPERS/screen_objs.dm b/code/__HELPERS/screen_objs.dm new file mode 100644 index 000000000000..aa86b6d57956 --- /dev/null +++ b/code/__HELPERS/screen_objs.dm @@ -0,0 +1,91 @@ +/// Takes a screen loc string in the format +/// "+-left-offset:+-pixel,+-bottom-offset:+-pixel" +/// Where the :pixel is optional, and returns +/// A list in the format (x_offset, y_offset) +/// We require context to get info out of screen locs that contain relative info, so NORTH, SOUTH, etc +/proc/screen_loc_to_offset(screen_loc, view) + if(!screen_loc) + return list(64, 64) + var/list/view_size = view_to_pixels(view) + var/x = 0 + var/y = 0 + // Time to parse for directional relative offsets + if(findtext(screen_loc, "EAST")) // If you're starting from the east, we start from the east too + x += view_size[1] + if(findtext(screen_loc, "WEST")) // HHHHHHHHHHHHHHHHHHHHHH WEST is technically a 1 tile offset from the start. Shoot me please + x += world.icon_size + if(findtext(screen_loc, "NORTH")) + y += view_size[2] + if(findtext(screen_loc, "SOUTH")) + y += world.icon_size + // Cut out everything we just parsed + screen_loc = cut_relative_direction(screen_loc) + + var/list/x_and_y = splittext(screen_loc, ",") + var/list/x_pack = splittext(x_and_y[1], ":") + var/list/y_pack = splittext(x_and_y[2], ":") + x += text2num(x_pack[1]) * world.icon_size + y += text2num(y_pack[1]) * world.icon_size + + if(length(x_pack) > 1) + x += text2num(x_pack[2]) + if(length(y_pack) > 1) + y += text2num(y_pack[2]) + return list(x, y) + +/// Takes a list in the form (x_offset, y_offset) +/// And converts it to a screen loc string +/// Accepts an optional view string/size to force the screen_loc around, so it can't go out of scope +/proc/offset_to_screen_loc(x_offset, y_offset, view = null) + if(view) + var/list/view_bounds = view_to_pixels(view) + x_offset = clamp(x_offset, world.icon_size, view_bounds[1]) + y_offset = clamp(y_offset, world.icon_size, view_bounds[2]) + + // Round with no argument is floor, so we get the non pixel offset here + var/x = round(x_offset / world.icon_size) + var/pixel_x = x_offset % world.icon_size + var/y = round(y_offset / world.icon_size) + var/pixel_y = y_offset % world.icon_size + + var/list/generated_loc = list() + generated_loc += "[x]" + if(pixel_x) + generated_loc += ":[pixel_x]" + generated_loc += ",[y]" + if(pixel_y) + generated_loc += ":[pixel_y]" + return jointext(generated_loc, "") + +/** + * Returns a valid location to place a screen object without overflowing the viewport + * + * * target: The target location as a purely number based screen_loc string "+-left-offset:+-pixel,+-bottom-offset:+-pixel" + * * target_offset: The amount we want to offset the target location by. We explictly don't care about direction here, we will try all 4 + * * view: The view variable of the client we're doing this for. We use this to get the size of the screen + * + * Returns a screen loc representing the valid location +**/ +/proc/get_valid_screen_location(target_loc, target_offset, view) + var/list/offsets = screen_loc_to_offset(target_loc) + var/base_x = offsets[1] + var/base_y = offsets[2] + + var/list/view_size = view_to_pixels(view) + + // Bias to the right, down, left, and then finally up + if(base_x + target_offset < view_size[1]) + return offset_to_screen_loc(base_x + target_offset, base_y, view) + if(base_y - target_offset > world.icon_size) + return offset_to_screen_loc(base_x, base_y - target_offset, view) + if(base_x - target_offset > world.icon_size) + return offset_to_screen_loc(base_x - target_offset, base_y, view) + if(base_y + target_offset < view_size[2]) + return offset_to_screen_loc(base_x, base_y + target_offset, view) + stack_trace("You passed in a scren location {[target_loc]} and offset {[target_offset]} that can't be fit in the viewport Width {[view_size[1]]}, Height {[view_size[2]]}. what did you do lad") + return null // The fuck did you do lad + +/// Takes a screen_loc string and cut out any directions like NORTH or SOUTH +/proc/cut_relative_direction(fragment) + var/static/regex/regex = regex(@"([A-Z])\w+", "g") + return regex.Replace(fragment, "") diff --git a/code/__HELPERS/view.dm b/code/__HELPERS/view.dm index 1c92971802ea..6a4210bc5350 100644 --- a/code/__HELPERS/view.dm +++ b/code/__HELPERS/view.dm @@ -1,15 +1,19 @@ /proc/getviewsize(view) - var/viewX - var/viewY if(isnum(view)) var/totalviewrange = (view < 0 ? -1 : 1) + 2 * view - viewX = totalviewrange - viewY = totalviewrange + return list(totalviewrange, totalviewrange) else var/list/viewrangelist = splittext(view,"x") - viewX = text2num(viewrangelist[1]) - viewY = text2num(viewrangelist[2]) - return list(viewX, viewY) + return list(text2num(viewrangelist[1]), text2num(viewrangelist[2])) + +/// Takes a string or num view, and converts it to pixel width/height in a list(pixel_width, pixel_height) +/proc/view_to_pixels(view) + if(!view) + return list(0, 0) + var/list/view_info = getviewsize(view) + view_info[1] *= world.icon_size + view_info[2] *= world.icon_size + return view_info /proc/in_view_range(mob/user, atom/A) var/list/view_range = getviewsize(user.client.view) diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index a698706f1a48..fffbbc059fd0 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -91,31 +91,31 @@ /atom/movable/screen/click_catcher/IsAutoclickable() . = 1 -//Please don't roast me too hard -/client/MouseMove(object,location,control,params) - mouseParams = params - mouseLocation = location - mouseObject = object - mouseControlObject = control - if(mob) - SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_MOUSEMOVE, object, location, control, params) - // god forgive me for i have sinned - used for autoparry. currently at 5 objects. - moused_over_objects[object] = world.time - if(moused_over_objects.len > 7) - moused_over_objects.Cut(1, 2) - ..() - /client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params) + var/list/modifiers = params2list(params) + if (LAZYACCESS(modifiers, MIDDLE_CLICK)) + if (src_object && src_location != over_location) + middragtime = world.time + middle_drag_atom_ref = WEAKREF(src_object) + else + middragtime = 0 + middle_drag_atom_ref = null mouseParams = params - mouseLocation = over_location - mouseObject = over_object - mouseControlObject = over_control - if(selected_target[1] && over_object && over_object.IsAutoclickable()) + mouse_location_ref = WEAKREF(over_location) + mouse_object_ref = WEAKREF(over_object) + if(selected_target[1] && over_object?.IsAutoclickable()) selected_target[1] = over_object selected_target[2] = params if(active_mousedown_item) active_mousedown_item.onMouseDrag(src_object, over_object, src_location, over_location, params, mob) SEND_SIGNAL(src, COMSIG_CLIENT_MOUSEDRAG, src_object, over_object, src_location, over_location, src_control, over_control, params) + return ..() /obj/item/proc/onMouseDrag(src_object, over_object, src_location, over_location, params, mob) return + +/client/MouseDrop(atom/src_object, atom/over_object, atom/src_location, atom/over_location, src_control, over_control, params) + if (IS_WEAKREF_OF(src_object, middle_drag_atom_ref)) + middragtime = 0 + middle_drag_atom_ref = null + ..() diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm deleted file mode 100644 index 233ae17a4d65..000000000000 --- a/code/_onclick/hud/_defines.dm +++ /dev/null @@ -1,195 +0,0 @@ -/* - These defines specificy screen locations. For more information, see the byond documentation on the screen_loc var. - - The short version: - - Everything is encoded as strings because apparently that's how Byond rolls. - - "1,1" is the bottom left square of the user's screen. This aligns perfectly with the turf grid. - "1:2,3:4" is the square (1,3) with pixel offsets (+2, +4); slightly right and slightly above the turf grid. - Pixel offsets are used so you don't perfectly hide the turf under them, that would be crappy. - - In addition, the keywords NORTH, SOUTH, EAST, WEST and CENTER can be used to represent their respective - screen borders. NORTH-1, for example, is the row just below the upper edge. Useful if you want your - UI to scale with screen size. - - The size of the user's screen is defined by client.view (indirectly by world.view), in our case "15x15". - Therefore, the top right corner (except during admin shenanigans) is at "15,15" -*/ - -/proc/ui_hand_position(i) //values based on old hand ui positions (CENTER:-/+16,SOUTH:5) - var/x_off = -(!(i % 2)) - var/y_off = round((i-1) / 2) - return"CENTER+[x_off]:16,SOUTH+[y_off]:5" - -/proc/ui_equip_position(mob/M) - var/y_off = round((M.held_items.len-1) / 2) //values based on old equip ui position (CENTER: +/-16,SOUTH+1:5) - return "CENTER:-16,SOUTH+[y_off+1]:5" - -/proc/ui_swaphand_position(mob/M, which = 1) //values based on old swaphand ui positions (CENTER: +/-16,SOUTH+1:5) - var/x_off = which == 1 ? -1 : 0 - var/y_off = round((M.held_items.len-1) / 2) - return "CENTER+[x_off]:16,SOUTH+[y_off+1]:5" - -//Lower left, persistent menu -#define ui_inventory "WEST:6,SOUTH:5" - -//Middle left indicators -#define ui_lingchemdisplay "WEST,CENTER-1:15" -#define ui_lingstingdisplay "WEST:6,CENTER-3:11" - -#define ui_devilsouldisplay "WEST:6,CENTER-1:15" - -//Lower center, persistent menu -#define ui_sstore1 "CENTER-5:10,SOUTH:5" -#define ui_id "CENTER-4:12,SOUTH:5" -#define ui_belt "CENTER-3:14,SOUTH:5" -#define ui_back "CENTER-2:14,SOUTH:5" -#define ui_storage1 "CENTER+1:18,SOUTH:5" -#define ui_storage2 "CENTER+2:20,SOUTH:5" -#define ui_combo "CENTER+4:24,SOUTH+1:7" // combo meter for martial arts - -//Lower right, persistent menu -#define ui_drop_throw "EAST-1:28,SOUTH+1:7" -#define ui_pull_resist "EAST-2:26,SOUTH+1:7" -#define ui_movi "EAST-2:26,SOUTH:5" -#define ui_sprintbufferloc "EAST-2:26,SOUTH:18" -#define ui_acti "EAST-3:24,SOUTH:5" -#define ui_zonesel "EAST-1:28,SOUTH:5" -#define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12) -#define ui_crafting "EAST-5:20,SOUTH:5"//CIT CHANGE - moves this over one tile to accommodate for combat mode toggle -#define ui_building "EAST-5:20,SOUTH:21"//CIT CHANGE - ditto -#define ui_language_menu "EAST-5:4,SOUTH:21"//CIT CHANGE - ditto -#define ui_voremode "EAST-5:20,SOUTH:5" - -//Upper-middle right (alerts) -#define ui_alert1 "EAST-1:28,CENTER+5:27" -#define ui_alert2 "EAST-1:28,CENTER+4:25" -#define ui_alert3 "EAST-1:28,CENTER+3:23" -#define ui_alert4 "EAST-1:28,CENTER+2:21" -#define ui_alert5 "EAST-1:28,CENTER+1:19" - -//Middle right (status indicators) -#define ui_healthdoll "EAST-1:28,CENTER-2:13" -#define ui_health "EAST-1:28,CENTER-1:15" -#define ui_internal "EAST-1:28,CENTER+1:19"//CIT CHANGE - moves internal icon up a little bit to accommodate for the stamina meter -#define ui_mood "EAST-1:28,CENTER-3:10" -// #define ui_spacesuit "EAST-1:28,CENTER-4:10" - -//Pop-up inventory -#define ui_shoes "WEST+1:8,SOUTH:5" -#define ui_iclothing "WEST:6,SOUTH+1:7" -#define ui_oclothing "WEST+1:8,SOUTH+1:7" -#define ui_gloves "WEST+2:10,SOUTH+1:7" -#define ui_glasses "WEST:6,SOUTH+3:11" -#define ui_mask "WEST+1:8,SOUTH+2:9" -#define ui_ears "WEST+2:10,SOUTH+2:9" -#define ui_neck "WEST:6,SOUTH+2:9" -#define ui_head "WEST+1:8,SOUTH+3:11" - -//Generic living -#define ui_living_pull "EAST-1:28,CENTER-2:15" -#define ui_living_health "EAST-1:28,CENTER:15" -#define ui_living_healthdoll "EAST-1:28,CENTER-1:15" - -//Monkeys -#define ui_monkey_head "CENTER-5:13,SOUTH:5" -#define ui_monkey_mask "CENTER-4:14,SOUTH:5" -#define ui_monkey_neck "CENTER-3:15,SOUTH:5" -#define ui_monkey_back "CENTER-2:16,SOUTH:5" - -//Drones -#define ui_drone_drop "CENTER+1:18,SOUTH:5" -#define ui_drone_pull "CENTER+2:2,SOUTH:5" -#define ui_drone_storage "CENTER-2:14,SOUTH:5" -#define ui_drone_head "CENTER-3:14,SOUTH:5" - -//Cyborgs -#define ui_borg_health "EAST-1:28,CENTER-1:15" -#define ui_borg_pull "EAST-2:26,SOUTH+1:7" -#define ui_borg_radio "EAST-1:28,SOUTH+1:7" -#define ui_borg_intents "EAST-2:26,SOUTH:5" -#define ui_borg_lamp "CENTER-3:16, SOUTH:5" -#define ui_borg_tablet "CENTER-4:16, SOUTH:5" -#define ui_inv1 "CENTER-2:16,SOUTH:5" -#define ui_inv2 "CENTER-1 :16,SOUTH:5" -#define ui_inv3 "CENTER :16,SOUTH:5" -#define ui_borg_module "CENTER+1:16,SOUTH:5" -#define ui_borg_store "CENTER+2:16,SOUTH:5" -#define ui_borg_camera "CENTER+3:21,SOUTH:5" -#define ui_borg_alerts "CENTER+4:21,SOUTH:5" -#define ui_borg_language_menu "CENTER+4:21,SOUTH+1:5" -#define ui_borg_sensor "CENTER-6:16, SOUTH:5" //LEGACY -#define ui_borg_thrusters "CENTER-5:16, SOUTH:5" //LEGACY - -//Aliens -#define ui_alien_health "EAST,CENTER-1:15" -#define ui_alienplasmadisplay "EAST,CENTER-2:15" -#define ui_alien_queen_finder "EAST,CENTER-3:15" -#define ui_alien_storage_r "CENTER+1:18,SOUTH:5" -#define ui_alien_language_menu "EAST-3:26,SOUTH:5" - -//Constructs -#define ui_construct_pull "EAST,CENTER-2:15" -#define ui_construct_health "EAST,CENTER:15" - -//AI -#define ui_ai_core "BOTTOM:6,RIGHT-4" -#define ui_ai_shuttle "BOTTOM:6,RIGHT-3" -#define ui_ai_announcement "BOTTOM:6,RIGHT-2" -#define ui_ai_state_laws "BOTTOM:6,RIGHT-1" -#define ui_ai_pda_log "BOTTOM:6,RIGHT" -#define ui_ai_pda_send "BOTTOM+1:6,RIGHT" -#define ui_ai_language_menu "BOTTOM+1:8,RIGHT-2:30" - -#define ui_ai_crew_monitor "BOTTOM:6,CENTER-1" -#define ui_ai_crew_manifest "BOTTOM:6,CENTER" -#define ui_ai_alerts "BOTTOM:6,CENTER+1" - -#define ui_ai_view_images "BOTTOM:6,LEFT+4" -#define ui_ai_camera_list "BOTTOM:6,LEFT+3" -#define ui_ai_track_with_camera "BOTTOM:6,LEFT+2" -#define ui_ai_camera_light "BOTTOM:6,LEFT+1" -#define ui_ai_sensor "BOTTOM:6,LEFT" -#define ui_ai_multicam "BOTTOM+1:6,LEFT+1" -#define ui_ai_add_multicam "BOTTOM+1:6,LEFT" -#define ui_ai_take_picture "BOTTOM+2:6,LEFT" - - -// pAI -// #define ui_pai_software "SOUTH:6,WEST" -// #define ui_pai_shell "SOUTH:6,WEST+1" -// #define ui_pai_chassis "SOUTH:6,WEST+2" -// #define ui_pai_rest "SOUTH:6,WEST+3" -// #define ui_pai_light "SOUTH:6,WEST+4" -// #define ui_pai_newscaster "SOUTH:6,WEST+5" -// #define ui_pai_host_monitor "SOUTH:6,WEST+6" -// #define ui_pai_crew_manifest "SOUTH:6,WEST+7" -// #define ui_pai_state_laws "SOUTH:6,WEST+8" -// #define ui_pai_pda_send "SOUTH:6,WEST+9" -// #define ui_pai_pda_log "SOUTH:6,WEST+10" -// #define ui_pai_take_picture "SOUTH:6,WEST+12" -// #define ui_pai_view_images "SOUTH:6,WEST+13" - -//Ghosts -#define ui_ghost_jumptomob "SOUTH:6,CENTER-3:24" -#define ui_ghost_orbit "SOUTH:6,CENTER-2:24" -#define ui_ghost_reenter_corpse "SOUTH:6,CENTER-1:24" -#define ui_ghost_teleport "SOUTH:6,CENTER:24" -#define ui_ghost_pai "SOUTH: 6, CENTER+1:24" -#define ui_ghost_mafia "SOUTH: 6, CENTER+2:24" -#define ui_ghost_spawners "SOUTH: 6, CENTER+1:24" // LEGACY. SAME LOC AS PAI - -//UI position overrides for 1:1 screen layout. (default is 7:5) -#define ui_stamina "EAST-1:28,CENTER:17" // replacing internals button -#define ui_overridden_resist "EAST-3:24,SOUTH+1:7" -#define ui_clickdelay "CENTER,SOUTH+1:-31" -#define ui_resistdelay "EAST-3:24,SOUTH+1:4" -#define ui_combat_toggle "EAST-4:22,SOUTH:5" - -#define ui_boxcraft "EAST-4:22,SOUTH+1:6" -#define ui_boxarea "EAST-4:6,SOUTH+1:6" -#define ui_boxlang "EAST-5:22,SOUTH+1:6" -#define ui_boxvore "EAST-5:22,SOUTH+1:6" - -#define ui_wanted_lvl "NORTH,11" diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index d97e1f5d04ac..6b70d8cd4562 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -2,186 +2,154 @@ /atom/movable/screen/movable/action_button var/datum/action/linked_action + var/datum/hud/our_hud var/actiontooltipstyle = "" screen_loc = null var/button_icon_state var/appearance_cache + /// Where we are currently placed on the hud. SCRN_OBJ_DEFAULT asks the linked action what it thinks + var/location = SCRN_OBJ_DEFAULT + /// A unique bitflag, combined with the name of our linked action this lets us persistently remember any user changes to our position var/id - var/ordered = TRUE //If the button gets placed into the default bar + /// A weakref of the last thing we hovered over + /// God I hate how dragging works + var/datum/weakref/last_hovored_ref + +/atom/movable/screen/movable/action_button/Destroy() + if(our_hud) + var/mob/viewer = our_hud.mymob + our_hud.hide_action(src) + viewer?.client?.screen -= src + linked_action.viewers -= our_hud + viewer.update_action_buttons() + our_hud = null + linked_action = null + return ..() /atom/movable/screen/movable/action_button/proc/can_use(mob/user) if (linked_action) - return linked_action.owner == user + if(linked_action.viewers[user.hud_used]) + return TRUE + return FALSE else if (isobserver(user)) var/mob/dead/observer/O = user return !O.observetarget else return TRUE -/atom/movable/screen/movable/action_button/MouseDrop(over_object) - if(!can_use(usr)) - return - if((istype(over_object, /atom/movable/screen/movable/action_button) && !istype(over_object, /atom/movable/screen/movable/action_button/hide_toggle))) - if(locked) - to_chat(usr, "Action button \"[name]\" is locked, unlock it first.") - return - var/atom/movable/screen/movable/action_button/B = over_object - var/list/actions = usr.actions - actions.Swap(actions.Find(src.linked_action), actions.Find(B.linked_action)) - moved = FALSE - ordered = TRUE - B.moved = FALSE - B.ordered = TRUE - usr.update_action_buttons() - else - return ..() - /atom/movable/screen/movable/action_button/Click(location,control,params) if (!can_use(usr)) return var/list/modifiers = params2list(params) if(modifiers["shift"]) - if(locked) - to_chat(usr, "Action button \"[name]\" is locked, unlock it first.") - return TRUE - moved = 0 - usr.update_action_buttons() //redraw buttons that are no longer considered "moved" - return TRUE - if(modifiers["ctrl"]) - locked = !locked - to_chat(usr, "Action button \"[name]\" [locked ? "" : "un"]locked.") - if(id && usr.client) //try to (un)remember position - usr.client.prefs.action_buttons_screen_locs["[name]_[id]"] = locked ? moved : null + var/datum/hud/our_hud = usr.hud_used + our_hud.position_action(src, SCRN_OBJ_DEFAULT) return TRUE linked_action.Trigger() return TRUE -//Hide/Show Action Buttons ... Button -/atom/movable/screen/movable/action_button/hide_toggle - name = "Hide Buttons" - desc = "Shift-click any button to reset its position, and Control-click it to lock it in place. Alt-click this button to reset all buttons to their default positions." - icon = 'icons/mob/actions.dmi' - icon_state = "bg_default" - var/hidden = 0 - var/hide_icon = 'icons/mob/actions.dmi' - var/hide_state = "hide" - var/show_state = "show" - var/mutable_appearance/hide_appearance - var/mutable_appearance/show_appearance - -/atom/movable/screen/movable/action_button/hide_toggle/Initialize(mapload) +// Entered and Exited won't fire while you're dragging something, because you're still "holding" it +// Very much byond logic, but I want nice behavior, so we fake it with drag +/atom/movable/screen/movable/action_button/MouseDrag(atom/over_object, src_location, over_location, src_control, over_control, params) . = ..() - var/static/list/icon_cache = list() - - var/cache_key = "[hide_icon][hide_state]" - hide_appearance = icon_cache[cache_key] - if(!hide_appearance) - hide_appearance = icon_cache[cache_key] = mutable_appearance(hide_icon, hide_state) - - cache_key = "[hide_icon][show_state]" - show_appearance = icon_cache[cache_key] - if(!show_appearance) - show_appearance = icon_cache[cache_key] = mutable_appearance(hide_icon, show_state) - -/atom/movable/screen/movable/action_button/hide_toggle/Click(location,control,params) - if (!can_use(usr)) + if(!can_use(usr)) return + if(IS_WEAKREF_OF(over_object, last_hovored_ref)) + return + var/atom/old_object + if(last_hovored_ref) + old_object = last_hovored_ref?.resolve() + else // If there's no current ref, we assume it was us. We also treat this as our "first go" location + old_object = src + var/datum/hud/our_hud = usr.hud_used + our_hud?.generate_landings(src) - var/list/modifiers = params2list(params) - if(modifiers["shift"]) - if(locked) - to_chat(usr, "Action button \"[name]\" is locked, unlock it first.") - return TRUE - moved = FALSE - usr.update_action_buttons(TRUE) - return TRUE - if(modifiers["ctrl"]) - locked = !locked - to_chat(usr, "Action button \"[name]\" [locked ? "" : "un"]locked.") - if(id && usr.client) //try to (un)remember position - usr.client.prefs.action_buttons_screen_locs["[name]_[id]"] = locked ? moved : null - return TRUE - if(modifiers["alt"]) - for(var/V in usr.actions) - var/datum/action/A = V - var/atom/movable/screen/movable/action_button/B = A.button - B.moved = FALSE - if(B.id && usr.client) - usr.client.prefs.action_buttons_screen_locs["[B.name]_[B.id]"] = null - B.locked = usr.client.prefs.buttons_locked - locked = usr.client.prefs.buttons_locked - moved = FALSE - if(id && usr.client) - usr.client.prefs.action_buttons_screen_locs["[name]_[id]"] = null - usr.update_action_buttons(TRUE) - to_chat(usr, "Action button positions have been reset.") - return TRUE - usr.hud_used.action_buttons_hidden = !usr.hud_used.action_buttons_hidden - - hidden = usr.hud_used.action_buttons_hidden - if(hidden) - name = "Show Buttons" - else - name = "Hide Buttons" - update_icon() - usr.update_action_buttons() - -/atom/movable/screen/movable/action_button/hide_toggle/AltClick(mob/user) - for(var/V in user.actions) - var/datum/action/A = V - var/atom/movable/screen/movable/action_button/B = A.button - B.moved = FALSE - if(moved) - moved = FALSE - user.update_action_buttons(TRUE) - to_chat(user, "Action button positions have been reset.") - return TRUE + if(old_object) + old_object.MouseExited(over_location, over_control, params) + last_hovored_ref = WEAKREF(over_object) + over_object.MouseEntered(over_location, over_control, params) -/atom/movable/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(datum/hud/owner_hud) - var/settings = owner_hud.get_action_buttons_icons() - icon = settings["bg_icon"] - icon_state = settings["bg_state"] - hide_icon = settings["toggle_icon"] - hide_state = settings["toggle_hide"] - show_state = settings["toggle_show"] - update_icon() - -/atom/movable/screen/movable/action_button/hide_toggle/update_overlays() +/atom/movable/screen/movable/action_button/MouseEntered(location, control, params) . = ..() - if(hidden) - . += show_appearance - else - . += hide_appearance + if(!QDELETED(src)) + openToolTip(usr, src, params, title = name, content = desc, theme = actiontooltipstyle) +/atom/movable/screen/movable/action_button/MouseExited(location, control, params) + closeToolTip(usr) + return ..() -/atom/movable/screen/movable/action_button/MouseEntered(location,control,params) - if(!QDELETED(src)) - openToolTip(usr,src,params,title = name,content = desc,theme = actiontooltipstyle) +/atom/movable/screen/movable/action_button/MouseDrop(over_object) + last_hovored_ref = null + if(!can_use(usr)) + return + var/datum/hud/our_hud = usr.hud_used + if(over_object == src) + our_hud.hide_landings() + return + if(istype(over_object, /atom/movable/screen/action_landing)) + var/atom/movable/screen/action_landing/reserve = over_object + reserve.hit_by(src) + our_hud.hide_landings() + save_position() + return + our_hud.hide_landings() + if(istype(over_object, /atom/movable/screen/button_palette) || istype(over_object, /atom/movable/screen/palette_scroll)) + our_hud.position_action(src, SCRN_OBJ_IN_PALETTE) + save_position() + return + if(istype(over_object, /atom/movable/screen/movable/action_button)) + var/atom/movable/screen/movable/action_button/button = over_object + our_hud.position_action_relative(src, button) + save_position() + return + . = ..() + our_hud.position_action(src, screen_loc) + save_position() -/atom/movable/screen/movable/action_button/MouseExited() - closeToolTip(usr) +/atom/movable/screen/movable/action_button/proc/save_position() + var/mob/user = our_hud.mymob + if(!user?.client) + return + var/position_info = "" + switch(location) + if(SCRN_OBJ_FLOATING) + position_info = screen_loc + if(SCRN_OBJ_IN_LIST) + position_info = SCRN_OBJ_IN_LIST + if(SCRN_OBJ_IN_PALETTE) + position_info = SCRN_OBJ_IN_PALETTE + + user.client.prefs.action_buttons_screen_locs["[name]_[id]"] = position_info + +/atom/movable/screen/movable/action_button/proc/load_position() + var/mob/user = our_hud.mymob + if(!user) + return + var/position_info = user.client?.prefs?.action_buttons_screen_locs["[name]_[id]"] || SCRN_OBJ_DEFAULT + user.hud_used.position_action(src, position_info) + +/atom/movable/screen/movable/action_button/proc/dump_save() + var/mob/user = our_hud.mymob + if(!user?.client) + return + user.client.prefs.action_buttons_screen_locs -= "[name]_[id]" /datum/hud/proc/get_action_buttons_icons() . = list() .["bg_icon"] = ui_style .["bg_state"] = "template" - //TODO : Make these fit theme - .["toggle_icon"] = 'icons/mob/actions.dmi' - .["toggle_hide"] = "hide" - .["toggle_show"] = "show" - //see human and alien hud for specific implementations. /mob/proc/update_action_buttons_icon(status_only = FALSE) for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon(status_only) + A.UpdateButtons(status_only) //This is the proc used to update all the action buttons. /mob/proc/update_action_buttons(reload_screen) @@ -191,56 +159,243 @@ if(hud_used.hud_shown != HUD_STYLE_STANDARD) return - var/button_number = 0 - var/list/cview = getviewsize(client.view) - var/supportedcolumns = cview[1]-2 + for(var/datum/action/action as anything in actions) + var/atom/movable/screen/movable/action_button/button = action.viewers[hud_used] + action.UpdateButtons() + if(reload_screen) + client.screen += button - if(hud_used.action_buttons_hidden) - for(var/datum/action/A in actions) - A.button.screen_loc = null - if(reload_screen) - client.screen += A.button + if(reload_screen) + hud_used.update_our_owner() + // This holds the logic for the palette buttons + hud_used.palette_actions.refresh_actions() + +/atom/movable/screen/button_palette + desc = "Drag buttons to move them
Shift-click any button to reset it
Alt-click this to reset all buttons" + icon = 'icons/hud/64x16_actions.dmi' + icon_state = "screen_gen_palette" + screen_loc = ui_action_palette + var/datum/hud/our_hud + var/expanded = FALSE + /// Id of any currently running timers that set our color matrix + var/color_timer_id + +/atom/movable/screen/button_palette/Destroy() + if(our_hud) + our_hud.mymob?.client?.screen -= src + our_hud.toggle_palette = null + our_hud = null + return ..() + +/atom/movable/screen/button_palette/Initialize(mapload) + . = ..() + update_appearance() + +/atom/movable/screen/button_palette/proc/set_hud(datum/hud/our_hud) + src.our_hud = our_hud + refresh_owner() + +/atom/movable/screen/button_palette/update_name(updates) + . = ..() + if(expanded) + name = "Hide Buttons" else - for(var/datum/action/A in actions) - A.UpdateButtonIcon() - var/atom/movable/screen/movable/action_button/B = A.button - if(B.ordered) - button_number++ - if(B.moved) - B.screen_loc = B.moved - else - B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number, supportedcolumns) - if(reload_screen) - client.screen += B - - if(!button_number) - hud_used.hide_actions_toggle.screen_loc = null - return - - if(!hud_used.hide_actions_toggle.moved) - hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1, supportedcolumns) + name = "Show Buttons" + +/atom/movable/screen/button_palette/proc/refresh_owner() + var/mob/viewer = our_hud.mymob + if(viewer.client) + viewer.client.screen |= src + + var/list/settings = our_hud.get_action_buttons_icons() + var/ui_icon = "[settings["bg_icon"]]" + var/list/ui_segments = splittext(ui_icon, ".") + var/list/ui_paths = splittext(ui_segments[1], "/") + var/ui_name = ui_paths[length(ui_paths)] + + icon_state = "[ui_name]_palette" + +/atom/movable/screen/button_palette/MouseEntered(location, control, params) + . = ..() + if(QDELETED(src)) + return + show_tooltip(params) + +/atom/movable/screen/button_palette/MouseExited() + closeToolTip(usr) + return ..() + +/atom/movable/screen/button_palette/proc/show_tooltip(params) + openToolTip(usr, src, params, title = name, content = desc) + +GLOBAL_LIST_INIT(palette_added_matrix, list(0.4,0.5,0.2,0, 0,1.4,0,0, 0,0.4,0.6,0, 0,0,0,1, 0,0,0,0)) +GLOBAL_LIST_INIT(palette_removed_matrix, list(1.4,0,0,0, 0.7,0.4,0,0, 0.4,0,0.6,0, 0,0,0,1, 0,0,0,0)) + +/atom/movable/screen/button_palette/proc/play_item_added() + color_for_now(GLOB.palette_added_matrix) + +/atom/movable/screen/button_palette/proc/play_item_removed() + color_for_now(GLOB.palette_removed_matrix) + +/atom/movable/screen/button_palette/proc/color_for_now(list/color) + if(color_timer_id) + return + add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) //We unfortunately cannot animate matrix colors. Curse you lummy it would be ~~non~~trivial to interpolate between the two valuessssssssss + color_timer_id = addtimer(CALLBACK(src, .proc/remove_color, color), 2 SECONDS) + +/atom/movable/screen/button_palette/proc/remove_color(list/to_remove) + color_timer_id = null + remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, to_remove) + +/atom/movable/screen/button_palette/proc/can_use(mob/user) + if (isobserver(user)) + var/mob/dead/observer/O = user + return !O.observetarget + return TRUE + +/atom/movable/screen/button_palette/Click(location, control, params) + if(!can_use(usr)) + return + + var/list/modifiers = params2list(params) + + if(LAZYACCESS(modifiers, ALT_CLICK)) + for(var/datum/action/action as anything in usr.actions) // Reset action positions to default + for(var/datum/hud/hud as anything in action.viewers) + var/atom/movable/screen/movable/action_button/button = action.viewers[hud] + hud.position_action(button, SCRN_OBJ_DEFAULT) + to_chat(usr, span_notice("Action button positions have been reset.")) + return TRUE + + set_expanded(!expanded) + +/atom/movable/screen/button_palette/proc/clicked_while_open(datum/source, atom/target, atom/location, control, params, mob/user) + if(istype(target, /atom/movable/screen/movable/action_button) || istype(target, /atom/movable/screen/palette_scroll) || target == src) // If you're clicking on an action button, or us, you can live + return + set_expanded(FALSE) + if(source) + UnregisterSignal(source, COMSIG_CLIENT_CLICK) + +/atom/movable/screen/button_palette/proc/set_expanded(new_expanded) + var/datum/action_group/our_group = our_hud.palette_actions + if(!length(our_group.actions)) //Looks dumb, trust me lad + new_expanded = FALSE + if(expanded == new_expanded) + return + + expanded = new_expanded + our_group.refresh_actions() + update_appearance() + + if(!usr.client) + return + + if(expanded) + RegisterSignal(usr.client, COMSIG_CLIENT_CLICK, .proc/clicked_while_open) else - hud_used.hide_actions_toggle.screen_loc = hud_used.hide_actions_toggle.moved - if(reload_screen) - client.screen += hud_used.hide_actions_toggle + UnregisterSignal(usr.client, COMSIG_CLIENT_CLICK) -/datum/hud/proc/ButtonNumberToScreenCoords(number, supportedcolumns) // TODO : Make this zero-indexed for readabilty - var/row = round((number - 1)/supportedcolumns) - var/col = ((number - 1)%(supportedcolumns)) + 1 + closeToolTip(usr) //Our tooltips are now invalid, can't seem to update them in one frame, so here, just close them - var/coord_col = "+[col-1]" - var/coord_col_offset = 2 + 2 * col +/atom/movable/screen/palette_scroll + icon = 'icons/mob/screen_gen.dmi' + screen_loc = ui_palette_scroll + /// How should we move the palette's actions? + /// Positive scrolls down the list, negative scrolls back + var/scroll_direction = 0 + var/datum/hud/our_hud - var/coord_row = "[row ? -row : "+0"]" +/atom/movable/screen/palette_scroll/proc/can_use(mob/user) + if (isobserver(user)) + var/mob/dead/observer/O = user + return !O.observetarget + return TRUE + +/atom/movable/screen/palette_scroll/proc/set_hud(datum/hud/our_hud) + src.our_hud = our_hud + refresh_owner() + +/atom/movable/screen/palette_scroll/proc/refresh_owner() + var/mob/viewer = our_hud.mymob + if(viewer.client) + viewer.client.screen |= src + + var/list/settings = our_hud.get_action_buttons_icons() + icon = settings["bg_icon"] + +/atom/movable/screen/palette_scroll/Click(location, control, params) + if(!can_use(usr)) + return + our_hud.palette_actions.scroll(scroll_direction) - return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:-6" +/atom/movable/screen/palette_scroll/MouseEntered(location, control, params) + . = ..() + if(QDELETED(src)) + return + openToolTip(usr, src, params, title = name, content = desc) -/datum/hud/proc/SetButtonCoords(atom/movable/screen/button,number, supportedcolumns) - var/row = round((number-1)/supportedcolumns) - var/col = ((number - 1)%(supportedcolumns)) + 1 - var/x_offset = 32*(col-1) + 4 + 2*col - var/y_offset = -32*(row+1) + 26 +/atom/movable/screen/palette_scroll/MouseExited() + closeToolTip(usr) + return ..() + +/atom/movable/screen/palette_scroll/down + name = "Scroll Down" + desc = "Click on this to scroll the actions above down" + icon_state = "scroll_down" + scroll_direction = 1 + +/atom/movable/screen/palette_scroll/down/Destroy() + if(our_hud) + our_hud.mymob?.client?.screen -= src + our_hud.palette_down = null + our_hud = null + return ..() + +/atom/movable/screen/palette_scroll/up + name = "Scroll Up" + desc = "Click on this to scroll the actions above up" + icon_state = "scroll_up" + scroll_direction = -1 + +/atom/movable/screen/palette_scroll/up/Destroy() + if(our_hud) + our_hud.mymob?.client?.screen -= src + our_hud.palette_up = null + our_hud = null + return ..() + +/// Exists so you have a place to put your buttons when you move them around +/atom/movable/screen/action_landing + name = "Button Space" + desc = "Drag and drop a button into this spot
to add it to the group" + icon = 'icons/mob/screen_gen.dmi' + icon_state = "reserved" + // We want our whole 32x32 space to be clickable, so dropping's forgiving + mouse_opacity = MOUSE_OPACITY_OPAQUE + var/datum/action_group/owner + +/atom/movable/screen/action_landing/Destroy() + if(owner) + owner.landing = null + owner?.owner?.mymob?.client?.screen -= src + owner.refresh_actions() + owner = null + return ..() + +/atom/movable/screen/action_landing/proc/set_owner(datum/action_group/owner) + src.owner = owner + refresh_owner() + +/atom/movable/screen/action_landing/proc/refresh_owner() + var/datum/hud/our_hud = owner.owner + var/mob/viewer = our_hud.mymob + if(viewer.client) + viewer.client.screen |= src + + var/list/settings = our_hud.get_action_buttons_icons() + icon = settings["bg_icon"] - var/matrix/M = matrix() - M.Translate(x_offset,y_offset) - button.transform = M +/// Reacts to having a button dropped on it +/atom/movable/screen/action_landing/proc/hit_by(atom/movable/screen/movable/action_button/button) + var/datum/hud/our_hud = owner.owner + our_hud.position_action(button, owner.location) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 9d762332c6dd..740174138d7d 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -73,8 +73,13 @@ GLOBAL_LIST_INIT(available_ui_styles, list( // We don't actually do proccalls really yet, so let's grab at prefs - var/atom/movable/screen/movable/action_button/hide_toggle/hide_actions_toggle - var/action_buttons_hidden = FALSE + var/atom/movable/screen/button_palette/toggle_palette + var/atom/movable/screen/palette_scroll/down/palette_down + var/atom/movable/screen/palette_scroll/up/palette_up + + var/datum/action_group/palette/palette_actions + var/datum/action_group/listed/listed_actions + var/list/floating_actions var/atom/movable/screen/healths var/atom/movable/screen/healthdoll @@ -91,10 +96,12 @@ GLOBAL_LIST_INIT(available_ui_styles, list( // will fall back to the default if any of these are null ui_style = ui_style2icon(owner.client && owner.client.prefs && owner.client.prefs.UI_style) - hide_actions_toggle = new - hide_actions_toggle.InitialiseIcon(src) - if(mymob.client) - hide_actions_toggle.locked = mymob.client.prefs.buttons_locked + toggle_palette = new() + toggle_palette.set_hud(src) + palette_down = new() + palette_down.set_hud(src) + palette_up = new() + palette_up.set_hud(src) hand_slots = list() @@ -110,7 +117,13 @@ GLOBAL_LIST_INIT(available_ui_styles, list( if(mymob.hud_used == src) mymob.hud_used = null - QDEL_NULL(hide_actions_toggle) + QDEL_NULL(toggle_palette) + QDEL_NULL(palette_down) + QDEL_NULL(palette_up) + QDEL_NULL(palette_actions) + QDEL_NULL(listed_actions) + QDEL_LIST(floating_actions) + QDEL_NULL(module_store_icon) QDEL_LIST(static_inventory) @@ -148,10 +161,14 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /mob/proc/create_mob_hud() if(!client || hud_used) return - hud_used = new hud_type(src) + set_hud_used(new hud_type(src)) update_sight() SEND_SIGNAL(src, COMSIG_MOB_HUD_CREATED) +/mob/proc/set_hud_used(datum/hud/new_hud) + hud_used = new_hud + new_hud.build_action_groups() + //Version denotes which style should be displayed. blank or 0 means "next version" /datum/hud/proc/show_hud(version = 0, mob/viewmob) if(!ismob(mymob)) @@ -160,6 +177,8 @@ GLOBAL_LIST_INIT(available_ui_styles, list( if(!screenmob.client) return FALSE + // This code is the absolute fucking worst, I want it to go die in a fire + // Seriously, why screenmob.client.screen = list() screenmob.client.update_clickcatcher() @@ -181,7 +200,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( if(infodisplay.len) screenmob.client.screen += infodisplay - screenmob.client.screen += hide_actions_toggle + screenmob.client.screen += toggle_palette if(action_intent) action_intent.screen_loc = initial(action_intent.screen_loc) //Restore intent selection to the original position @@ -272,7 +291,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list( ui_style = new_ui_style build_hand_slots() - hide_actions_toggle.InitialiseIcon(src) //Triggered when F12 is pressed (Unless someone changed something in the DMF) /mob/verb/button_pressed_F12() @@ -320,3 +338,306 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /datum/hud/proc/update_locked_slots() return + +/datum/hud/proc/position_action(atom/movable/screen/movable/action_button/button, position) + if(button.location != SCRN_OBJ_DEFAULT) + hide_action(button) + switch(position) + if(SCRN_OBJ_DEFAULT) // Reset to the default + button.dump_save() // Nuke any existing saves + position_action(button, button.linked_action.default_button_position) + return + if(SCRN_OBJ_IN_LIST) + listed_actions.insert_action(button) + if(SCRN_OBJ_IN_PALETTE) + palette_actions.insert_action(button) + else // If we don't have it as a define, this is a screen_loc, and we should be floating + floating_actions += button + button.screen_loc = position + position = SCRN_OBJ_FLOATING + + button.location = position + +/datum/hud/proc/position_action_relative(atom/movable/screen/movable/action_button/button, atom/movable/screen/movable/action_button/relative_to) + if(button.location != SCRN_OBJ_DEFAULT) + hide_action(button) + switch(relative_to.location) + if(SCRN_OBJ_IN_LIST) + listed_actions.insert_action(button, listed_actions.index_of(relative_to)) + if(SCRN_OBJ_IN_PALETTE) + palette_actions.insert_action(button, palette_actions.index_of(relative_to)) + if(SCRN_OBJ_FLOATING) // If we don't have it as a define, this is a screen_loc, and we should be floating + floating_actions += button + var/client/our_client = mymob.client + if(!our_client) + position_action(button, button.linked_action.default_button_position) + return + button.screen_loc = get_valid_screen_location(relative_to.screen_loc, world.icon_size, our_client.view_size.getView()) // Asks for a location adjacent to our button that won't overflow the map + + button.location = relative_to.location + +/// Removes the passed in action from its current position on the screen +/datum/hud/proc/hide_action(atom/movable/screen/movable/action_button/button) + switch(button.location) + if(SCRN_OBJ_DEFAULT) // Invalid + CRASH("We just tried to hide an action buttion that somehow has the default position as its location, you done fucked up") + if(SCRN_OBJ_FLOATING) + floating_actions -= button + if(SCRN_OBJ_IN_LIST) + listed_actions.remove_action(button) + if(SCRN_OBJ_IN_PALETTE) + palette_actions.remove_action(button) + button.screen_loc = null + +/// Generates visual landings for all groups that the button is not a memeber of +/datum/hud/proc/generate_landings(atom/movable/screen/movable/action_button/button) + listed_actions.generate_landing() + palette_actions.generate_landing() + +/// Clears all currently visible landings +/datum/hud/proc/hide_landings() + listed_actions.clear_landing() + palette_actions.clear_landing() + +// Updates any existing "owned" visuals, ensures they continue to be visible +/datum/hud/proc/update_our_owner() + toggle_palette.refresh_owner() + palette_down.refresh_owner() + palette_up.refresh_owner() + listed_actions.update_landing() + palette_actions.update_landing() + +/// Ensures all of our buttons are properly within the bounds of our client's view, moves them if they're not +/datum/hud/proc/view_audit_buttons() + var/our_view = mymob?.client?.view + if(!our_view) + return + listed_actions.check_against_view() + palette_actions.check_against_view() + for(var/atom/movable/screen/movable/action_button/floating_button as anything in floating_actions) + var/list/current_offsets = screen_loc_to_offset(floating_button.screen_loc) + // We set the view arg here, so the output will be properly hemm'd in by our new view + floating_button.screen_loc = offset_to_screen_loc(current_offsets[1], current_offsets[2], view = our_view) + +/// Generates and fills new action groups with our mob's current actions +/datum/hud/proc/build_action_groups() + listed_actions = new(src) + palette_actions = new(src) + floating_actions = list() + for(var/datum/action/action as anything in mymob.actions) + var/atom/movable/screen/movable/action_button/button = action.viewers[src] + if(!button) + action.ShowTo(mymob) + button = action.viewers[src] + position_action(button, button.location) + +/datum/action_group + /// The hud we're owned by + var/datum/hud/owner + /// The actions we're managing + var/list/atom/movable/screen/movable/action_button/actions + /// The initial vertical offset of our action buttons + var/north_offset = 0 + /// The pixel vertical offset of our action buttons + var/pixel_north_offset = 0 + /// Max amount of buttons we can have per row + /// Indexes at 1 + var/column_max = 0 + /// How far "ahead" of the first row we start. Lets us "scroll" our rows + /// Indexes at 1 + var/row_offset = 0 + /// How many rows of actions we can have at max before we just stop hiding + /// Indexes at 1 + var/max_rows = INFINITY + /// The screen location we go by + var/location + /// Our landing screen object + var/atom/movable/screen/action_landing/landing + +/datum/action_group/New(datum/hud/owner) + ..() + actions = list() + src.owner = owner + +/datum/action_group/Destroy() + owner = null + QDEL_NULL(landing) + QDEL_LIST(actions) + return ..() + +/datum/action_group/proc/insert_action(atom/movable/screen/action, index) + if(action in actions) + if(actions[index] == action) + return + actions -= action // Don't dupe, come on + if(!index) + index = length(actions) + 1 + index = min(length(actions) + 1, index) + actions.Insert(index, action) + refresh_actions() + +/datum/action_group/proc/remove_action(atom/movable/screen/action) + actions -= action + refresh_actions() + +/datum/action_group/proc/refresh_actions() + + // We don't use size() here because landings are not canon + var/total_rows = ROUND_UP(length(actions) / column_max) + total_rows -= max_rows // Lets get the amount of rows we're off from our max + row_offset = clamp(row_offset, 0, total_rows) // You're not allowed to offset so far that we have a row of blank space + + var/button_number = 0 + for(var/atom/movable/screen/button as anything in actions) + var/postion = ButtonNumberToScreenCoords(button_number ) + button.screen_loc = postion + button_number++ + + if(landing) + var/postion = ButtonNumberToScreenCoords(button_number, landing = TRUE) // Need a good way to count buttons off screen, but allow this to display in the right place if it's being placed with no concern for dropdown + landing.screen_loc = postion + button_number++ + +/// Accepts a number represeting our position in the group, indexes at 0 to make the math nicer +/datum/action_group/proc/ButtonNumberToScreenCoords(number, landing = FALSE) + var/row = round(number / column_max) + row -= row_offset // If you're less then 0, you don't get to render, this lets us "scroll" rows ya feel? + if(row < 0) + return null + + // Could use >= here, but I think it's worth noting that the two start at different places, since row is based on number here + if(row > max_rows - 1) + if(!landing) // If you're not a landing, go away please. thx + return null + // We always want to render landings, even if their action button can't be displayed. + // So we set a row equal to the max amount of rows + 1. Willing to overrun that max slightly to properly display the landing spot + row = max_rows // Remembering that max_rows indexes at 1, and row indexes at 0 + + // We're going to need to set our column to match the first item in the last row, so let's set number properly now + number = row * column_max + + var/visual_row = row + north_offset + var/coord_row = visual_row ? "-[visual_row]" : "+0" + + var/visual_column = number % column_max + var/coord_col = "+[visual_column]" + var/coord_col_offset = 4 + 2 * (visual_column + 1) + return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:-[pixel_north_offset]" + +/datum/action_group/proc/check_against_view() + var/owner_view = owner?.mymob?.client?.view + if(!owner_view) + return + // Unlikey as it is, we may have been changed. Want to start from our target position and fail down + column_max = initial(column_max) + // Convert our viewer's view var into a workable offset + var/list/view_size = view_to_pixels(owner_view) + + // We're primarially concerned about width here, if someone makes us 1x2000 I wish them a swift and watery death + var/furthest_screen_loc = ButtonNumberToScreenCoords(column_max - 1) + var/list/offsets = screen_loc_to_offset(furthest_screen_loc, owner_view) + if(offsets[1] > world.icon_size && offsets[1] < view_size[1] && offsets[2] > world.icon_size && offsets[2] < view_size[2]) // We're all good + return + + for(column_max in column_max - 1 to 1 step -1) // Yes I could do this by unwrapping ButtonNumberToScreenCoords, but I don't feel like it + var/tested_screen_loc = ButtonNumberToScreenCoords(column_max) + offsets = screen_loc_to_offset(tested_screen_loc, owner_view) + // We've found a valid max length, pack it in + if(offsets[1] > world.icon_size && offsets[1] < view_size[1] && offsets[2] > world.icon_size && offsets[2] < view_size[2]) + break + // Use our newly resized column max + refresh_actions() + +/// Returns the amount of objects we're storing at the moment +/datum/action_group/proc/size() + var/amount = length(actions) + if(landing) + amount += 1 + return amount + +/datum/action_group/proc/index_of(atom/movable/screen/get_location) + return actions.Find(get_location) + +/// Generates a landing object that can be dropped on to join this group +/datum/action_group/proc/generate_landing() + if(landing) + return + landing = new() + landing.set_owner(src) + refresh_actions() + +/// Clears any landing objects we may currently have +/datum/action_group/proc/clear_landing() + QDEL_NULL(landing) + +/datum/action_group/proc/update_landing() + if(!landing) + return + landing.refresh_owner() + +/datum/action_group/proc/scroll(amount) + row_offset += amount + refresh_actions() + +/datum/action_group/palette + north_offset = 2 + column_max = 3 + max_rows = 3 + location = SCRN_OBJ_IN_PALETTE + +/datum/action_group/palette/insert_action(atom/movable/screen/action, index) + . = ..() + var/atom/movable/screen/button_palette/palette = owner.toggle_palette + palette.play_item_added() + +/datum/action_group/palette/remove_action(atom/movable/screen/action) + . = ..() + var/atom/movable/screen/button_palette/palette = owner.toggle_palette + palette.play_item_removed() + if(!length(actions)) + palette.set_expanded(FALSE) + +/datum/action_group/palette/refresh_actions() + var/atom/movable/screen/button_palette/palette = owner.toggle_palette + var/atom/movable/screen/palette_scroll/scroll_down = owner.palette_down + var/atom/movable/screen/palette_scroll/scroll_up = owner.palette_up + + var/actions_above = round((owner.listed_actions.size() - 1) / owner.listed_actions.column_max) + north_offset = initial(north_offset) + actions_above + + palette.screen_loc = ui_action_palette_offset(actions_above) + var/action_count = length(owner?.mymob?.actions) + var/our_row_count = round((length(actions) - 1) / column_max) + if(!action_count) + palette.screen_loc = null + + if(palette.expanded && action_count && our_row_count >= max_rows) + scroll_down.screen_loc = ui_palette_scroll_offset(actions_above) + scroll_up.screen_loc = ui_palette_scroll_offset(actions_above) + else + scroll_down.screen_loc = null + scroll_up.screen_loc = null + + return ..() + +/datum/action_group/palette/ButtonNumberToScreenCoords(number, landing) + var/atom/movable/screen/button_palette/palette = owner.toggle_palette + if(palette.expanded) + return ..() + + if(!landing) + return null + + // We only render the landing in this case, so we force it to be the second item displayed (Second rather then first since it looks nicer) + // Remember the number var indexes at 0 + return ..(1 + (row_offset * column_max), landing) + + +/datum/action_group/listed + pixel_north_offset = 6 + column_max = 10 + location = SCRN_OBJ_IN_LIST + +/datum/action_group/listed/refresh_actions() + . = ..() + owner.palette_actions.refresh_actions() // We effect them, so we gotta refresh em diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index a00687e263e1..6c9f852ef5ff 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -9,9 +9,8 @@ //Not tied to the grid, places it's center where the cursor is /atom/movable/screen/movable + mouse_drag_pointer = 'icons/effects/mouse_pointers/screen_drag.dmi' var/snap2grid = FALSE - var/moved = FALSE - var/locked = FALSE var/x_off = -16 var/y_off = -16 @@ -21,35 +20,29 @@ /atom/movable/screen/movable/snap snap2grid = TRUE - /atom/movable/screen/movable/MouseDrop(over_object, src_location, over_location, src_control, over_control, params) - if(locked) //no! I am locked! begone! + var/position = mouse_params_to_position(params) + if(!position) return - var/list/PM = params2list(params) - - //No screen-loc information? abort. - if(!PM || !PM["screen-loc"]) - return - - //Split screen-loc up into X+Pixel_X and Y+Pixel_Y - var/list/screen_loc_params = splittext(PM["screen-loc"], ",") - //Split X+Pixel_X up into list(X, Pixel_X) - var/list/screen_loc_X = splittext(screen_loc_params[1],":") + screen_loc = position - //Split Y+Pixel_Y up into list(Y, Pixel_Y) - var/list/screen_loc_Y = splittext(screen_loc_params[2],":") +/// Takes mouse parmas as input, returns a string representing the appropriate mouse position +/atom/movable/screen/movable/proc/mouse_params_to_position(params) + var/list/modifiers = params2list(params) + //No screen-loc information? abort. + if(!LAZYACCESS(modifiers, SCREEN_LOC)) + return + var/client/our_client = usr.client + var/list/offset = screen_loc_to_offset(LAZYACCESS(modifiers, SCREEN_LOC)) if(snap2grid) //Discard Pixel Values - screen_loc = "[screen_loc_X[1]],[screen_loc_Y[1]]" - + offset[1] = FLOOR(offset[1], world.icon_size) // drops any pixel offset + offset[2] = FLOOR(offset[2], world.icon_size) // drops any pixel offset else //Normalise Pixel Values (So the object drops at the center of the mouse, not 16 pixels off) - var/pix_X = text2num(screen_loc_X[2]) + x_off - var/pix_Y = text2num(screen_loc_Y[2]) + y_off - screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]" - - moved = screen_loc - + offset[1] += x_off + offset[2] += y_off + return offset_to_screen_loc(offset[1], offset[2], our_client?.view) //Debug procs /client/proc/test_movable_UI() diff --git a/code/_onclick/hud/screentip.dm b/code/_onclick/hud/screentip.dm index 5128448561aa..b9b27072b33d 100644 --- a/code/_onclick/hud/screentip.dm +++ b/code/_onclick/hud/screentip.dm @@ -17,4 +17,4 @@ SIGNAL_HANDLER if(!hud || !hud.mymob.client.view_size) //Might not have been initialized by now return - maptext_width = getviewsize(hud.mymob.client.view_size.getView())[1] * world.icon_size + maptext_width = view_to_pixels(hud.mymob.client.view_size.getView())[1] diff --git a/code/controllers/subsystem/augury.dm b/code/controllers/subsystem/augury.dm index 53c86004a6a4..f7a7c667184e 100644 --- a/code/controllers/subsystem/augury.dm +++ b/code/controllers/subsystem/augury.dm @@ -69,15 +69,15 @@ SUBSYSTEM_DEF(augury) SSaugury.watchers += owner to_chat(owner, "You are now auto-following debris.") active = TRUE - UpdateButtonIcon() + UpdateButtons() /datum/action/innate/augury/Deactivate() SSaugury.watchers -= owner to_chat(owner, "You are no longer auto-following debris.") active = FALSE - UpdateButtonIcon() + UpdateButtons() -/datum/action/innate/augury/UpdateButtonIcon(status_only = FALSE, force) +/datum/action/innate/augury/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force) ..() if(active) button.icon_state = "template_active" diff --git a/code/datums/action.dm b/code/datums/action.dm index 2d6af6c2de16..29c4fa90dacc 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -11,9 +11,11 @@ var/check_flags = 0 var/required_mobility_flags = MOBILITY_USE var/processing = FALSE - var/atom/movable/screen/movable/action_button/button = null var/buttontooltipstyle = "" var/transparent_when_unavailable = TRUE + /// Where any buttons we create should be by default. Accepts screen_loc and location defines + var/default_button_position = SCRN_OBJ_IN_LIST + var/use_target_appearance = FALSE var/list/target_appearance_matrix //if set, will be used to transform the target button appearance as an arglist. @@ -28,12 +30,6 @@ /datum/action/New(Target) link_to(Target) - button = new - button.linked_action = src - button.name = name - button.actiontooltipstyle = buttontooltipstyle - if(desc) - button.desc = desc /datum/action/proc/link_to(Target) target = Target @@ -43,51 +39,42 @@ if(owner) Remove(owner) target = null - QDEL_NULL(button) + QDEL_LIST_ASSOC_VAL(viewers) // Qdel the buttons in the viewers list **NOT THE HUDS** return ..() /datum/action/proc/Grant(mob/M) - if(M) - if(owner) - if(owner == M) - return - Remove(owner) - owner = M - - //button id generation - var/counter = 0 - var/bitfield = 0 - for(var/datum/action/A in M.actions) - if(A.name == name && A.button.id) - counter += 1 - bitfield |= A.button.id - bitfield = ~bitfield - var/bitflag = 1 - for(var/i in 1 to (counter + 1)) - if(bitfield & bitflag) - button.id = bitflag - break - bitflag *= 2 - - M.actions += src - if(M.client) - M.client.screen += button - button.locked = M.client.prefs.buttons_locked || button.id ? M.client.prefs.action_buttons_screen_locs["[name]_[button.id]"] : FALSE //even if it's not defaultly locked we should remember we locked it before - button.moved = button.id ? M.client.prefs.action_buttons_screen_locs["[name]_[button.id]"] : FALSE - M.update_action_buttons() - else + if(!M) + Remove(owner) + return + if(owner) + if(owner == M) + return Remove(owner) + owner = M + RegisterSignal(owner, COMSIG_PARENT_QDELETING, .proc/clear_ref, override = TRUE) + + GiveAction(M) + +/datum/action/proc/clear_ref(datum/ref) + SIGNAL_HANDLER + if(ref == owner) + Remove(owner) + if(ref == target) + qdel(src) /datum/action/proc/Remove(mob/M) - if(M) - if(M.client) - M.client.screen -= button - M.actions -= src - M.update_action_buttons() - owner = null - button.moved = FALSE //so the button appears in its normal position when given to another owner. - button.locked = FALSE - button.id = null + for(var/datum/hud/hud in viewers) + if(!hud.mymob) + continue + HideFrom(hud.mymob) + LAZYREMOVE(M.actions, src) // We aren't always properly inserted into the viewers list, gotta make sure that action's cleared + viewers = list() + + if(owner) + UnregisterSignal(owner, COMSIG_PARENT_QDELETING) + if(target == owner) + RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/clear_ref) + owner = null /datum/action/proc/Trigger() if(!IsAvailable()) @@ -125,15 +112,15 @@ /datum/action/proc/UpdateButtons(status_only, force) for(var/datum/hud/hud in viewers) var/atom/movable/screen/movable/button = viewers[hud] - UpdateButtonIcon(button, status_only, force) + UpdateButton(button, status_only, force) -/datum/action/proc/UpdateButtonIcon(status_only = FALSE, force = FALSE) +/datum/action/proc/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force = FALSE) if(!button) return if(!status_only) button.name = name button.desc = desc - if(owner && owner.hud_used && background_icon_state == ACTION_BUTTON_DEFAULT_BACKGROUND) + if(owner?.hud_used && background_icon_state == ACTION_BUTTON_DEFAULT_BACKGROUND) var/list/settings = owner.hud_used.get_action_buttons_icons() if(button.icon != settings["bg_icon"]) button.icon = settings["bg_icon"] @@ -145,25 +132,13 @@ if(button.icon_state != background_icon_state) button.icon_state = background_icon_state - if(!use_target_appearance) - ApplyIcon(button, force) - - else if(target && button.appearance_cache != target.appearance) //replace with /ref comparison if this is not valid. - var/mutable_appearance/M = new(target) - M.layer = FLOAT_LAYER - M.plane = FLOAT_PLANE - if(target_appearance_matrix) - var/list/L = target_appearance_matrix - M.transform = matrix(L[1], L[2], L[3], L[4], L[5], L[6]) - button.cut_overlays() - button.add_overlay(M) - button.appearance_cache = target.appearance - - if(!IsAvailable(TRUE)) + ApplyIcon(button, force) + + if(!IsAvailable()) button.color = transparent_when_unavailable ? rgb(128,0,0,128) : rgb(128,0,0) else button.color = rgb(255,255,255,255) - return 1 + return TRUE /datum/action/proc/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force = FALSE) if(icon_icon && button_icon_state && ((current_button.button_icon_state != button_icon_state) || force)) @@ -184,7 +159,67 @@ M.ghostize(can_reenter_corpse = TRUE, voluntary = TRUE) /datum/action/proc/OnUpdatedIcon() - addtimer(CALLBACK(src, .proc/UpdateButtonIcon), 1) //Hopefully runs after new icon overlays have been compiled. + SIGNAL_HANDLER + UpdateButtons() + +//Give our action button to the player +/datum/action/proc/GiveAction(mob/viewer) + var/datum/hud/our_hud = viewer.hud_used + if(viewers[our_hud]) // Already have a copy of us? go away + return + + LAZYOR(viewer.actions, src) // Move this in + ShowTo(viewer) + +//Adds our action button to the screen of a player +/datum/action/proc/ShowTo(mob/viewer) + var/datum/hud/our_hud = viewer.hud_used + if(!our_hud || viewers[our_hud]) // There's no point in this if you have no hud in the first place + return + + var/atom/movable/screen/movable/action_button/button = CreateButton() + SetId(button, viewer) + + button.our_hud = our_hud + viewers[our_hud] = button + if(viewer.client) + viewer.client.screen += button + + button.load_position(viewer) + viewer.update_action_buttons() + +//Removes our action button from the screen of a player +/datum/action/proc/HideFrom(mob/viewer) + var/datum/hud/our_hud = viewer.hud_used + var/atom/movable/screen/movable/action_button/button = viewers[our_hud] + LAZYREMOVE(viewer.actions, src) + if(button) + qdel(button) + +/datum/action/proc/CreateButton() + var/atom/movable/screen/movable/action_button/button = new() + button.linked_action = src + button.actiontooltipstyle = buttontooltipstyle + if(desc) + button.desc = desc + return button + +/datum/action/proc/SetId(atom/movable/screen/movable/action_button/our_button, mob/owner) + //button id generation + var/bitfield = 0 + for(var/datum/action/action in owner.actions) + if(action == src) // This could be us, which is dumb + continue + var/atom/movable/screen/movable/action_button/button = action.viewers[owner.hud_used] + if(action.name == name && button.id) + bitfield |= button.id + + bitfield = ~bitfield // Flip our possible ids, so we can check if we've found a unique one + for(var/i in 0 to 23) // We get 24 possible bitflags in dm + var/bitflag = 1 << i // Shift us over one + if(bitfield & bitflag) + our_button.id = bitflag + return //Presets for item actions /datum/action/item_action @@ -258,12 +293,14 @@ /datum/action/item_action/set_internals name = "Set Internals" -/datum/action/item_action/set_internals/UpdateButtonIcon(status_only = FALSE, force) - if(..()) //button available - if(iscarbon(owner)) - var/mob/living/carbon/C = owner - if(target == C.internal) - button.icon_state = "template_active" +/datum/action/item_action/set_internals/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force) + if(!..()) // no button available + return + if(!iscarbon(owner)) + return + var/mob/living/carbon/C = owner + if(target == C.internal) + button.icon_state = "template_active" /datum/action/item_action/pick_color name = "Choose A Color" @@ -309,9 +346,9 @@ /datum/action/item_action/toggle_unfriendly_fire/Trigger() if(..()) - UpdateButtonIcon() + UpdateButtons() -/datum/action/item_action/toggle_unfriendly_fire/UpdateButtonIcon(status_only = FALSE, force) +/datum/action/item_action/toggle_unfriendly_fire/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force) if(istype(target, /obj/item/hierophant_club)) var/obj/item/hierophant_club/H = target if(H.friendly_fire_check) @@ -380,7 +417,6 @@ /datum/action/item_action/toggle/New(Target) ..() name = "Toggle [target.name]" - button.name = name /datum/action/item_action/halt name = "HALT!" @@ -409,7 +445,6 @@ /datum/action/item_action/adjust/New(Target) ..() name = "Adjust [target.name]" - button.name = name /datum/action/item_action/switch_hud name = "Switch HUD" @@ -495,12 +530,10 @@ /datum/action/item_action/organ_action/toggle/New(Target) ..() name = "Toggle [target.name]" - button.name = name /datum/action/item_action/organ_action/use/New(Target) ..() name = "Use [target.name]" - button.name = name /datum/action/item_action/cult_dagger name = "Draw Blood Rune" @@ -509,14 +542,13 @@ button_icon_state = "draw" buttontooltipstyle = "cult" background_icon_state = "bg_demon" + default_button_position = "6:157,4:-2" /datum/action/item_action/cult_dagger/Grant(mob/M) - if(iscultist(M)) - ..() - button.screen_loc = "6:157,4:-2" - button.moved = "6:157,4:-2" - else + if(!iscultist(M)) Remove(owner) + return + return ..() /datum/action/item_action/cult_dagger/Trigger() for(var/obj/item/H in owner.held_items) //In case we were already holding another dagger @@ -643,7 +675,6 @@ icon_icon = S.action_icon button_icon_state = S.action_icon_state background_icon_state = S.action_background_icon_state - button.name = name /datum/action/spell_action/Destroy() var/obj/effect/proc_holder/S = target @@ -711,44 +742,114 @@ /datum/action/cooldown check_flags = 0 transparent_when_unavailable = FALSE + // The default cooldown applied when StartCooldown() is called var/cooldown_time = 0 + // The actual next time this ability can be used var/next_use_time = 0 - -/datum/action/cooldown/New() - ..() + // Whether or not you want the cooldown for the ability to display in text form + var/text_cooldown = TRUE + // Setting for intercepting clicks before activating the ability + var/click_to_activate = FALSE + // Shares cooldowns with other cooldown abilities of the same value, not active if null + var/shared_cooldown + +/datum/action/cooldown/CreateButton() + var/atom/movable/screen/movable/action_button/button = ..() button.maptext = "" button.maptext_x = 8 button.maptext_y = 0 button.maptext_width = 24 button.maptext_height = 12 - -/datum/action/cooldown/IsAvailable(silent = FALSE) - return next_use_time <= world.time - -/datum/action/cooldown/proc/StartCooldown() - next_use_time = world.time + cooldown_time - button.maptext = MAPTEXT_TINY_UNICODE("[round(cooldown_time/10, 0.1)]") - UpdateButtonIcon() + return button + +/datum/action/cooldown/IsAvailable() + return ..() && (next_use_time <= world.time) + +/// Starts a cooldown time to be shared with similar abilities, will use default cooldown time if an override is not specified +/datum/action/cooldown/proc/StartCooldown(override_cooldown_time) + if(shared_cooldown) + for(var/datum/action/cooldown/shared_ability in owner.actions - src) + if(shared_cooldown == shared_ability.shared_cooldown) + if(isnum(override_cooldown_time)) + shared_ability.StartCooldownSelf(override_cooldown_time) + else + shared_ability.StartCooldownSelf(cooldown_time) + StartCooldownSelf(override_cooldown_time) + +/// Starts a cooldown time for this ability only, will use default cooldown time if an override is not specified +/datum/action/cooldown/proc/StartCooldownSelf(override_cooldown_time) + if(isnum(override_cooldown_time)) + next_use_time = world.time + override_cooldown_time + else + next_use_time = world.time + cooldown_time + UpdateButtons() START_PROCESSING(SSfastprocess, src) -/datum/action/cooldown/process() +/datum/action/cooldown/Trigger(trigger_flags, atom/target) + . = ..() + if(!.) + return if(!owner) + return FALSE + if(click_to_activate) + if(target) + // For automatic / mob handling + return InterceptClickOn(owner, null, target) + if(owner.click_intercept == src) + owner.click_intercept = null + else + owner.click_intercept = src + for(var/datum/action/cooldown/ability in owner.actions) + ability.UpdateButtons() + return TRUE + return PreActivate(owner) + +/// Intercepts client owner clicks to activate the ability +/datum/action/cooldown/proc/InterceptClickOn(mob/living/caller, params, atom/target) + if(!IsAvailable()) + return FALSE + if(!target) + return FALSE + PreActivate(target) + caller.click_intercept = null + return TRUE + +/// For signal calling +/datum/action/cooldown/proc/PreActivate(atom/target) + if(SEND_SIGNAL(owner, COMSIG_MOB_ABILITY_STARTED, src) & COMPONENT_BLOCK_ABILITY_START) + return + . = Activate(target) + SEND_SIGNAL(owner, COMSIG_MOB_ABILITY_FINISHED, src) + +/// To be implemented by subtypes +/datum/action/cooldown/proc/Activate(atom/target) + return + +/datum/action/cooldown/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force = FALSE) + . = ..() + if(!button) + return + var/time_left = max(next_use_time - world.time, 0) + if(text_cooldown) + button.maptext = MAPTEXT("[round(time_left/10, 0.1)]") + if(!owner || time_left == 0) button.maptext = "" + if(IsAvailable() && owner.click_intercept == src) + button.color = COLOR_GREEN + +/datum/action/cooldown/process() + var/time_left = max(next_use_time - world.time, 0) + if(!owner || time_left == 0) STOP_PROCESSING(SSfastprocess, src) - var/timeleft = max(next_use_time - world.time, 0) - if(timeleft == 0) - button.maptext = "" - UpdateButtonIcon() - STOP_PROCESSING(SSfastprocess, src) - else - button.maptext = MAPTEXT_TINY_UNICODE("[round(cooldown_time/10, 0.1)]") + UpdateButtons() /datum/action/cooldown/Grant(mob/M) ..() - if(owner) - UpdateButtonIcon() - if(next_use_time > world.time) - START_PROCESSING(SSfastprocess, src) + if(!owner) + return + UpdateButtons() + if(next_use_time > world.time) + START_PROCESSING(SSfastprocess, src) //surf_ss13 /datum/action/item_action/bhop diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index f35389f1712f..c7e052212872 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -225,7 +225,7 @@ name = "Hide" desc = "Hide yourself from your owner's sight." button_icon_state = "hide" - UpdateButtonIcon() + UpdateButtons() /datum/action/innate/imaginary_hide/Activate() var/mob/camera/imaginary_friend/I = owner diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 00fbfc4f2464..9b144e74bf30 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1661,7 +1661,7 @@ GLOBAL_LIST(objective_choices) if(istype(S, type)) continue S.charge_counter = delay - S.updateButtonIcon() + S.UpdateButton() INVOKE_ASYNC(S, /obj/effect/proc_holder/spell.proc/start_recharge) /datum/mind/proc/get_ghost(even_if_they_cant_reenter) diff --git a/code/datums/view.dm b/code/datums/view.dm index 5610fb040ed1..7313cc4c186c 100644 --- a/code/datums/view.dm +++ b/code/datums/view.dm @@ -1,108 +1,110 @@ //This is intended to be a full wrapper. DO NOT directly modify its values ///Container for client viewsize -/datum/viewData +/datum/view_data var/width = 0 var/height = 0 var/default = "" var/is_suppressed = FALSE var/client/chief = null -/datum/viewData/New(client/owner, view_string) +/datum/view_data/New(client/owner, view_string) default = view_string chief = owner apply() -/datum/viewData/proc/setDefault(string) +/datum/view_data/proc/setDefault(string) default = string apply() -/datum/viewData/proc/safeApplyFormat() +/datum/view_data/proc/afterViewChange() if(isZooming()) assertFormat() - return - resetFormat() + else + resetFormat() + var/datum/hud/our_hud = chief?.mob?.hud_used + our_hud.view_audit_buttons() // Make sure our hud's buttons are in our new size -/datum/viewData/proc/assertFormat()//T-Pose +/datum/view_data/proc/assertFormat()//T-Pose // winset(chief, "mapwindow.map", "zoom=0") // Citadel Edit - We're using icon dropdown instead -/datum/viewData/proc/resetFormat()//Cuck +/datum/view_data/proc/resetFormat()//Cuck // winset(chief, "mapwindow.map", "zoom=[chief.prefs.pixel_size]") // Citadel Edit - We're using icon dropdown instead -/datum/viewData/proc/setZoomMode() +/datum/view_data/proc/setZoomMode() // winset(chief, "mapwindow.map", "zoom-mode=[chief.prefs.scaling_method]") // Citadel Edit - We're using icon dropdown instead -/datum/viewData/proc/isZooming() +/datum/view_data/proc/isZooming() return (width || height) -/datum/viewData/proc/resetToDefault() +/datum/view_data/proc/resetToDefault() width = 0 height = 0 apply() -/datum/viewData/proc/add(toAdd) +/datum/view_data/proc/add(toAdd) width += toAdd height += toAdd apply() -/datum/viewData/proc/addTo(toAdd) +/datum/view_data/proc/addTo(toAdd) var/list/shitcode = getviewsize(toAdd) width += shitcode[1] height += shitcode[2] apply() -/datum/viewData/proc/setTo(toAdd) +/datum/view_data/proc/setTo(toAdd) var/list/shitcode = getviewsize(toAdd) //Backward compatability to account width = shitcode[1] //for a change in how sizes get calculated. we used to include world.view in height = shitcode[2] //this, but it was jank, so I had to move it apply() -/datum/viewData/proc/setBoth(wid, hei) +/datum/view_data/proc/setBoth(wid, hei) width = wid height = hei apply() -/datum/viewData/proc/setWidth(wid) +/datum/view_data/proc/setWidth(wid) width = wid apply() -/datum/viewData/proc/setHeight(hei) +/datum/view_data/proc/setHeight(hei) width = hei apply() -/datum/viewData/proc/addToWidth(toAdd) +/datum/view_data/proc/addToWidth(toAdd) width += toAdd apply() -/datum/viewData/proc/addToHeight(screen, toAdd) +/datum/view_data/proc/addToHeight(screen, toAdd) height += toAdd apply() -/datum/viewData/proc/apply() +/datum/view_data/proc/apply() chief.change_view(getView()) - safeApplyFormat() + afterViewChange() -/datum/viewData/proc/supress() +/datum/view_data/proc/supress() is_suppressed = TRUE apply() -/datum/viewData/proc/unsupress() +/datum/view_data/proc/unsupress() is_suppressed = FALSE apply() -/datum/viewData/proc/getView() +/datum/view_data/proc/getView() var/list/temp = getviewsize(default) if(is_suppressed) return "[temp[1]]x[temp[2]]" return "[width + temp[1]]x[height + temp[2]]" -/datum/viewData/proc/zoomIn() +/datum/view_data/proc/zoomIn() resetToDefault() animate(chief, pixel_x = 0, pixel_y = 0, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW) -/datum/viewData/proc/zoomOut(radius = 0, offset = 0, direction = FALSE) +/datum/view_data/proc/zoomOut(radius = 0, offset = 0, direction = FALSE) if(direction) var/_x = 0 var/_y = 0 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4440b3f91a62..ea3531dcd020 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1283,7 +1283,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb */ /obj/item/proc/update_action_buttons(status_only = FALSE, force = FALSE) for(var/datum/action/current_action as anything in actions) - current_action.UpdateButtonIcon(status_only, force) + current_action.UpdateButtons(status_only, force) /// Special stuff you want to do when an outfit equips this item. /obj/item/proc/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 880358a2c1d1..6873b59146bd 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -173,7 +173,7 @@ update_power() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/defibrillator/proc/make_paddles() if(!combat) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 79489c3c5109..3f64be472958 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -40,7 +40,7 @@ playsound(src, on ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, TRUE) for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() return TRUE /obj/item/flashlight/DoRevenantThrowEffects(atom/target) diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index f83d01f4ef78..801befc9c608 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -129,12 +129,12 @@ /datum/action/innate/drink_fling/Activate() button_icon_state = "drinkfling_on" active = TRUE - UpdateButtonIcon() + UpdateButtons() /datum/action/innate/drink_fling/Deactivate() button_icon_state = "drinkfling_off" active = FALSE - UpdateButtonIcon() + UpdateButtons() /obj/item/book/granter/action/origami granted_action = /datum/action/innate/origami @@ -155,13 +155,13 @@ to_chat(owner, "You will now fold origami planes.") button_icon_state = "origami_on" active = TRUE - UpdateButtonIcon() + UpdateButtons() /datum/action/innate/origami/Deactivate() to_chat(owner, "You will no longer fold origami planes.") button_icon_state = "origami_off" active = FALSE - UpdateButtonIcon() + UpdateButtons() ///SPELLS/// diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 173b420710c4..d8730cc95bc1 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -719,6 +719,6 @@ user.vtec = initial(user.vtec) - maxReduction * 1 action.button_icon_state = "Chevron_State_[currentState]" - action.UpdateButtonIcon() + action.UpdateButtons() return TRUE diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 25e2f1a292d5..92e46836b064 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -50,7 +50,7 @@ to_chat(user, "You turn the jetpack off.") for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/tank/jetpack/proc/turn_on(mob/user) on = TRUE diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm index 3f1cb5f4c1a7..639180356d1b 100644 --- a/code/game/objects/structures/manned_turret.dm +++ b/code/game/objects/structures/manned_turret.dm @@ -80,7 +80,7 @@ return FALSE var/client/C = controller.client if(C) - var/atom/A = C.mouseObject + var/atom/A = WEAKREF(C.mouse_object_ref) var/turf/T = get_turf(A) if(istype(T)) //They're hovering over something in the map. direction_track(controller, T) diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 343faccad600..293b5bac4b1d 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -59,7 +59,7 @@ H.update_inv_wear_suit() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == ITEM_SLOT_OCLOTHING) //we only give the mob the ability to activate the vest if he's actually wearing it. diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index c5f1cfbb405f..a3b7fd4c0f6e 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -216,7 +216,7 @@ return // Disable Powers: Masquerade * NOTE * This should happen as a FLAW! //if (stat >= UNCONSCIOUS) - // for (var/datum/action/bloodsucker/masquerade/P in powers) + // for (var/datum/action/cooldown/bloodsucker/masquerade/P in powers) // P.Deactivate() // TEMP DEATH var/total_brute = owner.current.getBruteLoss_nonProsthetic() @@ -252,7 +252,7 @@ owner.current.update_sight() owner.current.reload_fullscreen() // Disable ALL Powers - for(var/datum/action/bloodsucker/power in powers) + for(var/datum/action/cooldown/bloodsucker/power in powers) if(power.active && !power.can_use_in_torpor) power.DeactivatePower() if(owner.current.suiciding) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm index 0a799021e974..019bbe6fbde6 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm @@ -1,22 +1,26 @@ -/datum/action/bloodsucker +/datum/action/cooldown/bloodsucker name = "Vampiric Gift" desc = "A vampiric gift." button_icon = 'icons/mob/actions/bloodsucker.dmi' //This is the file for the BACKGROUND icon background_icon_state = "vamp_power_off" //And this is the state for the background icon - var/background_icon_state_on = "vamp_power_on" // FULP: Our "ON" icon alternative. - var/background_icon_state_off = "vamp_power_off" // FULP: Our "OFF" icon alternative. icon_icon = 'icons/mob/actions/bloodsucker.dmi' //This is the file for the ACTION icon button_icon_state = "power_feed" //And this is the state for the action icon buttontooltipstyle = "cult" + transparent_when_unavailable = TRUE + + /// Cooldown you'll have to wait between each use, decreases depending on level. + cooldown_time = 2 SECONDS + + ///Background icon when the Power is active. + var/background_icon_state_on = "vamp_power_on" + ///Background icon when the Power is NOT active. + var/background_icon_state_off = "vamp_power_off" // Action-Related - //var/amPassive = FALSE // REMOVED: Just made it its own kind. // Am I just "on" at all times? (aka NO ICON) var/amTargetted = FALSE // Am I asked to choose a target when enabled? (Shows as toggled ON when armed) var/amToggle = FALSE // Can I be actively turned on and off? var/amSingleUse = FALSE // Am I removed after a single use? var/active = FALSE - var/cooldown = 20 // 10 ticks, 1 second. - var/cooldownUntil = 0 // From action.dm: next_use_time = world.time + cooldown_time // Power-Related var/level_current = 0 // Can increase to yield new abilities. Each power goes up in strength each Rank. //var/level_max = 1 // @@ -32,7 +36,7 @@ //var/not_bloodsucker = FALSE // This goes to Vassals or Hunters, but NOT bloodsuckers. var/must_be_concious = TRUE //Can't use this ability while unconcious. -/datum/action/bloodsucker/New() +/datum/action/cooldown/bloodsucker/New() if(bloodcost > 0) desc += "

COST: [bloodcost] Blood" // Modify description to add cost. if(warn_constant_cost) @@ -46,7 +50,7 @@ // click.dm <--- Where we can take over mouse clicks // spells.dm /add_ranged_ability() <--- How we take over the mouse click to use a power on a target. -/datum/action/bloodsucker/Trigger() +/datum/action/cooldown/bloodsucker/Trigger() // Active? DEACTIVATE AND END! if(active && CheckCanDeactivate(TRUE)) DeactivatePower() @@ -56,7 +60,7 @@ PayCost() if(amToggle) active = !active - UpdateButtonIcon() + UpdateButtons() if(!amToggle || !active) StartCooldown() // Must come AFTER UpdateButton(), otherwise icon will revert. ActivatePower() // NOTE: ActivatePower() freezes this power in place until it ends. @@ -65,13 +69,13 @@ if(amSingleUse) RemoveAfterUse() -/datum/action/bloodsucker/proc/CheckCanPayCost(display_error) +/datum/action/cooldown/bloodsucker/proc/CheckCanPayCost(display_error) if(!owner || !owner.mind) return FALSE // Cooldown? - if(cooldownUntil > world.time) + if(next_use_time > world.time) if(display_error) - to_chat(owner, "[src] is unavailable. Wait [(cooldownUntil - world.time) / 10] seconds.") + to_chat(owner, "[src] is unavailable. Wait [(next_use_time - world.time) / 10] seconds.") return FALSE // Have enough blood? var/mob/living/L = owner @@ -81,7 +85,7 @@ return FALSE return TRUE -/datum/action/bloodsucker/proc/CheckCanUse(display_error) // These checks can be scanned every frame while a ranged power is on. +/datum/action/cooldown/bloodsucker/proc/CheckCanUse(display_error) // These checks can be scanned every frame while a ranged power is on. if(!owner || !owner.mind) return FALSE // Torpor? @@ -123,79 +127,43 @@ return FALSE return TRUE -/datum/action/bloodsucker/proc/StartCooldown() - set waitfor = FALSE - // Alpha Out - button.color = rgb(128,0,0,128) - button.alpha = 100 - // Calculate Cooldown (by power's level) - var/this_cooldown = (cooldown_static || amSingleUse) ? cooldown : max(cooldown / 2, cooldown - (cooldown / 16 * (level_current-1))) - // NOTE: With this formula, you'll hit half cooldown at level 8 for that power. - - // Wait for cooldown - cooldownUntil = world.time + this_cooldown - spawn(this_cooldown) - // Alpha In - button.color = rgb(255,255,255,255) - button.alpha = 255 - -/datum/action/bloodsucker/proc/CheckCanDeactivate(display_error) +/datum/action/cooldown/bloodsucker/proc/CheckCanDeactivate(display_error) return TRUE -/datum/action/bloodsucker/UpdateButtonIcon(force = FALSE) +/datum/action/cooldown/bloodsucker/UpdateButton(atom/movable/screen/movable/action_button/button, force = FALSE) background_icon_state = active? background_icon_state_on : background_icon_state_off - ..()//UpdateButtonIcon() + ..()//UpdateButton() - -/datum/action/bloodsucker/proc/PayCost() +/datum/action/cooldown/bloodsucker/proc/PayCost() // owner for actions is the mob, not mind. var/mob/living/L = owner L.blood_volume -= bloodcost -/datum/action/bloodsucker/proc/ActivatePower() +/datum/action/cooldown/bloodsucker/proc/ActivatePower() -/datum/action/bloodsucker/proc/DeactivatePower(mob/living/user = owner, mob/living/target) +/datum/action/cooldown/bloodsucker/proc/DeactivatePower(mob/living/user = owner, mob/living/target) active = FALSE - UpdateButtonIcon() + UpdateButtons() StartCooldown() -/datum/action/bloodsucker/proc/ContinueActive(mob/living/user, mob/living/target) // Used by loops to make sure this power can stay active. +/datum/action/cooldown/bloodsucker/proc/ContinueActive(mob/living/user, mob/living/target) // Used by loops to make sure this power can stay active. return active && user && (!warn_constant_cost || user.blood_volume > 0) -/datum/action/bloodsucker/proc/RemoveAfterUse() +/datum/action/cooldown/bloodsucker/proc/RemoveAfterUse() // Un-Learn Me! (GO HOME var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) if (istype(bloodsuckerdatum)) bloodsuckerdatum.powers -= src Remove(owner) -/datum/action/bloodsucker/proc/Upgrade() +/datum/action/cooldown/bloodsucker/proc/Upgrade() level_current ++ -/////////////////////////////////// PASSIVE POWERS /////////////////////////////////// - -// New Type: Passive (Always on, no button) -/datum/action/bloodsucker/passive - -/datum/action/bloodsucker/passive/New() - // REMOVED: DO NOTHBING! - ..() - // Don't Display Button! (it doesn't do anything anyhow) - button.screen_loc = DEFAULT_BLOODSPELLS - button.moved = DEFAULT_BLOODSPELLS - button.ordered = FALSE - -/datum/action/bloodsucker/passive/Destroy() - if(owner) - Remove(owner) - target = null - return ..() - /////////////////////////////////// TARGETTED POWERS /////////////////////////////////// -/datum/action/bloodsucker/targeted +/datum/action/cooldown/bloodsucker/targeted // NOTE: All Targeted spells are Toggles! We just don't bother checking here. var/target_range = 99 var/message_Trigger = "Select a target." @@ -204,7 +172,7 @@ var/power_in_use = FALSE // Is this power LOCKED due to being used? -/datum/action/bloodsucker/targeted/New(Target) +/datum/action/cooldown/bloodsucker/targeted/New(Target) desc += "
\[Targeted Power\]" // Modify description to add notice that this is aimed. ..() // Create Proc Holder for intercepting clicks @@ -212,7 +180,7 @@ bs_proc_holder.linked_power = src // Click power: Begin Aim -/datum/action/bloodsucker/targeted/Trigger() +/datum/action/cooldown/bloodsucker/targeted/Trigger() if(active && CheckCanDeactivate(TRUE)) DeactivateRangedAbility() DeactivatePower() @@ -220,7 +188,7 @@ if(!CheckCanPayCost(TRUE) || !CheckCanUse(TRUE)) return active = !active - UpdateButtonIcon() + UpdateButtons() // Create & Link Targeting Proc var/mob/living/L = owner if(L.ranged_ability) @@ -230,7 +198,7 @@ if(message_Trigger != "") to_chat(owner, "[message_Trigger]") -/datum/action/bloodsucker/targeted/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/targeted/CheckCanUse(display_error) . = ..() if(!.) return @@ -238,21 +206,21 @@ return FALSE // doesn't let you remove powers if you're not there. So, let's just cancel the power entirely. return TRUE -/datum/action/bloodsucker/targeted/DeactivatePower(mob/living/user = owner, mob/living/target) +/datum/action/cooldown/bloodsucker/targeted/DeactivatePower(mob/living/user = owner, mob/living/target) // Don't run ..(), we don't want to engage the cooldown until we USE this power! active = FALSE - UpdateButtonIcon() + UpdateButtons() -/datum/action/bloodsucker/targeted/proc/DeactivateRangedAbility() +/datum/action/cooldown/bloodsucker/targeted/proc/DeactivateRangedAbility() // Only Turned off when CLICK is disabled...aka, when you successfully clicked (or bs_proc_holder.remove_ranged_ability() // Check if target is VALID (wall, turf, or character?) -/datum/action/bloodsucker/targeted/proc/CheckValidTarget(atom/A) +/datum/action/cooldown/bloodsucker/targeted/proc/CheckValidTarget(atom/A) return FALSE // FALSE targets nothing. // Check if valid target meets conditions -/datum/action/bloodsucker/targeted/proc/CheckCanTarget(atom/A, display_error) +/datum/action/cooldown/bloodsucker/targeted/proc/CheckCanTarget(atom/A, display_error) // Out of Range if(!(A in view(target_range, owner))) if(display_error && target_range > 1) // Only warn for range if it's greater than 1. Brawn doesn't need to announce itself. @@ -261,7 +229,7 @@ return istype(A) // Click Target -/datum/action/bloodsucker/targeted/proc/ClickWithPower(atom/A) +/datum/action/cooldown/bloodsucker/targeted/proc/ClickWithPower(atom/A) // CANCEL RANGED TARGET check if(power_in_use || !CheckValidTarget(A)) return FALSE @@ -276,21 +244,21 @@ power_in_use = FALSE return TRUE -/datum/action/bloodsucker/targeted/proc/FireTargetedPower(atom/A) +/datum/action/cooldown/bloodsucker/targeted/proc/FireTargetedPower(atom/A) // Like ActivatePower, but specific to Targeted (and takes an atom input). We don't use ActivatePower for targeted. -/datum/action/bloodsucker/targeted/proc/PowerActivatedSuccessfully() +/datum/action/cooldown/bloodsucker/targeted/proc/PowerActivatedSuccessfully() // The power went off! We now pay the cost of the power. PayCost() DeactivateRangedAbility() DeactivatePower() StartCooldown() // Do AFTER UpdateIcon() inside of DeactivatePower. Otherwise icon just gets wiped. -/datum/action/bloodsucker/targeted/ContinueActive(mob/living/user, mob/living/target) // Used by loops to make sure this power can stay active. +/datum/action/cooldown/bloodsucker/targeted/ContinueActive(mob/living/user, mob/living/target) // Used by loops to make sure this power can stay active. return ..() // Target Proc Holder /obj/effect/proc_holder/bloodsucker - var/datum/action/bloodsucker/targeted/linked_power + var/datum/action/cooldown/bloodsucker/targeted/linked_power /obj/effect/proc_holder/bloodsucker/remove_ranged_ability(msg) ..() diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm index a86cb374d2c9..88a4b6bb32dd 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm @@ -55,8 +55,8 @@ bloodsuckerdatum.warn_sun_locker = FALSE bloodsuckerdatum.warn_sun_burn = FALSE // Remove Dawn Powers - for(var/datum/action/bloodsucker/P in bloodsuckerdatum.powers) - if(istype(P, /datum/action/bloodsucker/gohome)) + for(var/datum/action/cooldown/bloodsucker/P in bloodsuckerdatum.powers) + if(istype(P, /datum/action/cooldown/bloodsucker/gohome)) bloodsuckerdatum.powers -= P P.Remove(M.current) nighttime_duration += 100 //Each day makes the night a minute longer. @@ -149,5 +149,5 @@ if(!istype(M) || !istype(M.current)) continue var/datum/antagonist/bloodsucker/bloodsuckerdatum = M.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) - if(istype(bloodsuckerdatum) && bloodsuckerdatum.lair && !(locate(/datum/action/bloodsucker/gohome) in bloodsuckerdatum.powers)) - bloodsuckerdatum.BuyPower(new /datum/action/bloodsucker/gohome) + if(istype(bloodsuckerdatum) && bloodsuckerdatum.lair && !(locate(/datum/action/cooldown/bloodsucker/gohome) in bloodsuckerdatum.powers)) + bloodsuckerdatum.BuyPower(new /datum/action/cooldown/bloodsucker/gohome) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_ui.dm b/code/modules/antagonists/bloodsucker/bloodsucker_ui.dm index 486ae51117a2..3edffe9c3162 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_ui.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_ui.dm @@ -14,7 +14,7 @@ dat += "
" // Step One: Decide powers you CAN buy. - for(var/pickedpower in typesof(/datum/action/bloodsucker)) + for(var/pickedpower in typesof(/datum/action/cooldown/bloodsucker)) var/obj/effect/proc_holder/spell/bloodsucker/power = pickedpower // NAME dat += "[power.name]" diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 73625c894d30..4044ac961623 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -168,7 +168,7 @@ return fullname -/datum/antagonist/bloodsucker/proc/BuyPower(datum/action/bloodsucker/power)//(obj/effect/proc_holder/spell/power) +/datum/antagonist/bloodsucker/proc/BuyPower(datum/action/cooldown/bloodsucker/power)//(obj/effect/proc_holder/spell/power) powers += power power.Grant(owner.current)// owner.AddSpell(power) @@ -177,9 +177,9 @@ add_hud() update_hud(TRUE) // Set blood value, current rank // Powers - BuyPower(new /datum/action/bloodsucker/feed) - BuyPower(new /datum/action/bloodsucker/masquerade) - BuyPower(new /datum/action/bloodsucker/veil) + BuyPower(new /datum/action/cooldown/bloodsucker/feed) + BuyPower(new /datum/action/cooldown/bloodsucker/masquerade) + BuyPower(new /datum/action/cooldown/bloodsucker/veil) // Traits for(var/T in defaultTraits) ADD_TRAIT(owner.current, T, BLOODSUCKER_TRAIT) @@ -221,7 +221,7 @@ remove_hud() // Powers while(powers.len) - var/datum/action/bloodsucker/power = pick(powers) + var/datum/action/cooldown/bloodsucker/power = pick(powers) powers -= power power.Remove(owner.current) // owner.RemoveSpell(power) @@ -267,7 +267,7 @@ to_chat(owner, "Bloodsucker Tip: If you cannot find or steal a coffin to use, you can build one from wooden planks.
") /datum/antagonist/bloodsucker/proc/LevelUpPowers() - for(var/datum/action/bloodsucker/power in powers) + for(var/datum/action/cooldown/bloodsucker/power in powers) power.level_current ++ /datum/antagonist/bloodsucker/proc/SpendRank() @@ -281,8 +281,8 @@ //TODO: Make this into a radial, or perhaps a tgui next UI // Purchase Power Prompt var/list/options = list() - for(var/pickedpower in typesof(/datum/action/bloodsucker)) - var/datum/action/bloodsucker/power = pickedpower + for(var/pickedpower in typesof(/datum/action/cooldown/bloodsucker)) + var/datum/action/cooldown/bloodsucker/power = pickedpower // If I don't own it, and I'm allowed to buy it. if(!(locate(power) in powers) && initial(power.bloodsucker_can_buy)) options[initial(power.name)] = power // TESTING: After working with TGUI, it seems you can use initial() to view the variables inside a path? @@ -303,7 +303,7 @@ to_chat(owner.current, "You dont have enough blood to thicken your blood, you need [level_bloodcost - L.blood_volume] units more!") return // Buy New Powers - var/datum/action/bloodsucker/P = options[choice] + var/datum/action/cooldown/bloodsucker/P = options[choice] AddBloodVolume(-level_bloodcost) BuyPower(new P) to_chat(owner.current, "You have used [level_bloodcost] units of blood and learned [initial(P.name)]!") diff --git a/code/modules/antagonists/bloodsucker/datum_hunter.dm b/code/modules/antagonists/bloodsucker/datum_hunter.dm index b221a83a6046..9c862fe42a3d 100644 --- a/code/modules/antagonists/bloodsucker/datum_hunter.dm +++ b/code/modules/antagonists/bloodsucker/datum_hunter.dm @@ -26,7 +26,7 @@ //owner.current.apply_status_effect(/datum/status_effect/agent_pinpointer/hunter_edition) // Give Hunter Power - var/datum/action/P = new /datum/action/bloodsucker/trackvamp + var/datum/action/P = new /datum/action/cooldown/bloodsucker/trackvamp P.Grant(owner.current) // Give Hunter Martial Arts @@ -69,7 +69,7 @@ // Take Hunter Power if (owner.current) - for (var/datum/action/bloodsucker/P in owner.current.actions) + for (var/datum/action/cooldown/bloodsucker/P in owner.current.actions) P.Remove(owner.current) // Take Hunter Martial Arts @@ -166,7 +166,7 @@ /* -/datum/action/bloodsucker/trackvamp/ +/datum/action/cooldown/bloodsucker/trackvamp/ name = "Track Monster"//"Cellular Emporium" desc = "Take a moment to look for clues of any nearby monsters.
These creatures are slippery, and often look like the crew." button_icon = 'icons/mob/actions/bloodsucker.dmi' //This is the file for the BACKGROUND icon @@ -177,7 +177,7 @@ cooldown = 300 // 10 ticks, 1 second. bloodcost = 0 -/datum/action/bloodsucker/trackvamp/ActivatePower() +/datum/action/cooldown/bloodsucker/trackvamp/ActivatePower() var/mob/living/user = owner to_chat(user, "You look around, scanning your environment and discerning signs of any filthy, wretched affronts to the natural order.") @@ -192,7 +192,7 @@ // NOTE: DON'T DEACTIVATE! //DeactivatePower() -/datum/action/bloodsucker/trackvamp/proc/display_proximity() +/datum/action/cooldown/bloodsucker/trackvamp/proc/display_proximity() // Pick target var/turf/my_loc = get_turf(owner) //var/list/mob/living/carbon/vamps = list() diff --git a/code/modules/antagonists/bloodsucker/datum_vassal.dm b/code/modules/antagonists/bloodsucker/datum_vassal.dm index 5162897d60c3..9a2e3a1ae651 100644 --- a/code/modules/antagonists/bloodsucker/datum_vassal.dm +++ b/code/modules/antagonists/bloodsucker/datum_vassal.dm @@ -38,7 +38,7 @@ // Master Pinpointer owner.current.apply_status_effect(/datum/status_effect/agent_pinpointer/vassal_edition) // Powers - var/datum/action/bloodsucker/vassal/recuperate/new_Recuperate = new () + var/datum/action/cooldown/bloodsucker/vassal/recuperate/new_Recuperate = new () new_Recuperate.Grant(owner.current) powers += new_Recuperate // Give Vassal Objective diff --git a/code/modules/antagonists/bloodsucker/powers/brawn.dm b/code/modules/antagonists/bloodsucker/powers/brawn.dm index db3ce92ec171..25a04d16cc18 100644 --- a/code/modules/antagonists/bloodsucker/powers/brawn.dm +++ b/code/modules/antagonists/bloodsucker/powers/brawn.dm @@ -1,11 +1,11 @@ -/datum/action/bloodsucker/targeted/brawn +/datum/action/cooldown/bloodsucker/targeted/brawn name = "Brawn" desc = "Snap restraints with ease, or deal terrible damage with your bare hands." button_icon_state = "power_strength" bloodcost = 10 - cooldown = 90 + cooldown_time = 90 target_range = 1 power_activates_immediately = TRUE message_Trigger = ""//"Whom will you subvert to your will?" @@ -16,7 +16,7 @@ var/upgrade_canLocker = FALSE var/upgrade_canDoor = FALSE -/datum/action/bloodsucker/targeted/brawn/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/targeted/brawn/CheckCanUse(display_error) . = ..() if(!.) return @@ -38,10 +38,10 @@ // NOTE: We use . = FALSE so that we can break cuffs AND throw off our attacker in one use! //return TRUE -/datum/action/bloodsucker/targeted/brawn/CheckValidTarget(atom/A) +/datum/action/cooldown/bloodsucker/targeted/brawn/CheckValidTarget(atom/A) return isliving(A) || istype(A, /obj/machinery/door) -/datum/action/bloodsucker/targeted/brawn/CheckCanTarget(atom/A, display_error) +/datum/action/cooldown/bloodsucker/targeted/brawn/CheckCanTarget(atom/A, display_error) // DEFAULT CHECKS (Distance) if(!..()) // Disable range notice for Brawn. return FALSE @@ -59,7 +59,7 @@ return TRUE return ..() // yes, FALSE! You failed if you got here! BAD TARGET -/datum/action/bloodsucker/targeted/brawn/FireTargetedPower(atom/A) +/datum/action/cooldown/bloodsucker/targeted/brawn/FireTargetedPower(atom/A) // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done. var/mob/living/carbon/target = A var/mob/living/user = owner @@ -97,7 +97,7 @@ D.open(2) // open(2) is like a crowbar or jaws of life. // Target Type: Closet -/datum/action/bloodsucker/targeted/brawn/proc/CheckBreakRestraints() +/datum/action/cooldown/bloodsucker/targeted/brawn/proc/CheckBreakRestraints() if(!iscarbon(owner)) // || !owner.restrained() return FALSE // (NOTE: Just like biodegrade.dm, we only remove one thing per use // @@ -131,7 +131,7 @@ return TRUE return FALSE -/datum/action/bloodsucker/targeted/brawn/proc/CheckEscapePuller() +/datum/action/cooldown/bloodsucker/targeted/brawn/proc/CheckEscapePuller() if(!owner.pulledby)// || owner.pulledby.grab_state <= GRAB_PASSIVE) return FALSE var/mob/M = owner.pulledby @@ -153,7 +153,7 @@ owner.pulledby = null // It's already done, but JUST IN CASE. return TRUE /* Doesnt work -/datum/action/bloodsucker/targeted/brawn/proc/CheckBreakLocker() +/datum/action/cooldown/bloodsucker/targeted/brawn/proc/CheckBreakLocker() if(!istype(owner.loc, /obj/structure/closet)) return FALSE playsound(get_turf(owner), 'sound/machines/airlock_alien_prying.ogg', 40, 1, -1) diff --git a/code/modules/antagonists/bloodsucker/powers/cloak.dm b/code/modules/antagonists/bloodsucker/powers/cloak.dm index 5383e8c1ac1a..cb3a1e9fcf04 100644 --- a/code/modules/antagonists/bloodsucker/powers/cloak.dm +++ b/code/modules/antagonists/bloodsucker/powers/cloak.dm @@ -1,11 +1,11 @@ -/datum/action/bloodsucker/cloak +/datum/action/cooldown/bloodsucker/cloak name = "Cloak of Darkness" desc = "Blend into the shadows and become invisible to the untrained eye. Movement is slowed in brightly lit areas, and you cannot dissapear while mortals watch you." button_icon_state = "power_cloak" bloodcost = 5 - cooldown = 50 + cooldown_time = 50 bloodsucker_can_buy = TRUE amToggle = TRUE warn_constant_cost = TRUE @@ -14,7 +14,7 @@ var/walk_threshold = 0.4 // arbitrary number, to be changed. edit in last commit: this is fine after testing on box station for a bit var/lum -/datum/action/bloodsucker/cloak/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/cloak/CheckCanUse(display_error) . = ..() if(!.) return @@ -24,7 +24,7 @@ return FALSE return TRUE -/datum/action/bloodsucker/cloak/ActivatePower() +/datum/action/cooldown/bloodsucker/cloak/ActivatePower() var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) var/mob/living/user = owner @@ -52,7 +52,7 @@ sleep(5) // Check every few ticks -/datum/action/bloodsucker/cloak/ContinueActive(mob/living/user, mob/living/target) +/datum/action/cooldown/bloodsucker/cloak/ContinueActive(mob/living/user, mob/living/target) if (!..()) return FALSE if(user.stat == !CONSCIOUS) // Must be CONSCIOUS @@ -60,7 +60,7 @@ return FALSE return TRUE -/datum/action/bloodsucker/cloak/DeactivatePower(mob/living/user = owner, mob/living/target) +/datum/action/cooldown/bloodsucker/cloak/DeactivatePower(mob/living/user = owner, mob/living/target) ..() REMOVE_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness") user.alpha = 255 diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm index a4bdcfee540a..b6b3c6be3e5b 100644 --- a/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -1,12 +1,12 @@ -/datum/action/bloodsucker/feed +/datum/action/cooldown/bloodsucker/feed name = "Feed" desc = "Draw the heartsblood of living victims in your grasp.
None/Passive: Feed silently and unnoticed by your victim.
Aggressive: Subdue your target quickly." button_icon_state = "power_feed" bloodcost = 0 - cooldown = 30 + cooldown_time = 30 amToggle = TRUE bloodsucker_can_buy = TRUE can_be_staked = TRUE @@ -16,7 +16,7 @@ var/mob/living/feed_target // So we can validate more than just the guy we're grappling. var/target_grappled = FALSE // If you started grappled, then ending it will end your Feed. -/datum/action/bloodsucker/feed/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/feed/CheckCanUse(display_error) . = ..() if(!.) return @@ -33,7 +33,7 @@ // DONE! return TRUE -/datum/action/bloodsucker/feed/proc/ValidateTarget(mob/living/target, display_error) // Called twice: validating a subtle victim, or validating your grapple victim. +/datum/action/cooldown/bloodsucker/feed/proc/ValidateTarget(mob/living/target, display_error) // Called twice: validating a subtle victim, or validating your grapple victim. // Bloodsuckers + Animals MUST be grabbed aggressively! if(!owner.pulling || target == owner.pulling && owner.grab_state < GRAB_AGGRESSIVE) // NOTE: It's OKAY that we are checking if(!target) below, AFTER animals here. We want passive check vs animal to warn you first, THEN the standard warning. @@ -76,7 +76,7 @@ return TRUE // If I'm not grabbing someone, find me someone nearby. -/datum/action/bloodsucker/feed/proc/FindMyTarget(display_error) +/datum/action/cooldown/bloodsucker/feed/proc/FindMyTarget(display_error) // Default feed_target = null target_grappled = FALSE @@ -132,7 +132,7 @@ feed_target = pick(targets_valid)//targets[1] return TRUE -/datum/action/bloodsucker/feed/ActivatePower() +/datum/action/cooldown/bloodsucker/feed/ActivatePower() // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up Activate(), so Deactivate() can happen after. var/mob/living/target = feed_target // Stored during CheckCanUse(). Can be a grabbed OR adjecent character. var/mob/living/user = owner @@ -302,16 +302,16 @@ CheckKilledTarget(user,target) -/datum/action/bloodsucker/feed/proc/CheckKilledTarget(mob/living/user, mob/living/target) +/datum/action/cooldown/bloodsucker/feed/proc/CheckKilledTarget(mob/living/user, mob/living/target) // Bad Bloodsucker. You shouldn't do that. if(target && target.stat >= DEAD && ishuman(target)) SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "drankkilled", /datum/mood_event/drankkilled) // BAD // in bloodsucker_life.dm -/datum/action/bloodsucker/feed/ContinueActive(mob/living/user, mob/living/target) +/datum/action/cooldown/bloodsucker/feed/ContinueActive(mob/living/user, mob/living/target) return ..() && target && (!target_grappled || user.pulling == target) && blood_sucking_checks(target, TRUE, TRUE) // Active, and still antag, // NOTE: We only care about pulling if target started off that way. Mostly only important for Aggressive feed. -/datum/action/bloodsucker/feed/proc/ApplyVictimEffects(mob/living/target) +/datum/action/cooldown/bloodsucker/feed/proc/ApplyVictimEffects(mob/living/target) // Bloodsuckers not affected by "the Kiss" of another vampire if(!target.mind || !target.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) target.Unconscious(50,0) @@ -320,7 +320,7 @@ if(ishuman(target)) target.adjustStaminaLoss(5, forced = TRUE)// Base Stamina Damage -/datum/action/bloodsucker/feed/DeactivatePower(mob/living/user = owner, mob/living/target) +/datum/action/cooldown/bloodsucker/feed/DeactivatePower(mob/living/user = owner, mob/living/target) ..() // activate = FALSE var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) // No longer Feeding diff --git a/code/modules/antagonists/bloodsucker/powers/fortitude.dm b/code/modules/antagonists/bloodsucker/powers/fortitude.dm index 740ec817820d..c3432709109e 100644 --- a/code/modules/antagonists/bloodsucker/powers/fortitude.dm +++ b/code/modules/antagonists/bloodsucker/powers/fortitude.dm @@ -2,12 +2,12 @@ -/datum/action/bloodsucker/fortitude +/datum/action/cooldown/bloodsucker/fortitude name = "Fortitude" desc = "Withstand egregious physical wounds and walk away from attacks that would stun, pierce, and dismember lesser beings. You cannot run while active." button_icon_state = "power_fortitude" bloodcost = 30 - cooldown = 80 + cooldown_time = 80 bloodsucker_can_buy = TRUE amToggle = TRUE warn_constant_cost = TRUE @@ -15,7 +15,7 @@ var/fortitude_resist // So we can raise and lower your brute resist based on what your level_current WAS. -/datum/action/bloodsucker/fortitude/ActivatePower() +/datum/action/cooldown/bloodsucker/fortitude/ActivatePower() var/datum/antagonist/bloodsucker/B = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) var/mob/living/user = owner to_chat(user, "Your flesh, skin, and muscles become as steel.") @@ -47,8 +47,8 @@ B.AddBloodVolume(-0.5) sleep(20) // Check every few ticks that we haven't disabled this power // Return to Running (if you were before) - -/datum/action/bloodsucker/fortitude/DeactivatePower(mob/living/user = owner, mob/living/target) + +/datum/action/cooldown/bloodsucker/fortitude/DeactivatePower(mob/living/user = owner, mob/living/target) ..() // Restore Traits & Effects REMOVE_TRAIT(user, TRAIT_PIERCEIMMUNE, "fortitude") diff --git a/code/modules/antagonists/bloodsucker/powers/go_home.dm b/code/modules/antagonists/bloodsucker/powers/go_home.dm index a8060ad07e7b..e78b9089fb96 100644 --- a/code/modules/antagonists/bloodsucker/powers/go_home.dm +++ b/code/modules/antagonists/bloodsucker/powers/go_home.dm @@ -1,6 +1,6 @@ -/datum/action/bloodsucker/gohome +/datum/action/cooldown/bloodsucker/gohome name = "Vanishing Act" desc = "As dawn aproaches, disperse into mist and return directly to your Lair.
WARNING: You will drop ALL of your possessions if observed by mortals." button_icon_state = "power_gohome" @@ -8,7 +8,7 @@ background_icon_state_off = "vamp_power_off_oneshot" bloodcost = 100 - cooldown = 99999 // It'll never come back. + cooldown_time = 99999 // It'll never come back. amToggle = FALSE amSingleUse = TRUE @@ -18,7 +18,7 @@ can_be_immobilized = TRUE must_be_concious = FALSE -/datum/action/bloodsucker/gohome/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/gohome/CheckCanUse(display_error) . = ..() if(!.) return @@ -30,12 +30,12 @@ return FALSE return TRUE -/datum/action/bloodsucker/gohome/proc/flicker_lights(var/flicker_range, var/beat_volume) +/datum/action/cooldown/bloodsucker/gohome/proc/flicker_lights(var/flicker_range, var/beat_volume) for(var/obj/machinery/light/L in view(flicker_range, get_turf(owner))) playsound(get_turf(owner), 'sound/effects/singlebeat.ogg', beat_volume, 1) -/datum/action/bloodsucker/gohome/ActivatePower() +/datum/action/cooldown/bloodsucker/gohome/ActivatePower() var/mob/living/carbon/user = owner var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) // IMPORTANT: Check for lair at every step! It might get destroyed. diff --git a/code/modules/antagonists/bloodsucker/powers/haste.dm b/code/modules/antagonists/bloodsucker/powers/haste.dm index 05e2cd033060..6f7ff5474911 100644 --- a/code/modules/antagonists/bloodsucker/powers/haste.dm +++ b/code/modules/antagonists/bloodsucker/powers/haste.dm @@ -3,12 +3,12 @@ // Level 2: Dodge Bullets // Level 3: Stun People Passed -/datum/action/bloodsucker/targeted/haste +/datum/action/cooldown/bloodsucker/targeted/haste name = "Immortal Haste" desc = "Dash somewhere with supernatural speed. Those nearby may be knocked away, stunned, or left empty-handed." button_icon_state = "power_speed" bloodcost = 6 - cooldown = 120 + cooldown_time = 120 target_range = 15 power_activates_immediately = TRUE message_Trigger = ""//"Whom will you subvert to your will?" @@ -18,7 +18,7 @@ /// If set, uses this speed in deciseconds instead of world.tick_lag var/speed_override -/datum/action/bloodsucker/targeted/haste/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/targeted/haste/CheckCanUse(display_error) . = ..() if(!.) return @@ -33,10 +33,10 @@ return FALSE return TRUE -/datum/action/bloodsucker/targeted/haste/CheckValidTarget(atom/A) +/datum/action/cooldown/bloodsucker/targeted/haste/CheckValidTarget(atom/A) return isturf(A) || A.loc != owner.loc // Anything will do, if it's not me or my square -/datum/action/bloodsucker/targeted/haste/CheckCanTarget(atom/A, display_error) +/datum/action/cooldown/bloodsucker/targeted/haste/CheckCanTarget(atom/A, display_error) // DEFAULT CHECKS (Distance) if (!..()) return FALSE @@ -45,7 +45,7 @@ // return FALSE return TRUE -/datum/action/bloodsucker/targeted/haste/FireTargetedPower(atom/A) +/datum/action/cooldown/bloodsucker/targeted/haste/FireTargetedPower(atom/A) // This is a non-async proc to make sure the power is "locked" until this finishes. hit = list() RegisterSignal(owner, COMSIG_MOVABLE_MOVED, .proc/on_move) @@ -78,11 +78,11 @@ hit = null user.update_mobility() -/datum/action/bloodsucker/targeted/haste/DeactivatePower(mob/living/user = owner, mob/living/target) +/datum/action/cooldown/bloodsucker/targeted/haste/DeactivatePower(mob/living/user = owner, mob/living/target) ..() // activate = FALSE user.update_mobility() -/datum/action/bloodsucker/targeted/haste/proc/on_move() +/datum/action/cooldown/bloodsucker/targeted/haste/proc/on_move() for(var/mob/living/L in dview(1, get_turf(owner))) if(!hit[L] && (L != owner)) hit[L] = TRUE diff --git a/code/modules/antagonists/bloodsucker/powers/lunge.dm b/code/modules/antagonists/bloodsucker/powers/lunge.dm index db7868fa8a5c..5cd1a52e3935 100644 --- a/code/modules/antagonists/bloodsucker/powers/lunge.dm +++ b/code/modules/antagonists/bloodsucker/powers/lunge.dm @@ -1,25 +1,25 @@ -/datum/action/bloodsucker/lunge +/datum/action/cooldown/bloodsucker/lunge name = "Predatory Lunge" desc = "Prepare the strenght to grapple your prey." button_icon_state = "power_lunge" bloodcost = 10 - cooldown = 30 + cooldown_time = 30 bloodsucker_can_buy = TRUE warn_constant_cost = TRUE amToggle = TRUE var/leap_skill_mod = 5 -/datum/action/bloodsucker/lunge/New() +/datum/action/cooldown/bloodsucker/lunge/New() . = ..() - -/datum/action/bloodsucker/lunge/Destroy() + +/datum/action/cooldown/bloodsucker/lunge/Destroy() . = ..() UnregisterSignal(owner, COMSIG_CARBON_TACKLED) -/datum/action/bloodsucker/lunge/ActivatePower() +/datum/action/cooldown/bloodsucker/lunge/ActivatePower() var/mob/living/carbon/user = owner var/datum/antagonist/bloodsucker/B = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) var/datum/component/tackler/T = user.LoadComponent(/datum/component/tackler) @@ -37,10 +37,10 @@ sleep(5) //Without this, the leap component would get removed too early, causing the normal crash into effects. -/datum/action/bloodsucker/lunge/proc/DelayedDeactivatePower() +/datum/action/cooldown/bloodsucker/lunge/proc/DelayedDeactivatePower() addtimer(CALLBACK(src, .proc/DeactivatePower), 1 SECONDS, TIMER_UNIQUE) -/datum/action/bloodsucker/lunge/DeactivatePower(mob/living/user = owner) +/datum/action/cooldown/bloodsucker/lunge/DeactivatePower(mob/living/user = owner) . = ..() qdel(user.GetComponent(/datum/component/tackler)) UnregisterSignal(user, COMSIG_CARBON_TACKLED) diff --git a/code/modules/antagonists/bloodsucker/powers/masquerade.dm b/code/modules/antagonists/bloodsucker/powers/masquerade.dm index f4ce531ef0d3..78748a3c8028 100644 --- a/code/modules/antagonists/bloodsucker/powers/masquerade.dm +++ b/code/modules/antagonists/bloodsucker/powers/masquerade.dm @@ -16,12 +16,12 @@ // - -/datum/action/bloodsucker/masquerade +/datum/action/cooldown/bloodsucker/masquerade name = "Masquerade" desc = "Feign the vital signs of a mortal, and escape both casual and medical notice as the monster you truly are." button_icon_state = "power_human" bloodcost = 10 - cooldown = 50 + cooldown_time = 50 amToggle = TRUE bloodsucker_can_buy = TRUE warn_constant_cost = TRUE @@ -31,7 +31,7 @@ // NOTE: Firing off vulgar powers disables your Masquerade! -/*/datum/action/bloodsucker/masquerade/CheckCanUse(display_error) +/*/datum/action/cooldown/bloodsucker/masquerade/CheckCanUse(display_error) if(!..(display_error))// DEFAULT CHECKS return FALSE // DONE! @@ -39,7 +39,7 @@ */ -/datum/action/bloodsucker/masquerade/ActivatePower() +/datum/action/cooldown/bloodsucker/masquerade/ActivatePower() var/mob/living/user = owner var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) @@ -78,14 +78,14 @@ sleep(20) // Check every few ticks that we haven't disabled this power -/datum/action/bloodsucker/masquerade/ContinueActive(mob/living/user) +/datum/action/cooldown/bloodsucker/masquerade/ContinueActive(mob/living/user) // Disable if unable to use power anymore. //if (user.stat == DEAD || user.blood_volume <= 0) // not conscious or soft critor uncon, just dead // return FALSE return ..() // Active, and still Antag -/datum/action/bloodsucker/masquerade/DeactivatePower(mob/living/user = owner, mob/living/target) +/datum/action/cooldown/bloodsucker/masquerade/DeactivatePower(mob/living/user = owner, mob/living/target) ..() // activate = FALSE var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) diff --git a/code/modules/antagonists/bloodsucker/powers/mesmerize.dm b/code/modules/antagonists/bloodsucker/powers/mesmerize.dm index 25f50d7af4b6..ba6c4634f51e 100644 --- a/code/modules/antagonists/bloodsucker/powers/mesmerize.dm +++ b/code/modules/antagonists/bloodsucker/powers/mesmerize.dm @@ -5,12 +5,12 @@ // FOLLOW: Target follows you, spouting random phrases from their history (or maybe Polly's or NPC's vocab?) // ATTACK: Target finds a nearby non-Bloodsucker victim to attack. -/datum/action/bloodsucker/targeted/mesmerize +/datum/action/cooldown/bloodsucker/targeted/mesmerize name = "Mesmerize" desc = "Dominate the mind of a mortal who can see your eyes." button_icon_state = "power_mez" bloodcost = 30 - cooldown = 300 + cooldown_time = 300 target_range = 2 power_activates_immediately = TRUE message_Trigger = "Whom will you subvert to your will?" @@ -18,7 +18,7 @@ bloodsucker_can_buy = TRUE var/success -/datum/action/bloodsucker/targeted/mesmerize/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/targeted/mesmerize/CheckCanUse(display_error) . = ..() if(!.) return @@ -34,10 +34,10 @@ return FALSE return TRUE -/datum/action/bloodsucker/targeted/mesmerize/CheckValidTarget(atom/A) +/datum/action/cooldown/bloodsucker/targeted/mesmerize/CheckValidTarget(atom/A) return iscarbon(A) -/datum/action/bloodsucker/targeted/mesmerize/CheckCanTarget(atom/A,display_error) +/datum/action/cooldown/bloodsucker/targeted/mesmerize/CheckCanTarget(atom/A,display_error) // Check: Self if(A == owner) return FALSE @@ -88,7 +88,7 @@ return FALSE return TRUE -/datum/action/bloodsucker/targeted/mesmerize/proc/ContinueTarget(atom/A) +/datum/action/cooldown/bloodsucker/targeted/mesmerize/proc/ContinueTarget(atom/A) var/mob/living/carbon/target = A var/mob/living/L = owner @@ -103,7 +103,7 @@ to_chat(L, "[target] has escaped your gaze!") UnregisterSignal(target, COMSIG_MOVABLE_MOVED) -/datum/action/bloodsucker/targeted/mesmerize/FireTargetedPower(atom/A) +/datum/action/cooldown/bloodsucker/targeted/mesmerize/FireTargetedPower(atom/A) // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done. var/mob/living/carbon/target = A var/mob/living/L = owner @@ -118,7 +118,7 @@ // 5 second windup addtimer(CALLBACK(src, .proc/apply_effects, L, target, power_time), 6 SECONDS) -/datum/action/bloodsucker/targeted/mesmerize/proc/apply_effects(aggressor, victim, power_time) +/datum/action/cooldown/bloodsucker/targeted/mesmerize/proc/apply_effects(aggressor, victim, power_time) var/mob/living/carbon/target = victim var/mob/living/L = aggressor if(!success) @@ -135,5 +135,5 @@ to_chat(L, "[target] has snapped out of their trance.") -/datum/action/bloodsucker/targeted/mesmerize/ContinueActive(mob/living/user, mob/living/target) +/datum/action/cooldown/bloodsucker/targeted/mesmerize/ContinueActive(mob/living/user, mob/living/target) return ..() && CheckCanUse() && CheckCanTarget(target) diff --git a/code/modules/antagonists/bloodsucker/powers/recuperate.dm b/code/modules/antagonists/bloodsucker/powers/recuperate.dm index 90a2e3ff38f5..6f6b204299a5 100644 --- a/code/modules/antagonists/bloodsucker/powers/recuperate.dm +++ b/code/modules/antagonists/bloodsucker/powers/recuperate.dm @@ -1,12 +1,12 @@ -/datum/action/bloodsucker/vassal/recuperate +/datum/action/cooldown/bloodsucker/vassal/recuperate name = "Sanguine Recuperation" desc = "Slowly heal brute damage while active. This process is exhausting, and requires some of your tainted blood." button_icon_state = "power_recup" amToggle = TRUE bloodcost = 5 - cooldown = 100 + cooldown_time = 100 -/datum/action/bloodsucker/vassal/recuperate/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/vassal/recuperate/CheckCanUse(display_error) . = ..() if(!.) return @@ -14,7 +14,7 @@ return FALSE return TRUE -/datum/action/bloodsucker/vassal/recuperate/ActivatePower() +/datum/action/cooldown/bloodsucker/vassal/recuperate/ActivatePower() to_chat(owner, "Your muscles clench and your skin crawls as your master's immortal blood knits your wounds and gives you stamina.") var/mob/living/carbon/C = owner var/mob/living/carbon/human/H @@ -35,5 +35,5 @@ // DONE! //DeactivatePower(owner) -/datum/action/bloodsucker/vassal/recuperate/ContinueActive(mob/living/user, mob/living/target) +/datum/action/cooldown/bloodsucker/vassal/recuperate/ContinueActive(mob/living/user, mob/living/target) return ..() && user.stat <= DEAD && user.blood_volume > 500 diff --git a/code/modules/antagonists/bloodsucker/powers/trespass.dm b/code/modules/antagonists/bloodsucker/powers/trespass.dm index 56b72a562ec7..9a64fe8cb3ce 100644 --- a/code/modules/antagonists/bloodsucker/powers/trespass.dm +++ b/code/modules/antagonists/bloodsucker/powers/trespass.dm @@ -1,12 +1,12 @@ -/datum/action/bloodsucker/targeted/trespass +/datum/action/cooldown/bloodsucker/targeted/trespass name = "Trespass" desc = "Become mist and advance two tiles in one direction, ignoring all obstacles except for walls. Useful for skipping past doors and barricades." button_icon_state = "power_tres" bloodcost = 10 - cooldown = 80 + cooldown_time = 80 amToggle = FALSE //target_range = 2 @@ -16,7 +16,7 @@ var/turf/target_turf // We need to decide where we're going based on where we clicked. It's not actually the tile we clicked. -/datum/action/bloodsucker/targeted/trespass/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/targeted/trespass/CheckCanUse(display_error) . = ..() if(!.) return @@ -26,7 +26,7 @@ return TRUE -/datum/action/bloodsucker/targeted/trespass/CheckValidTarget(atom/A) +/datum/action/cooldown/bloodsucker/targeted/trespass/CheckValidTarget(atom/A) // Can't target my tile if(A == get_turf(owner) || get_turf(A) == get_turf(owner)) return FALSE @@ -34,7 +34,7 @@ return TRUE // All we care about is destination. Anything you click is fine. -/datum/action/bloodsucker/targeted/trespass/CheckCanTarget(atom/A, display_error) +/datum/action/cooldown/bloodsucker/targeted/trespass/CheckCanTarget(atom/A, display_error) // NOTE: Do NOT use ..()! We don't want to check distance or anything. // Get clicked tile @@ -60,7 +60,7 @@ return TRUE -/datum/action/bloodsucker/targeted/trespass/FireTargetedPower(atom/A) +/datum/action/cooldown/bloodsucker/targeted/trespass/FireTargetedPower(atom/A) // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done. // Find target turf, at or below Atom @@ -87,7 +87,7 @@ user.invisibility = INVISIBILITY_MAXIMUM // LOSE CUFFS - + // Wait... sleep(mist_delay / 2) diff --git a/code/modules/antagonists/bloodsucker/powers/veil.dm b/code/modules/antagonists/bloodsucker/powers/veil.dm index b170b9d442fe..9b04a6f774e8 100644 --- a/code/modules/antagonists/bloodsucker/powers/veil.dm +++ b/code/modules/antagonists/bloodsucker/powers/veil.dm @@ -1,10 +1,10 @@ -/datum/action/bloodsucker/veil +/datum/action/cooldown/bloodsucker/veil name = "Veil of Many Faces" desc = "Disguise yourself in the illusion of another identity." button_icon_state = "power_veil" bloodcost = 15 - cooldown = 100 + cooldown_time = 100 amToggle = TRUE bloodsucker_can_buy = TRUE warn_constant_cost = TRUE @@ -29,7 +29,7 @@ var/list/prev_features // For lizards and such -/datum/action/bloodsucker/veil/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/veil/CheckCanUse(display_error) . = ..() if(!.) return @@ -37,7 +37,7 @@ return TRUE -/datum/action/bloodsucker/veil/ActivatePower() +/datum/action/cooldown/bloodsucker/veil/ActivatePower() cast_effect() // POOF @@ -47,14 +47,14 @@ Disguise_FaceName() -/datum/action/bloodsucker/veil/proc/Disguise_Outfit() +/datum/action/cooldown/bloodsucker/veil/proc/Disguise_Outfit() // Step One: Back up original items -/datum/action/bloodsucker/veil/proc/Disguise_FaceName() +/datum/action/cooldown/bloodsucker/veil/proc/Disguise_FaceName() // Change Name/Voice var/mob/living/carbon/human/H = owner @@ -112,7 +112,7 @@ sleep(50) -/datum/action/bloodsucker/veil/DeactivatePower(mob/living/user = owner, mob/living/target) +/datum/action/cooldown/bloodsucker/veil/DeactivatePower(mob/living/user = owner, mob/living/target) ..() if (ishuman(user)) var/mob/living/carbon/human/H = user @@ -149,7 +149,7 @@ cast_effect() // POOF // CAST EFFECT // // General effect (poof, splat, etc) when you cast. Doesn't happen automatically! -/datum/action/bloodsucker/veil/proc/cast_effect() +/datum/action/cooldown/bloodsucker/veil/proc/cast_effect() // Effect playsound(get_turf(owner), 'sound/magic/smoke.ogg', 20, 1) var/datum/effect_system/steam_spread/puff = new /datum/effect_system/steam_spread/() diff --git a/code/modules/antagonists/changeling/cellular_emporium.dm b/code/modules/antagonists/changeling/cellular_emporium.dm index d825fa048e75..3e48fca317d9 100644 --- a/code/modules/antagonists/changeling/cellular_emporium.dm +++ b/code/modules/antagonists/changeling/cellular_emporium.dm @@ -80,7 +80,6 @@ /datum/action/innate/cellular_emporium/New(our_target) . = ..() - button.name = name if(istype(our_target, /datum/cellular_emporium)) cellular_emporium = our_target else diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm index 7ce9da633ea3..714150fc9375 100644 --- a/code/modules/antagonists/changeling/powers/fakedeath.dm +++ b/code/modules/antagonists/changeling/powers/fakedeath.dm @@ -44,7 +44,7 @@ name = "Reviving Stasis" desc = "We fall into a stasis, allowing us to regenerate and trick our enemies. Costs 15 chemicals." button_icon_state = "fake_death" - UpdateButtonIcon() + UpdateButtons() chemical_cost = 15 to_chat(user, "We have revived ourselves.") @@ -56,7 +56,7 @@ name = "Revive" desc = "We arise once more." button_icon_state = "revive" - UpdateButtonIcon() + UpdateButtons() chemical_cost = 0 revive_ready = TRUE diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm index 3298196de79f..c4528b6ebc67 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm @@ -411,6 +411,6 @@ Q.name = "[quickbind_slot.name] ([Q.scripture_index])" Q.desc = quickbind_slot.quickbind_desc Q.button_icon_state = quickbind_slot.name - Q.UpdateButtonIcon() + Q.UpdateButtons() if(isliving(loc)) Q.Grant(loc) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 0efde2d3dbd0..93280c422207 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -2,16 +2,11 @@ name = "Prepare Blood Magic" button_icon_state = "carve" desc = "Prepare blood magic by carving runes into your flesh. This rite is most effective with an empowering rune" + default_button_position = DEFAULT_BLOODSPELLS var/list/spells = list() var/channeling = FALSE var/holy_dispel = FALSE -/datum/action/innate/cult/blood_magic/Grant() - ..() - button.screen_loc = DEFAULT_BLOODSPELLS - button.moved = DEFAULT_BLOODSPELLS - button.ordered = FALSE - /datum/action/innate/cult/blood_magic/Remove() for(var/X in spells) qdel(X) @@ -23,15 +18,21 @@ return ..() /datum/action/innate/cult/blood_magic/proc/Positioning() - var/list/screen_loc_split = splittext(button.screen_loc,",") - var/list/screen_loc_X = splittext(screen_loc_split[1],":") - var/list/screen_loc_Y = splittext(screen_loc_split[2],":") - var/pix_X = text2num(screen_loc_X[2]) - for(var/datum/action/innate/cult/blood_spell/B in spells) - if(B.button.locked) - var/order = pix_X+spells.Find(B)*31 - B.button.screen_loc = "[screen_loc_X[1]]:[order],[screen_loc_Y[1]]:[screen_loc_Y[2]]" - B.button.moved = B.button.screen_loc + for(var/datum/hud/hud as anything in viewers) + var/our_view = hud.mymob?.client?.view || "15x15" + var/atom/movable/screen/movable/action_button/button = viewers[hud] + var/position = screen_loc_to_offset(button.screen_loc) + var/spells_iterated = 0 + for(var/datum/action/innate/cult/blood_spell/blood_spell in spells) + spells_iterated += 1 + if(blood_spell.positioned) + continue + var/atom/movable/screen/movable/action_button/moving_button = blood_spell.viewers[hud] + if(!moving_button) + continue + var/our_x = position[1] + spells_iterated * world.icon_size // Offset any new buttons into our list + hud.position_action(moving_button, offset_to_screen_loc(our_x, position[2], our_view)) + blood_spell.positioned = TRUE /datum/action/innate/cult/blood_magic/Activate() if(holy_dispel) @@ -99,6 +100,8 @@ var/base_desc //To allow for updating tooltips var/invocation var/health_cost = 0 + /// Have we already been positioned into our starting location? + var/positioned = FALSE /datum/action/innate/cult/blood_spell/Grant(mob/living/owner, datum/action/innate/cult/blood_magic/BM) if(health_cost) @@ -106,9 +109,7 @@ base_desc = desc desc += "
Has [charges] use\s remaining." all_magic = BM - ..() - button.locked = TRUE - button.ordered = FALSE + return ..() /datum/action/innate/cult/blood_spell/Remove() if(all_magic) @@ -273,7 +274,7 @@ attached_action.charges-- attached_action.desc = attached_action.base_desc attached_action.desc += "
Has [attached_action.charges] use\s remaining." - attached_action.UpdateButtonIcon() + attached_action.UpdateButtons() if(attached_action.charges <= 0) remove_ranged_ability("You have exhausted the spell's power!") qdel(src) @@ -325,7 +326,7 @@ qdel(src) desc = base_desc desc += "
Has [charges] use\s remaining." - UpdateButtonIcon() + UpdateButtons() /datum/action/innate/cult/blood_spell/manipulation name = "Blood Rites" @@ -373,7 +374,7 @@ source.charges = uses source.desc = source.base_desc source.desc += "
Has [uses] use\s remaining." - source.UpdateButtonIcon() + source.UpdateButtons() ..() /obj/item/melee/blood_magic/attack_self(mob/living/user) @@ -400,7 +401,7 @@ else if(source) source.desc = source.base_desc source.desc += "
Has [uses] use\s remaining." - source.UpdateButtonIcon() + source.UpdateButtons() //Stun /obj/item/melee/blood_magic/stun diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index a52228521059..4d1565441144 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -795,14 +795,13 @@ desc = "Call the blood spear back to your hand!" background_icon_state = "bg_demon" button_icon_state = "bloodspear" + default_button_position = "6:157,4:-2" var/obj/item/cult_spear/spear var/cooldown = 0 /datum/action/innate/cult/spear/Grant(mob/user, obj/blood_spear) . = ..() spear = blood_spear - button.screen_loc = "6:157,4:-2" - button.moved = "6:157,4:-2" /datum/action/innate/cult/spear/Activate() if(owner == spear.loc || cooldown > world.time) diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index 885921a94442..4eee03303dab 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -176,7 +176,7 @@ user.reveal(reveal) user.stun(stun) if(action) - action.UpdateButtonIcon() + action.UpdateButtons() return TRUE //Overload Light: Breaks a light that's online and sends out lightning bolts to all nearby people. diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index e5fa38a4158f..a7ed574c87a6 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -33,9 +33,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( /datum/action/innate/ai/New() ..() - if(uses > 1) - desc = "[desc] It has [uses] use\s remaining." - button.desc = desc + desc = "[desc] It has [uses] use\s remaining." /datum/action/innate/ai/Grant(mob/living/L) . = ..() @@ -63,7 +61,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( if(!silent) to_chat(owner, "[name] now has [uses] use[uses > 1 ? "s" : ""] remaining.") desc = "[initial(desc)] It has [uses] use\s remaining." - UpdateButtonIcon() + UpdateButtons() return if(initial(uses) > 1) //no need to tell 'em if it was one-use anyway! to_chat(owner, "[name] has run out of uses!") @@ -92,7 +90,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( if(!silent) to_chat(owner, "[name] now has [uses] use[uses > 1 ? "s" : ""] remaining.") desc = "[initial(desc)] It has [uses] use\s remaining." - UpdateButtonIcon() + UpdateButtons() return if(initial(uses) > 1) //no need to tell 'em if it was one-use anyway! to_chat(owner, "[name] has run out of uses!") @@ -203,7 +201,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( else //Adding uses to an existing module action.uses += initial(action.uses) action.desc = "[initial(action.desc)] It has [action.uses] use\s remaining." - action.UpdateButtonIcon() + action.UpdateButtons() temp = "Additional use[action.uses > 1 ? "s" : ""] added to [action.name]!" processing_time -= AM.cost @@ -759,6 +757,10 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( uses = 3 auto_use_uses = FALSE +/datum/action/innate/ai/blackout/New() + ..() + desc = "[desc] It has [uses] use\s remaining." + /datum/action/innate/ai/blackout/Activate() for(var/obj/machinery/power/apc/apc in GLOB.apcs_list) if(prob(30 * apc.overload)) @@ -768,7 +770,10 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( to_chat(owner, "Overcurrent applied to the powernet.") owner.playsound_local(owner, "sparks", 50, 0) adjust_uses(-1) - + if(QDELETED(src) || uses) //Not sure if not having src here would cause a runtime, so it's here to be safe + return + desc = "[initial(desc)] It has [uses] use\s remaining." + UpdateButtons() //Disable Emergency Lights /datum/AI_Module/small/emergency_lights @@ -816,6 +821,10 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( auto_use_uses = FALSE cooldown_period = 30 +/datum/action/innate/ai/reactivate_cameras/New() + ..() + desc = "[desc] It has [uses] use\s remaining." + /datum/action/innate/ai/reactivate_cameras/Activate() var/fixed_cameras = 0 for(var/V in GLOB.cameranet.cameras) @@ -830,7 +839,10 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( to_chat(owner, "Diagnostic complete! Cameras reactivated: [fixed_cameras]. Reactivations remaining: [uses].") owner.playsound_local(owner, 'sound/items/wirecutter.ogg', 50, 0) adjust_uses(0, TRUE) //Checks the uses remaining - + if(QDELETED(src) || !uses) //Not sure if not having src here would cause a runtime, so it's here to be safe + return + desc = "[initial(desc)] It has [uses] use\s remaining." + UpdateButtons() //Upgrade Camera Network: EMP-proofs all cameras, in addition to giving them X-ray vision. /datum/AI_Module/large/upgrade_cameras diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index c1399ce64699..940e8bf62294 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -134,16 +134,19 @@ var/obj/item/active_mousedown_item = null ///Used in MouseDrag to preserve the original mouse click parameters var/mouseParams = "" - ///Used in MouseDrag to preserve the last mouse-entered location. - var/mouseLocation = null - ///Used in MouseDrag to preserve the last mouse-entered object. - var/mouseObject = null - var/mouseControlObject = null + ///Used in MouseDrag to preserve the last mouse-entered location. Weakref + var/datum/weakref/mouse_location_ref = null + ///Used in MouseDrag to preserve the last mouse-entered object. Weakref + var/datum/weakref/mouse_object_ref + //Middle-mouse-button click dragtime control for aimbot exploit detection. + var/middragtime = 0 + //Middle-mouse-button clicked object control for aimbot exploit detection. Weakref + var/datum/weakref/middle_drag_atom_ref /// Messages currently seen by this client var/list/seen_messages /// viewsize datum for holding our view size - var/datum/viewData/view_size + var/datum/view_data/view_size /// our current tab var/stat_tab diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 6ca963df735e..6036ab6ff108 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -881,11 +881,16 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( click_intercept_time = 0 //Reset and return. Next click should work, but not this one. return click_intercept_time = 0 //Just reset. Let's not keep re-checking forever. - var/list/L = params2list(params) + var/ab = FALSE + var/list/modifiers = params2list(params) - if(L["drag"]) + var/dragged = LAZYACCESS(modifiers, DRAG) + if(dragged && !LAZYACCESS(modifiers, dragged)) //I don't know what's going on here, but I don't trust it return + if (object && IS_WEAKREF_OF(object, middle_drag_atom_ref) && LAZYACCESS(modifiers, LEFT_CLICK)) + ab = max(0, 5 SECONDS-(world.time-middragtime)*0.1) + var/mcl = CONFIG_GET(number/minute_click_limit) if (!holder && !ignore_spam && mcl) var/minute = round(world.time, 600) @@ -901,6 +906,9 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( clicklimiter[ADMINSWARNED_AT] = minute msg += " Administrators have been informed." + if (ab) + log_game("[key_name(src)] is using the middle click aimbot exploit") + message_admins("[ADMIN_LOOKUPFLW(usr)] [ADMIN_KICK(usr)] is using the middle click aimbot exploit") log_click(object, location, control, params, src, "lockout (spam - minute)", TRUE) log_game("[key_name(src)] Has hit the per-minute click limit of [mcl] clicks in a given game minute") message_admins("[ADMIN_LOOKUPFLW(src)] [ADMIN_KICK(usr)] Has hit the per-minute click limit of [mcl] clicks in a given game minute") @@ -929,6 +937,11 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( // so that the visual focus indicator matches reality. winset(src, null, "input.background-color=[COLOR_INPUT_DISABLED]") + else + winset(src, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED]") + + SEND_SIGNAL(src, COMSIG_CLIENT_CLICK, object, location, control, params, usr) + ..() /client/proc/add_verbs_from_config() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index e50539f91dc1..d6d50c9dbccf 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -65,7 +65,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/screentip_pref = SCREENTIP_PREFERENCE_ENABLED var/screentip_color = "#ffd391" var/screentip_images = TRUE - var/buttons_locked = FALSE var/hotkeys = FALSE ///Runechat preference. If true, certain messages will be displayed on the map, not ust on the chat area. Boolean. @@ -1070,8 +1069,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Runechat message char limit: [max_chat_length]
" dat += "See Runechat for non-mobs: [see_chat_non_mob ? "Enabled" : "Disabled"]
" dat += "
" - dat += "Action Buttons: [(buttons_locked) ? "Locked In Place" : "Unlocked"]
" - dat += "
" dat += "PDA Color: [pda_color] Change
" dat += "PDA Style: [pda_style]
" dat += "PDA Reskin: [pda_skin]
" @@ -3001,8 +2998,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) chat_on_map = !chat_on_map if("see_chat_non_mob") see_chat_non_mob = !see_chat_non_mob - if("action_buttons") - buttons_locked = !buttons_locked if("tgui_fancy") tgui_fancy = !tgui_fancy if("outline_enabled") diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 6bb704f8a54a..afbaba72cd92 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -435,7 +435,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["see_chat_non_mob"] >> see_chat_non_mob S["tgui_fancy"] >> tgui_fancy S["tgui_lock"] >> tgui_lock - S["buttons_locked"] >> buttons_locked S["windowflash"] >> windowflashing S["be_special"] >> be_special @@ -513,7 +512,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car see_chat_non_mob = sanitize_integer(see_chat_non_mob, 0, 1, initial(see_chat_non_mob)) tgui_fancy = sanitize_integer(tgui_fancy, 0, 1, initial(tgui_fancy)) tgui_lock = sanitize_integer(tgui_lock, 0, 1, initial(tgui_lock)) - buttons_locked = sanitize_integer(buttons_locked, 0, 1, initial(buttons_locked)) windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing)) default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot)) toggles = sanitize_integer(toggles, 0, 16777215, initial(toggles)) @@ -626,7 +624,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["see_chat_non_mob"], see_chat_non_mob) WRITE_FILE(S["tgui_fancy"], tgui_fancy) WRITE_FILE(S["tgui_lock"], tgui_lock) - WRITE_FILE(S["buttons_locked"], buttons_locked) WRITE_FILE(S["windowflash"], windowflashing) WRITE_FILE(S["be_special"], be_special) WRITE_FILE(S["default_slot"], default_slot) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 05ef6f18e012..6d569fb4e088 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -162,8 +162,8 @@ ..() /datum/action/item_action/chameleon/change/proc/initialize_disguises() - if(button) - button.name = "Change [chameleon_name] Appearance" + name = "Change [chameleon_name] Appearance" + UpdateButtons() chameleon_blacklist |= typecacheof(target.type) for(var/V in typesof(chameleon_type)) @@ -209,7 +209,7 @@ update_item(picked_item) var/obj/item/thing = target thing.update_slot_icon() - UpdateButtonIcon() + UpdateButtons() /datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item) target.name = initial(picked_item.name) @@ -435,9 +435,9 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/head/chameleon) ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) chameleon_action.random_look() var/datum/action/item_action/chameleon/drone/togglehatmask/togglehatmask_action = new(src) - togglehatmask_action.UpdateButtonIcon() + togglehatmask_action.UpdateButtons() var/datum/action/item_action/chameleon/drone/randomise/randomise_action = new(src) - randomise_action.UpdateButtonIcon() + randomise_action.UpdateButtons() CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/mask/chameleon) name = "gas mask" @@ -489,9 +489,9 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/mask/chameleon) ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) chameleon_action.random_look() var/datum/action/item_action/chameleon/drone/togglehatmask/togglehatmask_action = new(src) - togglehatmask_action.UpdateButtonIcon() + togglehatmask_action.UpdateButtons() var/datum/action/item_action/chameleon/drone/randomise/randomise_action = new(src) - randomise_action.UpdateButtonIcon() + randomise_action.UpdateButtons() /obj/item/clothing/mask/chameleon/drone/attack_self(mob/user) to_chat(user, "[src] does not have a voice changer.") diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 878b54de38e7..52bf7c4ccbe8 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -402,7 +402,7 @@ BLIND // can't see anything C.head_update(src, forced = 1) for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() return TRUE /obj/item/clothing/proc/visor_toggling() //handles all the actual toggling of flags diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index 013084e38fd5..395eeaeaa666 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -62,7 +62,7 @@ update_icon() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/clothing/glasses/meson/engine/attack_self(mob/user) toggle_mode(user, TRUE) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index ff78b519091c..4f370866b371 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -389,7 +389,7 @@ set_light(0) for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/clothing/head/helmet/durathread name = "makeshift helmet" diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index a2d13822f831..1c9b15b39889 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -115,7 +115,7 @@ user.update_inv_wear_mask() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() to_chat(user, "Your Clown Mask has now morphed into [choice], all praise the Honkmother!") return TRUE @@ -181,7 +181,7 @@ user.update_inv_wear_mask() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() to_chat(user, "Your Mime Mask has now morphed into [choice]!") return TRUE @@ -274,7 +274,7 @@ user.update_inv_wear_mask() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() to_chat(M, "The Tiki Mask has now changed into the [choice] Mask!") return TRUE diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index f96fe2ac2af6..8aead31d2f1a 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -109,7 +109,7 @@ user.update_inv_wear_mask() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() to_chat(user, "Your Joy mask now has a [choice] Emotion!") return 1 @@ -475,6 +475,6 @@ user.update_inv_wear_mask() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() to_chat(user, "Your paper mask now has a [choice] symbol!") return 1 diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 726b284632a5..00da8bf9d837 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -36,7 +36,7 @@ user.update_gravity(user.has_gravity()) for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/clothing/shoes/magboots/negates_gravity() return clothing_flags & NOSLIP diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 5ec0fad2e632..d3b51cd4444b 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -91,7 +91,7 @@ if(camera) camera.remove_target_ui() camera.forceMove(user) - teleport_now.UpdateButtonIcon() + teleport_now.UpdateButtons() /obj/item/clothing/suit/space/chronos/proc/chronowalk(atom/location) var/mob/living/carbon/human/user = src.loc @@ -105,7 +105,7 @@ if(camera) camera.remove_target_ui() - teleport_now.UpdateButtonIcon() + teleport_now.UpdateButtons() var/list/nonsafe_slots = list(ITEM_SLOT_BELT, ITEM_SLOT_BACK) var/list/exposed = list() diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index c946002fa292..a1fa2bf42b01 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -345,7 +345,7 @@ C.head_update(src, forced = 1) for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/clothing/head/helmet/space/hardsuit/syndi/proc/toggle_hardsuit_mode(mob/user) //Helmet Toggles Suit Mode if(linkedsuit) @@ -937,7 +937,7 @@ set_light(0) for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/clothing/head/helmet/space/hardsuit/lavaknight/update_overlays() . = ..() diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 25cbf27cf674..bb2b1bde5a2b 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -139,7 +139,7 @@ usr.update_inv_wear_suit() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/clothing/suit/toggle/examine(mob/user) . = ..() diff --git a/code/modules/keybindings/keybind/mob.dm b/code/modules/keybindings/keybind/mob.dm index 15911d831ea2..d5b8eb1a38a1 100644 --- a/code/modules/keybindings/keybind/mob.dm +++ b/code/modules/keybindings/keybind/mob.dm @@ -85,6 +85,6 @@ description = "Immediately examine anything you're hovering your mouse over." /datum/keybinding/mob/examine_immediate/down(client/user) - var/atom/A = user.mouseObject + var/atom/A = WEAKREF(user.mouse_object_ref) if(A) A.attempt_examinate(user.mob) diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index a5ea6e1c893b..181850d541ec 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -200,7 +200,7 @@ Doesn't work on other aliens/AI.*/ /obj/effect/proc_holder/alien/neurotoxin/update_icon() action.button_icon_state = "alien_neurotoxin_[active]" - action.UpdateButtonIcon() + action.UpdateButtons() /obj/effect/proc_holder/alien/neurotoxin/InterceptClickOn(mob/living/caller, params, atom/target) if(..()) @@ -333,7 +333,7 @@ Doesn't work on other aliens/AI.*/ for(var/X in abilities) var/obj/effect/proc_holder/alien/APH = X if(APH.has_action) - APH.action.UpdateButtonIcon() + APH.action.UpdateButtons() return 1 /mob/living/carbon/alien/adjustPlasma(amount) diff --git a/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm b/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm index 482268f8f56d..177444503b9e 100644 --- a/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm +++ b/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm @@ -37,7 +37,7 @@ to_chat(owner, "There's something stuck to your hand, stopping you from transforming!") return if(IsAvailable()) - UpdateButtonIcon() + UpdateButtons() var/mutcolor = owner.get_ability_property(INNATE_ABILITY_SLIME_BLOBFORM, PROPERTY_BLOBFORM_COLOR) || ("#" + H.dna.features["mcolor"]) if(!is_puddle) if(CHECK_MOBILITY(H, MOBILITY_USE)) //if we can use items, we can turn into a puddle @@ -78,7 +78,7 @@ owner.update_antag_overlays() transforming = FALSE - UpdateButtonIcon() + UpdateButtons() else detransform() else @@ -109,4 +109,4 @@ squeak.RemoveComponent() H.regenerate_icons() transforming = FALSE - UpdateButtonIcon() + UpdateButtons() diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index c4be0d3948e6..60a7e945a323 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -480,9 +480,9 @@ spark_system.start() do_teleport(H, get_turf(H), 12, asoundin = 'sound/weapons/emitter2.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) last_teleport = world.time - UpdateButtonIcon() //action icon looks unavailable - sleep(cooldown + 5) - UpdateButtonIcon() //action icon looks available again + UpdateButtons() //action icon looks unavailable + //action icon looks available again + addtimer(CALLBACK(src, .proc/UpdateButtons), cooldown + 5) //honk diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index e8042dfac9e3..f88de43a3b23 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -82,7 +82,7 @@ var/datum/action/innate/ability/regrowth = H.ability_actions[INNATE_ABILITY_LIMB_REGROWTH] if(regrowth) - regrowth.UpdateButtonIcon() + regrowth.UpdateButtons() return FALSE // to let living/handle_blood know that the species is handling blood instead @@ -472,9 +472,9 @@ /datum/species/jelly/luminescent/proc/update_slime_actions() integrate_extract.update_name() - integrate_extract.UpdateButtonIcon() - extract_minor.UpdateButtonIcon() - extract_major.UpdateButtonIcon() + integrate_extract.UpdateButtons() + extract_minor.UpdateButtons() + extract_major.UpdateButtons() /datum/species/jelly/luminescent/proc/update_glow(mob/living/carbon/C, intensity) if(intensity) @@ -514,7 +514,7 @@ name = "Eject Extract" desc = "Eject your current slime extract." -/datum/action/innate/integrate_extract/UpdateButtonIcon(status_only, force) +/datum/action/innate/integrate_extract/UpdateButton(atom/movable/screen/movable/action_button/button, status_only, force) if(!species || !species.current_extract) button_icon_state = "slimeconsume" else diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f6a2f1cb3809..d8a8d5c47110 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -636,7 +636,7 @@ if(mind) for(var/S in mind.spell_list) var/obj/effect/proc_holder/spell/spell = S - spell.updateButtonIcon() + spell.UpdateButton() //proc used to remove all immobilisation effects + reset stamina /mob/living/proc/remove_CC(should_update_mobility = TRUE) diff --git a/code/modules/mob/living/living_active_parry.dm b/code/modules/mob/living/living_active_parry.dm index 13240b273471..dacfe3a86338 100644 --- a/code/modules/mob/living/living_active_parry.dm +++ b/code/modules/mob/living/living_active_parry.dm @@ -241,7 +241,7 @@ // before doing anything, check if the user moused over them properly if(!client) return BLOCK_NONE - var/found = attacker == client.mouseObject + var/found = attacker == WEAKREF(client.mouse_object_ref) if(!found) for(var/i in client.moused_over_objects) if(i == object) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 7d37039fa1bc..a65e7a71da7d 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -44,6 +44,9 @@ var/can_repair_constructs = FALSE var/can_repair_self = FALSE var/runetype + var/datum/action/innate/cult/create_rune/our_rune + /// Theme controls color. THEME_CULT is red THEME_WIZARD is purple and THEME_HOLY is blue + var/theme = "cult" var/datum/mind/original_mind /mob/living/simple_animal/hostile/construct/Initialize(mapload) @@ -51,24 +54,24 @@ update_health_hud() var/spellnum = 1 for(var/spell in construct_spells) - var/the_spell = new spell(null) - AddSpell(the_spell) - var/obj/effect/proc_holder/spell/S = mob_spell_list[spellnum] var/pos = 2+spellnum*31 if(construct_spells.len >= 4) pos -= 31*(construct_spells.len - 4) - S.action.button.screen_loc = "6:[pos],4:-2" - S.action.button.moved = "6:[pos],4:-2" + var/obj/effect/proc_holder/spell/the_spell = new spell(null) + the_spell?.action.default_button_position ="6:[pos],4:-2" + AddSpell(the_spell) spellnum++ if(runetype) - var/datum/action/innate/cult/create_rune/CR = new runetype(src) - CR.Grant(src) var/pos = 2+spellnum*31 - CR.button.screen_loc = "6:[pos],4:-2" - CR.button.moved = "6:[pos],4:-2" + our_rune = new runetype(src) + our_rune.default_button_position = "6:[pos],4:-2" // Set the default position to this random position + our_rune.Grant(src) + if(icon_state) + add_overlay("glow_[icon_state]_[theme]") /mob/living/simple_animal/hostile/construct/Destroy() original_mind = null + QDEL_NULL(our_rune) . = ..() /mob/living/simple_animal/hostile/construct/death() diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm index 1dedf8cd2906..88f25eb5cee0 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm @@ -143,7 +143,7 @@ var/datum/action/boss/AB = ab if(!boss.client && (!AB.req_statuses || (boss.AIStatus in AB.req_statuses)) && prob(AB.usage_probability) && AB.Trigger()) break - AB.UpdateButtonIcon(TRUE) + AB.UpdateButtons(TRUE) /datum/boss_active_timed_battle/Destroy() diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 23a0d44d56f8..385d37f5a4ae 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -336,7 +336,7 @@ if(L.blood_volume && (L.stat != DEAD || !consumed_mobs[L.tag])) //if they're not dead, you can consume them anyway consumed_mobs[L.tag] = TRUE fed++ - lay_eggs.UpdateButtonIcon(TRUE) + lay_eggs.UpdateButtons(TRUE) visible_message("[src] sticks a proboscis into [L] and sucks a viscous substance out.","You suck the nutriment out of [L], feeding you enough to lay a cluster of eggs.") L.death() //you just ate them, they're dead. else @@ -402,7 +402,7 @@ /obj/effect/proc_holder/wrap/update_icon() action.button_icon_state = "wrap_[active]" - action.UpdateButtonIcon() + action.UpdateButtons() /obj/effect/proc_holder/wrap/Trigger(mob/living/simple_animal/hostile/poison/giant_spider/nurse/user) if(!istype(user)) @@ -482,7 +482,7 @@ C.poison_per_bite = S.poison_per_bite C.faction = S.faction.Copy() S.fed-- - UpdateButtonIcon(TRUE) + UpdateButtons(TRUE) S.busy = SPIDER_IDLE S.stop_automated_movement = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 1f5cace8240b..3db1d1892b80 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -72,19 +72,48 @@ While using this makes the system rely on OnFire, it still gives options for tim icon_icon = 'icons/mob/actions/actions_elites.dmi' button_icon_state = "" background_icon_state = "bg_default" - var/mob/living/simple_animal/hostile/asteroid/elite/M var/chosen_message var/chosen_attack_num = 0 +/datum/action/innate/elite_attack/CreateButton() + var/atom/movable/screen/movable/action_button/button = ..() + button.maptext = "" + button.maptext_x = 8 + button.maptext_y = 0 + button.maptext_width = 24 + button.maptext_height = 12 + return button + +/datum/action/innate/elite_attack/process() + if(owner == null) + STOP_PROCESSING(SSfastprocess, src) + qdel(src) + return + UpdateButtons() + +/datum/action/innate/elite_attack/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force = FALSE) + . = ..() + if(!.) + return + if(status_only) + return + var/mob/living/simple_animal/hostile/asteroid/elite/elite_owner = owner + var/timeleft = max(elite_owner.ranged_cooldown - world.time, 0) + if(timeleft == 0) + button.maptext = "" + else + button.maptext = "[round(timeleft/10, 0.1)]" + /datum/action/innate/elite_attack/Grant(mob/living/L) if(istype(L, /mob/living/simple_animal/hostile/asteroid/elite)) - M = L + START_PROCESSING(SSfastprocess, src) return ..() return FALSE /datum/action/innate/elite_attack/Activate() - M.chosen_attack = chosen_attack_num - to_chat(M, chosen_message) + var/mob/living/simple_animal/hostile/asteroid/elite/elite_owner = owner + elite_owner.chosen_attack = chosen_attack_num + to_chat(elite_owner, chosen_message) /mob/living/simple_animal/hostile/asteroid/elite/updatehealth() . = ..() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index be03e8a9c9ab..0f6bd1aee73c 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -426,7 +426,7 @@ for(var/obj/item/I in U.held_items) if(istype(I, /obj/item/turret_control)) qdel(I) - UpdateButtonIcon() + UpdateButtons() return else playsound(PE,'sound/mecha/mechmove01.ogg', 50, TRUE) @@ -443,7 +443,7 @@ else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand var/obj/item/turret_control/TC = new /obj/item/turret_control() U.put_in_hands(TC) - UpdateButtonIcon() + UpdateButtons() /obj/item/turret_control diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index a0f98f404670..9efbe1cffb27 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -142,7 +142,7 @@ if(fire_select_modes.len > 1) firemode_action = new(src) firemode_action.button_icon_state = "fireselect_[fire_select]" - firemode_action.UpdateButtonIcon() + firemode_action.UpdateButtons() /obj/item/gun/ComponentInitialize() . = ..() @@ -219,7 +219,7 @@ playsound(user, 'sound/weapons/empty.ogg', 100, TRUE) update_appearance() firemode_action.button_icon_state = "fireselect_[fire_select]" - firemode_action.UpdateButtonIcon() + firemode_action.UpdateButtons() return TRUE /obj/item/gun/equipped(mob/living/user, slot) @@ -670,7 +670,7 @@ update_icon() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/gun/update_overlays() . = ..() diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 6f7099883412..98de59b00eaf 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -200,7 +200,9 @@ else P.color = rgb(0, 255, 0) var/turf/curloc = get_turf(src) - var/turf/targloc = get_turf(current_user.client.mouseObject) + + var/atom/target_atom = current_user.client.mouse_object_ref?.resolve() + var/turf/targloc = get_turf(target_atom) if(!istype(targloc)) if(!istype(curloc)) return @@ -293,7 +295,9 @@ process_aim() if(fire_check() && can_trigger_gun(M)) sync_ammo() - do_fire(M.client.mouseObject, M, FALSE, M.client.mouseParams, M.zone_selected) + var/atom/target = M.client.mouse_object_ref?.resolve() + if(target) + afterattack(target, M, FALSE, M.client.mouseParams) stop_aiming() QDEL_LIST(current_tracers) return ..() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 0aee51bb84fd..aa90ea470ac6 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -939,12 +939,10 @@ var/y = text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32 //Calculate the "resolution" of screen based on client's view and world's icon size. This will work if the user can view more tiles than average. - var/list/screenview = getviewsize(user.client.view) - var/screenviewX = screenview[1] * world.icon_size - var/screenviewY = screenview[2] * world.icon_size + var/list/screenview = view_to_pixels(user.client.view) - var/ox = round(screenviewX/2) - user.client.pixel_x //"origin" x - var/oy = round(screenviewY/2) - user.client.pixel_y //"origin" y + var/ox = round(screenview[1] / 2) - user.client.pixel_x //"origin" x + var/oy = round(screenview[2] / 2) - user.client.pixel_y //"origin" y angle = arctan(y - oy, x - ox) return list(angle, p_x, p_y) diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 4be592b9198a..68207491a5b7 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -165,7 +165,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th if("holdervar") adjust_var(user, holder_var_type, holder_var_amount) if(action) - action.UpdateButtonIcon() + action.UpdateButtons() return TRUE /obj/effect/proc_holder/spell/proc/charge_check(mob/user, silent = FALSE) @@ -243,7 +243,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th if(recharging && charge_type == "recharge" && (charge_counter < charge_max)) charge_counter += 2 //processes 5 times per second instead of 10. if(charge_counter >= charge_max) - action.UpdateButtonIcon() + action.UpdateButtons() charge_counter = charge_max recharging = FALSE @@ -259,7 +259,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th cast(targets,user=user) after_cast(targets) if(action) - action.UpdateButtonIcon() + action.UpdateButtons() /obj/effect/proc_holder/spell/proc/before_cast(list/targets) if(overlay) @@ -321,7 +321,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th if("holdervar") adjust_var(user, holder_var_type, -holder_var_amount) if(action) - action.UpdateButtonIcon() + action.UpdateButtons() /obj/effect/proc_holder/spell/proc/adjust_var(mob/living/target = usr, type, amount) //handles the adjustment of the var when the spell is used. has some hardcoded types if (!istype(target)) @@ -438,8 +438,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th perform(targets,user=user) -/obj/effect/proc_holder/spell/proc/updateButtonIcon(status_only, force) - action.UpdateButtonIcon(status_only, force) +/obj/effect/proc_holder/spell/proc/UpdateButton(atom/movable/screen/movable/action_button/button, status_only, force) + action.UpdateButtons(status_only, force) /obj/effect/proc_holder/spell/targeted/proc/los_check(mob/A,mob/B) //Checks for obstacles from A to B diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm index aa2a2e408322..62f65688d9f4 100644 --- a/code/modules/spells/spell_types/aimed.dm +++ b/code/modules/spells/spell_types/aimed.dm @@ -43,7 +43,7 @@ if(!action) return action.button_icon_state = "[base_icon_state][active]" - action.UpdateButtonIcon() + action.UpdateButtons() /obj/effect/proc_holder/spell/aimed/InterceptClickOn(mob/living/caller, params, atom/target) if(..()) diff --git a/code/modules/spells/spell_types/pointed/pointed.dm b/code/modules/spells/spell_types/pointed/pointed.dm index 7b942dee2701..1c32f04710a0 100644 --- a/code/modules/spells/spell_types/pointed/pointed.dm +++ b/code/modules/spells/spell_types/pointed/pointed.dm @@ -63,7 +63,7 @@ action.button_icon_state = "[action_icon_state]1" else action.button_icon_state = "[action_icon_state]" - action.UpdateButtonIcon() + action.UpdateButtons() /obj/effect/proc_holder/spell/pointed/InterceptClickOn(mob/living/caller, params, atom/target) if(..()) diff --git a/code/modules/spells/spell_types/taeclowndo.dm b/code/modules/spells/spell_types/taeclowndo.dm index 9d6d71a89f67..3566a36a2554 100644 --- a/code/modules/spells/spell_types/taeclowndo.dm +++ b/code/modules/spells/spell_types/taeclowndo.dm @@ -54,7 +54,7 @@ else action.button_icon_state = action_icon_state - action.UpdateButtonIcon() + action.UpdateButtons() return ////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/spells/spell_types/touch_attacks.dm b/code/modules/spells/spell_types/touch_attacks.dm index a23e16cf881c..4f0ac2964f70 100644 --- a/code/modules/spells/spell_types/touch_attacks.dm +++ b/code/modules/spells/spell_types/touch_attacks.dm @@ -18,7 +18,7 @@ //Start recharging. attached_hand = null recharging = TRUE - action.UpdateButtonIcon() + action.UpdateButtons() /obj/effect/proc_holder/spell/targeted/touch/cast(list/targets,mob/user = usr) if(!QDELETED(attached_hand)) diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index f41f299439ed..6f55cb0c4657 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -18,10 +18,11 @@ user.transferItemToLoc(tool, target, TRUE) - var/datum/action/item_action/hands_free/activate_pill/P = new(tool) - P.button.name = "Activate [tool.name]" - P.target = tool - P.Grant(target) //The pill never actually goes in an inventory slot, so the owner doesn't inherit actions from it + var/datum/action/item_action/hands_free/activate_pill/pill_action = new(tool) + pill_action.name = "Activate [tool.name]" + pill_action.UpdateButtons() + pill_action.target = tool + pill_action.Grant(target) //The pill never actually goes in an inventory slot, so the owner doesn't inherit actions from it user.visible_message("[user] wedges \the [tool] into [target]'s [parse_zone(target_zone)]!", "You wedge [tool] into [target]'s [parse_zone(target_zone)].") return 1 diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm index 01c74122bdf7..3ca7fd590d8e 100644 --- a/code/modules/tooltip/tooltip.dm +++ b/code/modules/tooltip/tooltip.dm @@ -87,13 +87,13 @@ Notes: /datum/tooltip/proc/hide() + queueHide = showing ? TRUE : FALSE + if (queueHide) addtimer(CALLBACK(src, .proc/do_hide), 1) else do_hide() - queueHide = showing ? TRUE : FALSE - return TRUE /datum/tooltip/proc/do_hide() diff --git a/code/modules/tooltip/tooltip.html b/code/modules/tooltip/tooltip.html index 2743bc03d543..b66d48d6c68e 100644 --- a/code/modules/tooltip/tooltip.html +++ b/code/modules/tooltip/tooltip.html @@ -136,21 +136,29 @@ //alert(realIconSize + ' | ' +tooltip.tileSize + ' | ' + resizeRatio); //DEBUG - //Parse out the tile and cursor locations from params (e.g. "icon-x=32;icon-y=29;screen-loc=3:10,15:29") + const parameters = new Object(); + + //Parse out the contents of params (e.g. "icon-x=32;icon-y=29;screen-loc=3:10,15:29") + //It is worth noting that params is not always ordered in the same way. We therefore need to write the code + //To load their values in independantly of their order var paramsA = tooltip.params.cursor.split(';'); - if (paramsA.length < 3) {return false;} //Sometimes screen-loc is never sent ahaha fuck you byond + for (var i = 0; i < paramsA.length; i++) { + var entry = paramsA[i]; + var nameAndValue = entry.split("="); + parameters[nameAndValue[0]] = nameAndValue[1]; + } + + //Sometimes screen-loc is never sent ahaha fuck you byond + if (!parameters["icon-x"] || !parameters["icon-y"] || !parameters["screen-loc"]) { + return false; + } //icon-x - var iconX = paramsA[0]; - iconX = iconX.split('='); - iconX = parseInt(iconX[1]); + var iconX = parseInt(parameters["icon-x"]); //icon-y - var iconY = paramsA[1]; - iconY = iconY.split('='); - iconY = parseInt(iconY[1]); + var iconY = parseInt(parameters["icon-y"]); //screen-loc - var screenLoc = paramsA[2]; - screenLoc = screenLoc.split('='); - screenLoc = screenLoc[1].split(','); + var screenLoc = parameters["screen-loc"]; + screenLoc = screenLoc.split(','); if (screenLoc.length < 2) {return false;} var left = screenLoc[0]; var top = screenLoc[1]; diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index 36c5f75984b7..8567e31b070b 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -194,7 +194,7 @@ own integrity back to max. Shield is automatically dropped if we run out of powe for(var/occupant in chassis.occupants) var/datum/action/button = chassis.occupant_actions[occupant][/datum/action/vehicle/sealed/mecha/mech_defense_mode] button.button_icon_state = "mech_defense_mode_[chassis.defense_mode ? "on" : "off"]" - button.UpdateButtonIcon() + button.UpdateButtons() set_light(light_range, light_power, light_color) diff --git a/code/modules/vehicles/mecha/mecha_actions.dm b/code/modules/vehicles/mecha/mecha_actions.dm index 09ccaad2c295..976ffea40a65 100644 --- a/code/modules/vehicles/mecha/mecha_actions.dm +++ b/code/modules/vehicles/mecha/mecha_actions.dm @@ -37,7 +37,7 @@ button_icon_state = "mech_internals_[chassis.use_internal_tank ? "on" : "off"]" to_chat(chassis.occupants, "[icon2html(chassis, owner)]Now taking air from [chassis.use_internal_tank?"internal airtank":"environment"].") chassis.log_message("Now taking air from [chassis.use_internal_tank?"internal airtank":"environment"].", LOG_MECHA) - UpdateButtonIcon() + UpdateButtons() /datum/action/vehicle/sealed/mecha/mech_cycle_equip name = "Cycle Equipment" @@ -61,7 +61,7 @@ to_chat(owner, "[icon2html(chassis, owner)]You select [chassis.selected].") send_byjax(chassis.occupants,"exosuit.browser","eq_list",chassis.get_equipment_list()) button_icon_state = "mech_cycle_equip_on" - UpdateButtonIcon() + UpdateButtons() return var/number = 0 for(var/equipment in available_equipment) @@ -77,7 +77,7 @@ to_chat(owner, "[icon2html(chassis, owner)]You switch to [chassis.selected].") button_icon_state = "mech_cycle_equip_on" send_byjax(chassis.occupants,"exosuit.browser","eq_list",chassis.get_equipment_list()) - UpdateButtonIcon() + UpdateButtons() return @@ -100,7 +100,7 @@ chassis.set_light(0) to_chat(owner, "[icon2html(chassis, owner)]Toggled lights [(chassis.mecha_flags & LIGHTS_ON)?"on":"off"].") chassis.log_message("Toggled lights [(chassis.mecha_flags & LIGHTS_ON)?"on":"off"].", LOG_MECHA) - UpdateButtonIcon() + UpdateButtons() /datum/action/vehicle/sealed/mecha/mech_view_stats name = "View Stats" @@ -140,7 +140,7 @@ for(var/occupant in occupants) var/datum/action/action = LAZYACCESSASSOC(occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/strafe) - action?.UpdateButtonIcon() + action?.UpdateButtons() //////////////////////////////////////// Specific Ability Actions /////////////////////////////////////////////// //Need to be granted by the mech type, Not default abilities. @@ -176,7 +176,7 @@ chassis.movedelay = initial(chassis.movedelay) chassis.step_energy_drain = chassis.normal_step_energy_drain to_chat(owner, "[icon2html(chassis, owner)]You disable leg actuators overload.") - UpdateButtonIcon() + UpdateButtons() /datum/action/vehicle/sealed/mecha/mech_smoke name = "Smoke" @@ -208,7 +208,7 @@ SEND_SOUND(owner, sound('sound/mecha/imag_enh.ogg',volume=50)) else owner.client.view_size.resetToDefault() //Let's not let this stack shall we? - UpdateButtonIcon() + UpdateButtons() /datum/action/vehicle/sealed/mecha/mech_switch_damtype name = "Reconfigure arm microtool arrays" @@ -231,7 +231,7 @@ chassis.damtype = new_damtype button_icon_state = "mech_damtype_[new_damtype]" playsound(chassis, 'sound/mecha/mechmove01.ogg', 50, TRUE) - UpdateButtonIcon() + UpdateButtons() ///swap seats, for two person mecha /datum/action/vehicle/sealed/mecha/swap_seat @@ -272,4 +272,4 @@ chassis.phasing = !chassis.phasing button_icon_state = "mech_phasing_[chassis.phasing ? "on" : "off"]" to_chat(owner, "[icon2html(chassis, owner)]En":"#f00\">Dis"]abled phasing.") - UpdateButtonIcon() + UpdateButtons() diff --git a/icons/effects/mouse_pointers/screen_drag.dmi b/icons/effects/mouse_pointers/screen_drag.dmi new file mode 100644 index 0000000000000000000000000000000000000000..48e4fce85f7a47f6dbf35267945d64b0cf05a50c GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=nN=YXB`&GO$wiq3C7Jno3=9=> zRF4~SH7H21UAXyQM1Gfh6ZaN# Y>3t^de`FVdQ&MBb@0DpvZ?EnA( literal 0 HcmV?d00001 diff --git a/icons/hud/64x16_actions.dmi b/icons/hud/64x16_actions.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ae81ace4d55a2c26a5c12fcfd6dcac28ee029db8 GIT binary patch literal 3404 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 UWbCdm^m_!%jn5jD5}j}V9|Ff!mjD0& literal 0 HcmV?d00001 diff --git a/icons/mob/screen_ai.dmi b/icons/mob/screen_ai.dmi index 8388ea3f806c07006c698401c977fe138e692670..e9360926a4d2d8d53e22641e6e3dfa11f3494e82 100644 GIT binary patch literal 6401 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 literal 2543 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 FV1mRYv{wKC diff --git a/icons/mob/screen_alien.dmi b/icons/mob/screen_alien.dmi index fe23a59dfda82d9dc01562872d2d58131768dc96..b20bfaa405cef58efc95814fefaa39161e564ac5 100644 GIT binary patch literal 18617 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%0Dwa>dy+I}_77}7nUDOE!QUV$ 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 diff --git a/icons/mob/screen_clockwork.dmi b/icons/mob/screen_clockwork.dmi index 268fed40949b429f03e80184d78c14f17ee591a2..0cd15937ed9f37ab37a56aa11305e0f556221cca 100644 GIT binary patch literal 17293 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 literal 15985 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 diff --git a/icons/mob/screen_cyborg.dmi b/icons/mob/screen_cyborg.dmi index 13aa792944dfc5df0dc1bb7b78cd36351eaf8bef..2f976f9d3a8f7ff215c77f7562f7f70444f7314f 100644 GIT binary patch delta 9781 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 WEt@!Xu&4)6KDt_lH_A2ap8g-~%b8pN delta 8943 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 diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 39e8eb4b4568f45bf02c49fa0974c00af0e85c07..0b286f96250ede659cbea343f2c77a3c8a79d82d 100644 GIT binary patch delta 11897 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 d0Iy>(G2aae*m>c1d9Lw delta 10806 zcmbt(XFwE9v+j^VQKEnn7ReG7Q6z(aXGDs36Dv~7UASg=) zNfH;yd5KF{V9((9o^!wN-t+J7AG)4;rn4+_E55Mf97WI z>S6EV3;;fj{laPhPW>EAswOy7b%Z4r8(Q=+}m-A9sv; zj%*v;mi>$tVKwqC;9|b-pJy%ff!dY@Mk9HXW_Rq?hVLpgA7MmLx9`*(N!FMY3(~SA ze_h;}-_b7MUMAH$D%3PspH}HrCVn`3I{KxnjvzIyJH6*+yelRv;Bz*2*iMurUs@}d zn`zLx5jisBgC}=;I7b#jy3e@uPmUPwOVM--$JsETO%mA5A8n z!%aAo`MZq$7ZtBT(8`7AHV2iT+q8S8<>;H$pH_jv5Qx|HhMxk3-S zRq74rD_&$iKAx&?&}hml7S=gy#{@^H{xEz~!?{!9wg>~GLn~(YeWVM9N>t{bDoNw~ne{{xFZVx(G|zX(WVq@Au#wwG?)e@EegSXwVm*m;X8%Q<>IkX8n#boBf$u zX!P~0sh$eV2UHxv6rS(dJSio{mDzpa0bX8U1XUt_z#ovzQ zUv7q4E!4rmrJIabIf-tdjDJ0`CijcDdu5T@Nyx^iRvog=&>0m-&(N7|hl;ws&NyKr zJV))c!Q$&M{=X_*{r(pP(Txu(qd(rNGe4T%7V>B%pR$si9q(CVLqtgFppE*PL0npe zcci3a+4CP+A}P_Cxt&LQlv?p6!<2b$Uec}M>YXOpUw}&whPQB68hqT!aiPi%|RR=x_m-KKuhPzUb&xpVk8 zojKEfC~PsNRZ=FqbJKLriY1^eRjW_%;DD{8{LSSTua~OQOm;VkdtKP9B6zgrlUl>%9>!9r&!!v@sg8@_^20aQ|WYMc#5!!yfRdc7Ij} zNlb2+%%FytH_O||*xdFWijAih7>UQbUUBI)9T@-h1#euEzSz~1UX>q(FBj>J%$j!f zUgV|Jmf-7a9 zlZpwO>&X~0>=9RDR602-^2=TN0jn?trko!!_tU~!X`U;ev1@1Z>F33-zI*mEt+#m@ zrX6e`8vo*gVM*vMTb2oH($`-3+1K9`Qa(!Mx_?u=4o!lZoI9Vbcy?F*u2bH zMR9=E=A^$}7IwI)OugtAPg6U7D*F_Fic*doGJn)AiP(Q7=U-xv(;C^{#o?Va2C*px z&whLo7k6$NkhD0mo$IsglC&A2jjGDNyOO0J2PGJl%wJY@y8Ct+Y&O1q-V_GV(cpnBO z5|~4d21B|m2Epz?cswm52ah||HDKT}d025!^K7Sg6b1v$_Z{|XjF|1@=;KM$x;#>= ztQEu#I5%GriQMf)@bO=aNm#jeur8i!k#MjzRDA8fdG*d?rOUJpFM@He#Jc|B8M_Z; z4%NWOF4s@q!+ml+dEs}WXA)Je*}kT2Mr)oazL}`6^3Oy9U&iZw-B*dXK-lTBN<_sSXqaQ}D{$l;jLpJ%igj3VB?$RZQAhti(36U~Ir~>^|AFl8V-s1y+h^0y@VrZ@M{Wj*0b5%aOAnGpAEX7g zEN3;+^pjjY^BBK%619a@0#=vZ7X%U`<%WiFRA<16X_>=Hv_omFMSY z5Kz4NQoC!}GL_#RRY#orQrqq*7{z|E)O|^DplxSYxLS#!_}=YKq@cx%+*I!tZVu58 zA&rpoaVbn4{|SG=8C)=qTRCh2-!?^iH=b4V5oJ2x=MzOCCbv_bos&c_?!e@ZD^lIY z*Rm*4H}V=}Yw2n`5z8o9K6{fW42Wq)fp4II#UzmE9h|C8;}z|&ifXnBBWC5Qmsxxy zY7g22i9}RdLjOCcyh0b1(4Ds)_uS$;(gra+D(*Yg! zyC3DG_XV;J2z*!iuOGbSI*O&ls{FVigBIkbFrv)!nmEKp~nPb6k`@Ke%32B%P&wR;vQLa_7R; zrk!rbJ|Dz%2fA%JE3-(_{kyM57IV-S{7{GG!E%;cZ;eZIgWt!P70$i~Nm22PW*h>~ zk|H4q?3|X->5y1z%o$+qA8adQAN}|uDAj$H@Tlc&Q-rhh=S`YSDcq;ef~eTRRsl;A zj>Mvu!Dh7%)bBpeD2`4>a>bK$)b7MzkoEZ6nf~|jdpYMwIjEI+E(l!l|BXUe$4id! zH>s!iJ){Sjh7ANRW?sjA8tM#sjzaKNl(Jtdh3zI3#*hp|o$9WhFFAudC_k2T`d|rj zL0QS7%r-jJeKCVGQ~QMD>HIv*`=^j&E7VR@OOEL!w%;u&S?jv9ZXy)kvr6UK%-SW~ zmP5R#p2npMZ7y?^k|!fHSTn5FtT=pzbF)@Jm{M8kY<@B}lVX{Fi<*YB zMP+iu2=B?qu~Tc)1k;i?3JeWnqL7`Hl|DHYY21p~$sHtZNxvYi)TX*c)4tu_v#nAC zV!tK}- zPvW5*VXcpcbG;{rKb}w%(-t7sRC_9FEt)!F@e$(wqLVed*Tcy;Iwh9C%RE0fr*`8C z%>8Ok<^n85D_I-5&}@yEswW-?yRiC0Q@BwBzXl1%o0Voxwg33D(i)C#g3$1}$kREU z)C)@VrtY!^)KT?wHMK0oUuHPR5DaM>?VTkLf~cd90#!NIXh>kKqjxFfm15GYl3-z6 zrEKnCn&p>Ah%1Z&t=A|Bl@`f3!V6S}j$nt_&_9}zSd)ycXk3TlKB!c>6w-z{7~nh9eF*uvEI6MiUl2sy?CztP67oXnhaD}$T0d8M72^#=N zJ%tMUIeQFG^6r4xq3&Nv<(`(Ehmu2H>*p;%sFQH%0 zD24zb05NnJ7oZ8V{&mHNi<>Z7vz9P2TZuhJ&1fb%j$BF9{-Siu1EOdrAqwd@-S34Q z9F;*))_$Ktm|ugY6!&8`UeOj^JA-qxmrPl(5mEyHaPLzPp=nIZ`wJHYE9Gd{KW8*Q z#q|bL(VQzm0APr3q#}oCfS92KK*2pp4b@s)zwc%U{E6v!tq`OzSEgXF8Y`LJEv@KtSHFWmGc_4g0m?tO!_@D3}1i z^%W&~zd}(km3lJ(EDJ-E3+ob+f`Gh=UJyyMZkei=~ zDS;VEZeyVT*1td^LV$Hn@-Ty#5(H`^pnzL3b6WxZPatQ3f=q~A8$n49H1m(PkU{ti z0|7aZ;mAio1cdUn5CR?-{(@Jj0r|Y@%d!yO?+N(|{8px5LTYCbUj%@+e?iDspakW) zr2wselpGS4!*svvLaG@i$RfZ>qe=}D)0)BSrgXpGjC1|kvwji&iwAx@!Q&2*0l-+1 z6siRPd8fS&3TBDSjk{4ZU&FDAG)I*`uqx_SPce9Ynj>VG|Bx%Lg_JX3pMT0mdvc$G0T^wBf87;|nI5R}71ea?3O;ZVVq)I{ zY8`z}j*x2`NIxh7X1JoYOHdsC)DpkL%^U^-#LLxBDCnUAY7TIfmInx%$LAfPbY>BE z6G3#oKtcfYAmp|}umc1v?&gFx?u24cSX3xJP$L1^4B`s_(pewzo&f+DCC<-n8N`}U z6k)oAB!E1bF5z8yAgDJBVgVi@jNDd`MQ&XH$Y8GLBj5xG_ySk!q1QurqBMzC$59~8 zHU0;-u!00&S|}wJgn}(eM)F+<13G&lHw7@tvQB64nBSHY{)_nxCyq}d4x0i^wQi>-Re43T;UlrG62 zfY^)#@(LKCM#_iK@{{WmoMBKApmBy=|Lo93R=M53IoiHOFe#EQhV&{3AdNNWQ17c79y%bJQR_ zk)CiPv4_Yt>>So4fmH?t>3+Xdw8SE8Qaej>=eW^ld&ke*GlWsZ0)dI5=~nuT|JE-`Z0r3Y+k=P{QUJg%Vn9B}uj zW@Dnt4n9G60|`x5Tj(wxl=i{6+}(EZsG_JUYt7cy*32bHQ&Vt!EcanaOQTfm4ioP7 z_^baz{t%Uvv}EoAK3LMy)Vv1=Z5Mr)CUgx)u%&WYaHz_fKk0t&x22#zVe$=yp@XR= zbd@J68BtIk0cX!5;?6sw>tcv>wc~-ZdDg+#o51s(4v!lv{U_ zu2uFw=oxEJbuyi^!T*acsh%PEnlcP#W(PwdflbJQ>l<3W-#__EVg83~{=Z-Ik5@Lx zGeF(5C_pOCl_(G?byp6AZ3bzRwow(8Q9&)oyMToKQ^+Suhr%YuZ6%eIaRHQyhg&j-C6^4#;eLUFBZSn9+zb%Ee8nYYD|8LneD~kn zhMGWzK9e#wnCd^nu}uGOBq$Wi^#5-d0LfSXu_#D}CWqz*|7UV2@ks6KM6+b0V`QT2 zf4e_Y`w9IRm8?INtdrsu_=E-f#q&n2k3t@{cwz%7$!9MAmH&Ty0{<=2fTRt&QO42S zh3JH-$7Q0i#0CAaf{yO3*H2hVl5e9ShJgAyKmd63@BR6rpCD+y9kjNwEIP`%RJlRq z;5R5+wbH7eSN)qO<9u_I&uf!%RC&*G5*Bvy>g@(o<&=r6M{>ZwB@mEA1p^>TZHBD5 zVdf7Vmq!f&xb>!MMA`WyY+?=*NJN%eiQiJBB8z7rzkp5D%`en3s=Hgo={V)vx8fwS zR;KEg7J+FsU`FLN5*ej8eZ>x9L9D{>#p8pehdbiS$4oOjQa3ALVkRyc*dCH1aR7Bi z)mY;2d8yfeJk8D@E;pSUahkDut5~`HJ|Xp?+GwD`(o4~?&Wkp~>__~%yLj*MB04&=~;Xdg0z zrMp~_tnv@X5l^Iuz>Ho;&%Rj03BfXLgh)JO3nr}6|JK5CVJ6eU^x#y?T(+neYgeeK z_Fno*g9RhqRi=Flr^wkW0k3_#Mtm>t8?Jjw8kVXf2P zXhvhXU|wP0kUURbqD$+zx`N`Ex zEl2FqvDNRp)bTI$>2G~aR6MvdOM;T{Da#Em3*c4l%i4=eK! zR`C2R^zUs4yUSdXS@0>H*TVZ=b`LFB&EbV{#uLL5RX>8WGDna3!?4*7O9h9%$M*=0 zwG50T6fW%0M{K1`>%4t$a<`YHPuY`Qq1QN}?O9w4&Pit?t_@+te=9lG^1dVLM zeJ->H=oZ&CLh)^rprrFyE3P-Eu*@N^SZxAMr8NFssX5;fFHlxg+ca9RKYGLbhJ#AG zqh`6|)3Jj6g@B^FQa?@H<(<@QR8IIv+2{f+2f45KMuJie)$l`o1 zfdS+0Z^Cz#VilNK*NXDHB{~<)Lh47?{P7*X@~y}8$7QqKnayn2k`am9f?C519y<#k z;&vLLy~&1KD$6GQE5FeG+EZ3@T``B0gc_8o(YUDLME7HtD|3>x>u)0Te3;QDkD2Yc zhwS*n$s(2L6{n8@8Y<*PCK*~|hJ!b6Lj zbVdin#ucpTzh!-mE>SuaOnCBAdJ)Q}pbd?%7wIr%e9tcMN%nGk67riXe0a4hLO`Ao zccbveZNiUd4!uxH$L=)R$a0Qy=1@#kUXp}c!*Awwr;_XAXwggZ z!$)tf$cjUqwsl0UjNgd!rf-%ePlCY1y|JX)oi`nxwaMkngVt*3>T5Dsy|Ds?K^x7E z@q~I&LprnGj&COF_Fo6hc!1|p6BvQBso|t$%W}>5fYygt=$I+*YeELnqk|)BS4Zf@ z3zbI0&ticf28A+~Em6UTT%itx8}b`;&Q|LX2Lu*l|Mr8M1c zhxp-MZNZX905~Uk-#!^E0!mh-GixU@pTRmGtHci&kK)o_QdO1-&vDhjxcUaSGg_^6 zsqG}22O1jraTXTMMqWvh8~na#@8N~gN-c8vncJ+ql;*pz)pt*qS(HDQ%9`>5bfr9E ztNs{!PLFLb&7AaD1sy%pTEZ=!=i-vKOdXDtX00#=iJKD;C~) zT#$Sw`*wV&f{l(lqT`uKN}mLZfoi%-^`iRV8QbRVII9*p9&IbnQImt_d|b1o&DrpZNRJ>5(Y zqL(}4Cdc`@Dtf>li02N}1sY-rebdrq31D<+_z z+pqh;UE^x5=pWC~Xhw2+8BB28>1%)(At2S6yUV4^;RaTfzAs%nILgqEkBH7IXwQGQ z6Xz@FI96&xoA&dIBG=Q!kO`0GjP6PUc$Ph>AUsWYxPvc`RimsC)W_T|<^d-WrpnL; zqH8`N>pUmkUruinLP`Eu7#^3?y{u`{L9@!gAYnfdRaq}W=8~?%WKK1*BWWx=GM82E zD=j&a2y&Y|j>1~*c-oA2GE0nXPwxa#o3bty)NYC9pLoGZIF&oC$=@7`9e>Q8JB=US zI~2dXL;7SQCZG$2phac`%%)MLvC`1dVP{uUk#k)?<2TyMgSCtXROZGVI+Cv-5va#H78+h01=QSTZ)MoN4 z2j>sq{PJ48yPwAcyY%k>E}e-1Rhu)xA``_L@$Q8kGn`)wGtpU*CgJ?6);b!LveZbh z8Tubv2G4`YuU^2LkrXV^s3!;9@pX2u*SKVV-Gwcu_sz%MZDEe3ySZhYrg_gk*AaJx zh-NhkOa7Rn4+%TeuN8P&MJ&*O?*U*bmoXcA%nWf_Saj@cJ zX6(E7&8W8UvH3tbAte9PUF+pcx*2^tuq`B$HnbobRlhL)xfA!|bb7aukr7@uw0HO+ z)jXR`pw4MTQum`yk~M63Jd`$_h=BaWPQWHTUQ|;mY$=B^wpa(}J*@p`j81KQ?dKgK zDk)9;SttKEe&u}#VGmVY4lqL^Pl(RWK>^!NSYk44j^Yd+vN8Dw4ypFo@y`u4=@SIbl zy~%1f6T&|a2M#2i(SF0dnrWBmcH%n(S5~Q0&We%?XI=C_1?HzNsa1 z7wp*GzK0M4bbEa~O$dPJB+zBk`TbYH`A0nfSoILnMBj|kJw2EXfAwVNTX{QL>f254 ztNX^&wQ+b#E(83RrP;_FnKMXT)73VCddzr!bgs*!MA=+qRHs(oa=Bfmu=8#Hexi^W zUu1W0Cj|GJetNtZJ!TT_y;nApOQzhPBWrGM(qjF`4V(w5( zB^0PFpFcJE_W}yKG^)@jAx#`&jgwlL%qX2+s17*S4xitSL5tO*M@oxI33PyUabMf> z3vN0lWqMBCf`Gqrd3uFrn&&yO|E;hDa&uPF7jj4CAMeW1WZCe9Vq=D0Cusx6v2dZT z`I(_l51xIV$c7c6y#g9+M$sZ`IisIX7X%Vsk@X!LH`ss(@3{js{sj|uQ_9R`j5$Fa z16Pd2J>R|D`I4X-g4*6lJfHM6-dH!#(CygNoc z<7l6)D5up?e|*Ct2J|cDU2~{xY8a(cSA|Lkre5-N1dT{5XgaO!t&Eglc3J88Y5H>a zY$_hBti}>Tot@%Jbm4qH?~26x~q6uidi!{i#9ya=;@YdwZqZ@C- z%ua4e;9K3fP4x2c19i&6MdC);h8t8H)p&}dk-1>d%rCGQrqr-%uyCX&MSb}CpI(Ll%1Y9j^N(2BRi2a+yOe0RBPH5n`4u*@=Q; zBRPgmA|s`10BPS8P&()^95e((KMBRRrp$*2xEp1^oJ}VMBLmKGqCU=t-cVr1=|%(K zmSZn;T>8iGLv)-uI#Qb;#|6U5Nki{nwM`p3*rHgiuSOm7o9#9cVe2t-nM+=m%BVOv z)|8YQw@9KVoSDC#dm=;3u2x2-Y-=M%_f3?EnBY?Jz2P_5Py@0i@7?)~y$&~uxDBlL zPDmZg9lbd8;hw)G5uYE4tq@tD=Ig z(XxmIoUs{UVNSSiBE6AM8XGEOp(>b!J`mjMJ2SeghJT%-Cr{m{`%WK+eraaiWqum1 zF^h1Ge`n3?HR<9k{CW*L=hg9oBOPD2j2R9GyXKu&4;GGYIYT$+AC!SiO(Eu$t-gzd znteU4zY&9<=oV5cO(jWRAk3_}`Z@?0-H>}(l?q~i)qvXg zAGLgYF!Bi5Y>2BA#2AUgo>LK;RTa-`txq4%{}~u%LMcJ7fYw># zZ0;E<^=(y?%DlT}G7iLTvEAOKf|!!0Y7^d=gyGXhvl~zMM63Uny%#mI?X!T+7w|1= zl6dRS31w_zr{~z&(zN+jkZ~xw?aF7fDv^iM?f2u=egp@8vq$e6=KRf5!5@BO#r!!r z40;Wt({Ma=oc_Ew=$dPs&&p$H`deQs$=Qs+sofu%9FPyNkA3U&nmaaG(GvUH_af1z%!#QF*x*2+9DdfH%R3@sW0-OdN#L_n69S@ zA3^5Wh+nuijSoI`_3QC_S+K_Sua3&tWi(C-033KK%)FAI?a!pYdz+fFwo=i3tDye^ Dqh0R2 diff --git a/icons/mob/screen_midnight.dmi b/icons/mob/screen_midnight.dmi index 3d895042721041396b8068cea20e064b7cd06ef7..ec583eb485c131af20d63f83c3247990e3f63148 100644 GIT binary patch delta 8702 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 W1`Vq)Xi9DX0000gkG diff --git a/icons/mob/screen_operative.dmi b/icons/mob/screen_operative.dmi index d51022b98a1e46d4a92841146b0ea2a310c60b79..fd3879e42897685b9fdd8c8e70525b28408c6ea2 100644 GIT binary patch literal 29033 zcmZs?WmH_jwl&(_K;s%bXmEG8#tBXc?(P!Y-GhbTEy2Pkt4 zI}AY!M7Rx~`Z@gd9{rgMcc+oVPj2>gAU9fAtNV+ZmcxdmxbhzL2BJ+>5P|v`QEeaZ z@NWcc1^2q9+*BwPhsNbvLwcK^8r&=++z_G!il4AD-=b)ChenR z4pAEafx-G+pHGmNfdzDvN?H*5-ORDSGL&AP^aN$FfoDN*qEH9`kO01l34eD>KWTH1 zC13E~cywoq;e9F+GzI@o#?xlQMH@iNrpAD7tS1To0xUI&s}I-%TTI7u84nCsWAaKx zMAwPxGQiLxmDi!zNEyidF}Cd6Jt9d$0sS$D#}G#o#UKys682-m)koR6xzSj2Hrw-j z9vCSdE-o)FKRP_LEPDQl>!hNp`pT-;e*f&fasIk~PDSK-!Xo%^mgNzEzKQzwqOcB% z)P5t9_}R8E#2a>8crWl{ZT3VeC`(HNT0j2kp0~^Vvdi^-R_b}f*7wcjX{;$h+>S3u zmy6@rl~2&}am6Iu!?}5l(f9n(uH&Tu#NAMRASWyDP{h1e_oE&G=jX`!M~jMU(n!rW z7tLJM_UFRPgA?c$owxOC;;0u+Fmv?H&%Q6xe@nioOAm2R>jjplwl{boi}W&akTiRF zZaZ?uWo=q&O5Grm__fdi zJ3LT>q3el7?mD?6F_e?1(vs3kUTY&)Cqs4yv#+S&#&=Q^ipA=?4Z}wpgiTA!4O^VK zaOW!+60FFjRR?)D0F!o!_b||WMBRfFBF4Oz>D}LjammbCl5~yx}m^e;QvdWFRIAk0M`eh8E?EYr}}%#(S;1 z6LxG}Bt~4o8KJD-w8Z1=m$0~*`I@+Y72CsAhj$&rSFlC^k+jg*n$9Yc?}{;_dRij= ztiDh%bIi6cXM`sDU=sF5`>lZEwUcFa5f(=2M#D%I9SPVR_swr4teoX&m^-wIxMtG4 zVdqJ$%52D463=x=hQQQ?e;}ApSOwU1!IBWVBNEN>5O$~12YlWhEd|7LnNYH2V5a z;Mcmj({fJCMWWiM-H16tpd)j?Zb)p?DCzf#{};Yu=9PGi7M`=eX>%1ElHRFV3_>Ww zLi?iF`dGRRvux=zk%D6mnl$htQinreQ&yZi#_WV(LxPz1>?aOW)#f9tpv9I!gtw0c z!4%o0|K1Rz@1u-9$;nU$bELy824AgYbpY_X;zzWym^`0Lk2(Z%U_ECWL7?a_?IkS%1+(2z5&;Iv88*wDfn1!f?cabD{A z)VbBA#$kD)7qJMmQaBHT0+?&Lads+W)ghPNtlaqc zX_bH$#W&s#(e|1( zawu?ef1rF5b;{wy@5-nCi58cR28S8kGo$?rX5Hj!C9?y%pP@8=xd2Piz!ZO#np5m@ z0_Ebx_l14krz9&E4@Jml`6`oJaIfdZZ{IHKfGVBVqin?+k1%R=j>26D-?P@v(`qGc6LV(urg&>R1D z>|6v%YY$5+PeuH&_(3x~GXo!-{pZV-2rFfdx>n#fKP1?O_7)AFKeg@d1L7ONS{E1E4w-43V9gO9C}G}dp`S?Bj*!UFcFqsJ z;{DNEss*JAGDl%J!)d)08MI!yx2$r8g%Cy_p2rNafK31^G`>*aY~dAiYsk0nJfV^jNHjalX77@G?>{#rI+8X|I|L8AxiT$7&G96n3Y@q5WpCQ7E3YmZV$M8*K=_Rr0 z)2y->Jtiig1%W-!0BNiKC-_hf8{Qf;#YlW9(#9^OGQ@D04os;CB`8v8kh)50`fRC= zw(ycAHC?OLE>~6uv_k-FW<x)C#(3aN=Jo9 z*XfmUOmJSALuWURL?y&M#>3O7CtwFJRgIN_A{8L>UAZWlj-9IC<2S)-_MD24Aemrt zv>ag~|IK7NcOE||)!zI`r|xi3Wh5(q*AlPm7cwI^O2Qq7(})iTb-_>1=0U~{0g_9h z3YsHV-vDGf&hC8Jko5U>?#%!qotnLQp{(tWBqMM-3B$bdBmZ30TDxWj_p^Ow(P088`pc5P8-^S)))7DP$ zlKz-ik{b{ydNb&U2&9y*o=w^OWu*o-xVF<-q9=??z3iv_kCr5Dp~A)z^PFjBy%){-BAn`Pm*2 z=(j~vG-815Id<&`;HiNoIdvnASO%m;l1<58Y2YLlUJC&7iqkIsh|26xhY#OsKcN7-IqA^0t3e3E|G4#e z(;!Ch2K-x4h7H3^*hz{SUEUKW4c~!n|C%E17p=z%F-U{kx>QOfsbFA}W9aX+l&yJHH%aXE*gRT#6W_8v`WFP3iN7(2vys`fgx-y>bzc ze*-tN&=Kczj(%InpKfO>aOVxkIL81%Ar!ll5q;A(8Rc|;4kMdw*n;%GHW>#O#AfJ6 z_q98?w!C!DveTl@fAb#s&leLxJJ{Hs7(zinW|!15eQ|tx*U{FVrT<@#MC}3)MDwT^ z6Znw91TFtFT|g3yf*;HJNgpvnSLu?E1Q8YW8|+;hniMdA55ipK(Y3GvV|*ov>xYI* z+3rh7D3|Yyiv6Xi!fZohdAKBL7czJ2s79SgCda7pi5RU##iyz<00BnCtU()yrKV=U z5Gfi2mgG8a!Lv>TYTGXWsu!b3))pvWgT3%6ngn*FjQnp5sPv+tVxq!2a62RB@!*myRta0#$ z3`wfhpB|0PHQEkE>g;~#l*gw;x@?ggz%;dAROb7qfq|EXR`vC2#Z{{4m`9_!F0$u( z<+pw$2*B!MkaWOz({R2fmjKR<<9pcRHqkOn{5zy zd=~1>HrUJ7OrudM!kUV8y!bFuU0WQ+Zycmm;uk?jr}%9Q-g@J>v9j|MY~jn5n|F^R ztnkC|w7n-wz0#ZhBOpj)-}i-bWFXv^`Wt!64ueqMA;I=7em`=uwPZl`I0x+e(hB8Ew6{gO3>-iSSYp>v3~G?z%dfHh@QqW~ zS()kL=q&Stw$v3&_{+H2A}&P_fv538ZW7tf8XC~%Fe1|hsn5nn{-pOHw0CQz%URNa z{oIS_W=<=QbQjn_F`yZKL?H@I79yff4bXb^Y$0`B?qzFdhGonbmMEh|8S&%vQES=pNABf1vsM+WW|=Z2Sy={ z_f8DaQpaolwVdfYcG37_I@B_G{*I6T=sOt`^pexr{UPQ=LY9w)qkEZ!C26VyR6!5RUL zm5>VK?7%^Vi`Ay2Hql@UJsKDa$CF<@P&+*`%s8-=9Gamob-7$&w@YJJX%l(?I=_5( zP5QPlUO4jvBuSU`vj51!eR{M*=UjVJ(|F?r1JXtyyl`>-=L3MJ z5e2^Y=EhLAzYA%xsFcoEA5d&UPsifEoALH#7!oUj6p!t}HDc%cmTKBQ1i5~QnjXLy zqu3~)#Q!p8yav|lRQIAk`=oaBQh}zn`lj~PCk-UUKB0`3Mgl+wiHY z)Y=ttJu^YUD&ULmj{wXGd$y3~bXVJK7FONAtW2qXwr`PPbDjqi1iv^1C$6dETh3n1 zVEwque7_snphIaM`6(KW@7X6TiCCpZ#_X)Wuj z4D->`!C2ROjG%*a@cR-~WGM;-^U?FU3YJUBREhM7ZQT3SRe)>HP5ZAQUlVtOfm+`M zClFalOeWHswOK?3g9wA2@yim`QzmEe^TtteWyWHW^r@9-d-OIi&R+eSLFHPFsPiyW z``(#e11Q_0mkY^3p6l@gm=qo7>D6^*y|^%J+{c&Xhr>3#6Sm+O6%HzJ{?S;*{3GWe zBDRcK64eVyn_|RH;-d0JWWIStlyxb+X>$o_L3NNvebmAGPd736+fu&nO`cRs^jDSt zUe6EOaLE#gL;bWMZdW3y35eCJ)95>YgJtGQwlBwQKE0HxUhJd&M=nRkDKbXS0F{BH)g9_4&rJsErTcrSp>peo5xn{Z-Z1EX~>F z;HtjmpJ&xoB&79oEinUGzCB_{o zi5V#s!5Pmd_wvcw;!j`W=U+~hR@AJ3-}90~LAq==#;? zOq|eC2`m4faCrms;4}lhqy&WP?0utTWX9t69d=Z@x3T9qQ}d2qlcs__74G3pXQrJI zCIo!{HSB8H08kLfW_nq`W^$gbBbl2D<*T#{NKW8jM@Q#`Jq6pf#9p>LJ8?3~ubiQM zP6fi*6cE9D@KP;DOV_{ws**;SLb-QNRjAS=2i+ou%yy&Y%Gg+EdgH}m_4#jD%rsM^ zV%cuj8Uu(eRrRn?6&P8N>>DSLB@2nzDQa_eLIo2t&k{aQ4a zjt`gSfLqb%oV>~p2F~D{jSy47SJ-rirqh&M z*EB5=I5|->>f?AMQru7I4UJaj3~=MSZ8NSXY`cxkPMr%#P-y+Yy8iP6X30XNJv zqPg6C_qAA+1Svrjpl#xZDK@-wEv~VL_>~%E)V_}+TKdi{Q%b2=%>wOF-{ea)MJm>j zIDh|9pI?d<;odmix`&d-#47u#vI>-0{+TM_^OjC|*5i7Ft6D#KSCvU;8E@pw2GuFL z0Uv|!Dk_7L0|bmUrI};66m=46XNJ9pOrrY zGQ%msrU-5`9&HiDILRV+k~32iJKyHo#NxV*Z8!iYhin)jT6;l0VIm8P)P^0~)ud$c zgM`>=ue5?Ckn&Ofm%or`GIG6IFXX!&|6OzhHtuM)ADsHk9;jPcK!7pBM+#M75-6Tv zqN+M2MGxI~b<~WY(la!$gWkIrOQ@)2ovf7vB24umrT34nRRZB3(E(v?x|&Ett6IVN zbiXP{tJCyw{)4s=7<7 zBQ7B^e65E~ac0%%E)8+`;Ud>%EB)Tmzyfx6E68XuW_sq26%D)fa753Eva&Y}- znGJe&Z>vaw%#@??`f^LM`2_Rf)zq>T6^a~~P*TN)V+r;}Q|9W8@|bkOVI|wR!DuwK z0TTMZ&^e&XQv$V)cU{}w$9fkz4hRFkOguY4{)ax6&$^(Nt^*#pxI}eWX zi20Drur)h=IO+KwPoF-E(g1;rib%snfp6k*)t9E+26EINupwI*$ent zlY|g%PmMTT;1Cw3q>Sc;CJ=;^m~oAt#cB;%P`wB;@#QO+S6C_gp@}KDly~IVGlA44t6X zvQa)LevjusaR!clFAoWUdnZU%vwL=s9?bA45?8CCW!vM_QDbpT)*u+AR%yd1fdXsH ztoZ($dp7ffD9{Vt&=3*@*WUK{|2OavuNAIf`ZG$43FrLWGjM5_&tk)b9%M-)PD#q7 zOASSXqtE#TnvahhQE~Ew3xLP_hcKp)j-6?nD9@7RZMu3^0+{#or)bFh>o&kXpxvIUUY8rp}hwz`K$C=bFHE1ez(zbAs3=E7aE9-x+tJWn_J_(%Q|(sSGKnIP@hd-rhGOqxyv zI!orZNA4L=Un0m`TLUmhzPbUN6P$>m`Y=arEo+-4Res%5kHdGD9=4zje4VG&EHS0# z1v&jmQ44nS#z#Jm zf|skRMKGCbjYMW3LEj_^7SjyKCLp!(N5E8Vy`T>6tR6EeIv_{dyZh~SoWZ7g^shu}HV}c1?BdI?KI4KQmCeet*{HQ!?83~rW>Ze$EJ~Qqq ztU>8|J-r5?bOF(LxIrBt?@}H8*D|;Hnz5|mCIY4!&H>< zq|A8m-ldLR=@DIihSY#S$|1|$iGTRb051m( zE-?Y`g}2}hUpP!ZodtISg$R}eI=CB}E2F{#!|igfHD-EKQ>sG*F1=;beuw$eFYvk| zwO-JnXg7w(wTnW;5PnQx|01)+yqGk?Xf^2kw6B0t9QD z_q2LC>U{LXxs%YeR8Z&LyySU^EtHpIVEb_e*WqogNRpek2QTPRBa zpdzcW($d~Uy}Zgs%x16Ku)C&OZf)}HdCZ?y{5)8X#`NnB%|`-1Yz{geBTrvX{|z?u zTd)6EzS3>he+mJ$J6QF@x;bD*>V z$*yDdra0r$T6+H;${K|1vGZ}XraCwpY=PSWC%9@Q}fr3N{nQJM;fYCNC^N=etqvD-%J*=Sks{J z6g(Gl$bulh_V4Kk@84HhmS{5t%$M*v@Sy$gS6n0h9vs*Zq>$tF|CpdvN&Sjc=u6?%cWz?a-$# z;T09`*FohpzpE&idHCs|kSW=J)tQ+XJXu-sejgeD)`?LMBOsWv3)Ch5{5#P;y8e#Hk)#~e6j$vU z=Dwif$CB0{pmBev;T$K`**q^Rqs+6wtoO5tx<^kNXTve?{+sc}vz`VEk`#3&HQEA4 zY2PVT>UjUd*0OFnU%3&n$jXnk_>Dbi*;_uX18221laKk?A}K1bvF#r2im70Z`KQV%5aUD6-!A?TtLEN4wqqXb?+Z|R{5;1; zBo;cIY2a)3FvU`f^yF$uO~U7FXf(m+9g*=LyOr-njQRmWp4dRwI<8u6_GeDV5v<#Z zx2Ou6H!B|cZoe>dYKzN@qQ5G^n7GZyY_&SW8nJP>w<+X4@TcmfiQahSyh-^j__gpkBY5dPhkf=-x#!<4LRSWQ5k^VQz?+T$7$#24ecR#ZF#&;TYD+wS zLC2;g)RuEF!4Gezfc)Ru1j5wztv=sdYiEgK{lPL9a~dN9*q_BfmTm@&L@$IHl}!q5 zd>;K=9FHG zsi#|*%j=YQ?IpF?!g7{Qw*C(?CB)_R@g2#|Vdh!u!=S=uDsWzVO2*tQ;`Xp@10`$e z9MgGhzaIESxV;rb^SVn1PGf>Pb8N;t&M@?pJ%LCq5A&zx?|Wvou4Oth84PY5qZebJ z0yW-hU*y5D+&eDouTbB9+;I-$T6&vJ zH&ZDL^O6ARVCN%1LgfQBFDkVFS7Jx$l%u=rp-BQMpqE--=mstx0qpV6zCU_zH(W^f zDQcGCA{%@mBO3}nti&7R&*$|Bldo_7xm$llqbJ1w5jxw<-*BH2LBc`f?3fCK-vn{6 zpKM_jj2S`_F5ataicp|n2ckrDf;QcLq<9q$*j z?565KOs3v70V(?5=Q(pw8Mo_kkRCM*^OW~R;V#v||3Q6xl?Ygx`&KfB3;ACgrf!Rq zo7PP)4BeARB>n(Z%tF)r7|cV$_7Eg$WE|{+1f*JJp8#hB{n^{8zq=K-nit6Sb!S44 zr#@LY2r&ANc*(HBR~OG8tSw0gG1MZ;<0~%2_t9cQ`RVzxOZMm%eD%r61n|MFyqRS& zyFbI?7O9aNK}8w#C)@$v!63LWa+BUt{e&`S$0)^gxH$>L5C%!eflD)kS z34;%?@?&Ja6%r92N=hcQPYg&nxsm zc_psLl?)iMmXDSC@t(Gh+?c;uo}0~wwlc)uJQT8~L*&^oLhSBtzqp1VPkJgL3!SCo-p)$=1IY@|KDL;J4Z|eZ*QBl0(|t=LF9*uf;aP4 zx)0uNM}m!?MmJq4`zxxQ0;yP}0Uolz@*;e!QapmPu{>8p!c;_GFI9*hK_)GI$;wol5LlVJ%{-Tge z7j~|bI*?&8somzD38pd5Rj;)-i}#T?971PcmQoe8Sbz>yOFQ^2)#}ro>{t=rd!SS_+5efgy%bHC{G3~ehz3g zK$Z)BcS$xs5g^B2=M{p`>j_M4h)~lhb+BQbg>Xgl3xf)P(a<8Hdz8Hq8ScyPPj;cK zfR$=|eN0l3v-Ddm;aOwtX-rDQ7shhb3#KrvE<-ye(a%tW zJW?sJs*6mBmt8x~=SIcbp0xX&Z+DYV$R7#c%Ai2=H&qjS7&bg2ujZq%L0&M^2*GuIZs+OI{~%PUGA;?I|9DRDEyA!k0gza>2w@lv)n#F zfx&9GX0ZV&5AhDSp_;w5_`--9S_t-j00H*&_q~*qy*9_B)(N7!7h@?OY%krTGJpq* zUjapjcCcmihtF^2FqURV(KxkN)T=^+KT`01VI)Q={Ep#yc|7Ox@j=$kgS{FUmPL|i z3suC)K(wwu$c~@?pf`+;Q<9RyelA({t=|-QdxC1$Ex%U*@udP~vA1ex%jy}L;k}PD z<)8hpr#}_Bg^(+%^LzB(0TH5Zn=ZLBehq*ebmHY4RU}H)paWFt{qjjmp66k3IW&>< z@&5co!*dXso{U4B;)ea}JT_Q@t{qVgM>+(roKvZ;v0G#G?48(C?}#`9gI%)r?D83E zva`6SXQ0B&B_G6Vw|Dh-+wU=Q9zocl^xFIS8L0;l6j0hHl#j{LF~~x>S?#X^Ipi3 z9j|i~)4>;fs76gECr;O&-G^Vv1+TP%3Ucylijks3wQWIWVeIjbEr07LWv5c%oil8^OG zD@%!py5CrzUa|PJMCCUQ!*&q;yiUI{ctUgAzXs+!oVdLoRSi@WbX;^XsbP^H5XnB; zA5o`Buoy5Ma!L+l8Zz?_XpZ>AR_~f@z+lfZbJpp;+1G4_*a!4Pwn+OMYoLD#pR-3& zvicl(LDXTvq%at6*@9;RK2dFqd%G0xb6hVS zh>o`Vmt2WfEBFZM`bJ>1#ZFvMlo{R;$tugdLI@^o8TnzpMZwk;LVV9ZTu3#N`Y*5D z#Ps)0#Nm;@U<~0h#-YZ3^xw{8*vC9@&}=Tj`S$57H1r`s3iik!T(oyxLRZvi|{KQ=id*8F!`q7M9LmVUi}p)q<8nZaK}Mb2s1OA=Dkjd z9}$B!a58+QW~3A%EsVT?8A@N#ZHc=dvJvD3ze9n_uY8Z9S)v{dq5R6j5xK+=dZLx} zUAHJdd`8OkeBle!B3G1lc~!xfJ~rq>7(@fj#r-240bz^RmkB1$a25jhyVz01!r@yQ z0$~Xdj@$cfj!TN>EBL*|Hr4A1)%X3q<oXxgi>B%b~pnh+}byr^S zLBRQ*v}CpbZoa29SU0lT>#_W0sG9M{&qeYH{#nsacf)Roxt~T8ZcX7fBp+9SN7IEwo)>N5kvm%ZVR30tPekIUXacF(j zXbm8Y%Uk9r+GHg*Nfz+%v;S*=sUH!HWaiHyJ}`RupLj)Bt6HVAbcVZ@Er5QE)v1`^ zPAO-S>4y}Jq$x}GwsIKjeev?={^8intBruq7;$NS=<^^k2gYtKc6_Bh#0q6GA_8M| z6JZ>T5N7{3mj4{=4jo`rzOxHJQAbY_$>Wwb2rrucK()GoLc**h4WB=kg3M>&onZ3W z{IYX1+UtfKzKB_BVnPAP)VR$VriTC6L{z%n$hp50Zp0DgkeDq*VVFm< zFdAhAg$*_d^M6%YeZGmf&nJ6`KSCR7?;_}jMehTWFxox)Ul0tdo2$kLk`Xw3VZIOS z2a~6QH6Y4!DE?r?u`~rnPvFH|&$3yW0Yd$u0d82%M(}5pi+Qu3nPz3^u@shK#x=!b z=vh7h&6Ir6;OxdlLw)!VBLIHwSV&7hA3^oKAcJfgU#C}wu+^t%d}*5Q*7oi8q|!c! zA6oyk)uwgqgZmePg;IHod~^0MBuXfIAL{i*kqa_2`tzX`Q*TxLQM&Di6V3<8@ThG7 zd2E8Y2zx+!(e_^4V=WH_Po2^n?uOr=*bF}rt2Z7@D8GVtAnmLZk(wG@t-grKL%-I* zi)V-6c{m#D^khL?HEt4ebqX`eQV>5f964&b>zG#~!I$7QA?z$b0o&^9YAP2U)K&Gg zlj*|uXq8=NJREb(OW*A6ZQzV*U6X%B?p5n+z;;HfP1b}1VSF&AAu}TV=*@PfnOa+* zYPcVgi3v-Zg<{E)IeU|~Bo-b_LZ=ChgWFEn72;Im<+3X`5Y~(Yq2C&FE{CuhH8bm? z-N&ueR+nu79{x~jb#i@8yRbLmY_Igb2gzOIa#7LPT?d-QxsQ=-nNkwBr^;6KLMEB+8` zwlG4WkP9{aire}{hWFleJ?@9Hgk<#1evl_) zr>=FQbAn;0ZJAka70n%>?A%C}$C95+ftA2m$O!qIsF=(-<>iehwg0-3Dj75TlGVED zHd8GuYC=OZ^ugF76z7bjI-pat78`m|h*Tdi^>=W2_m!Z*A%AnY8sm9iw;M;@jAf|7 zm5+^q^~hniIHEY}dhRMB$q%NWkjeSY`l)&B$n`zY3-B|6D zZ9|LF?c7RuB$e`DBpQs0;zrbf0SqP zhPZy3XU#GCv$)nwerWo1?OtYgJ5U=x&jhU{`!}$Cts^7*`j`ij&POxoN5gaWG6i;1 z^t0s;8AA7;r37w+Eg$QKiNAnZC2J=9F&3 z!__bGdG(&Dd~59pO)>7>(V<}#fWVE{Tz%Gn=-=1SzSLU#&}CV zSsr7G5i_RCgJb&lw{x>r3us0T5wVk?NUtLbbqgc{SQbm_{IGZl3-O@H(whsIoU59eG7M70S(V6IU#6c`IB4te4*wC<+m>wxWsC;3OE*xf5UPs^pdTWrzwi}w>+9oX6h*bkp z$E$O-GavrZ`0`IeH_vktGe*V)BCKF`T15a)Fdspw(h}ylF)bv~8V1!JDZuS6xk zR!wD*9b7!Y$Q+SP`OqKL4J({OB+O|h_&vgI)tFZ;)TN;l&WXo7$nHwRMsM{h(+n0T@{mH2dOv`MU_?XKK`|vz~yc5V;oso@Pu3lvFh1m?Z;L*m|;N{ zmOvJJ6SdtF`;|+{=oK$dRO`p2Qat#WI=ZPW|8Lw@>W6}s>VtGVY_Hsw4qR&XZlAVt zZd|xjEY17&m8Vj;;?^=R3K-e^?bxTYfpGA!Csawf*OA41OLbx91`$ zf09&sjeaR5r(hUHW?F)qz=3)HRb5 zD6a?=)l>STB~o_y=R&iFGQsDl+IUF7|2D`3Nf}gWP3<|II-6GvWC~L0Bnj{&3JTpm z?ktbTcZ9Bm3c$p6ixw_O7Uf%2h-OCGWeplpn3|B2AdMz z&Crc4ycSov%-bj|*y*W_ye5bzpPU=v*1ZUv2%gaRVVW}ew{ogjz0Mh4doT0aea~w< zuHw@ga4r773fSWLDFgPpSfsatHW~XZDn@JBww`G!8#!0^mCu!hfN#lj?#9EGv~nw+ zfr%z^drPPs`vS;@*!~Z%@DB@QyHh_qvxXc zA|iA*G>BsxaE0PP8>9IbLSgQUI<{~e-KJ@siRkp|bH$acwRdu5s70d4hN7Rg(@~|p zf(X6bLj)z2r;*j>sC-1HqwC5yf7+tc{=0ml{rAqf!M%Y3u$Q}~wed8k(;~81@P){Q z>#hL6a>ogEYQSZv06Z~3ZNcSZ6F(-ps|>Xfo`GeyMBul4Y$43c3^);ZpMvn;EgF$+ zpngbFKgz}>EAL+?*v8WkT z5A?Awbj>_3KkG<#2wY_B=T|nMtP_siDQt@k(`IR|J}mz2yPM#fF!JLLLm%3RGFJvX z3)rm*I%c2$Z!eb@m&boAbWc23YM#def9o2&`rNDie37=4T>aoHBo7T&n%c_McDITe zal4jvsja!lPqQGpE0+Xkt?(b6gr2wleRk})ruw_!hu0rKT1dp8dv{EG6Gk`Zs?ujRoz7G$#{9diG%l`AcOy1hN1nLygaxtzAW#1wD z@CW7oG4hSsYwdiSoSw3~1dDbB;Q#Gh?gqAw_#kev*z7<0q!H`K0G%Y65LX+7 zdJ{R?j$@U7j-8K}d~td?t3=Xo*}12S;yfz;x>kvmzuL^|=kq+OQeL-RIV7zBw-u<#m9?Iv9cqDT4a25hv_qqib+@d zNXq5WKK3?}SLjnwejBHw#{T&^3yuUca_RW2Ob$3&&dcxh;$gb&y*G3`ubowY-!`5W zwf_Y8`9mCbg)TdBJ^mzk9%6hK)LNs z_j^t}x1Fo3Hf=vZu(LPX?|dqrbq2s!u6)hqJ%uq86?_xNZXHr}&+aTC5m1W~k9~&d zU%q}!XaN!N#V!#!-x;gj6$xDbrjHBJ=Q_6`{QvE(jEfgOJP1%9U;VYE2jFA2-1_>_ z4zs{467*1!_1^kWciQ`=yC1wRHOG|_<0*o{S9mQG`{15 z4Kcc3yKnYIn&9i45OgD~E8#~T8}GLBJtP2LG!eM!dO#uOo89YSb}oH3BULPer4N2g zYQ^b(`5mw)6&ERIkBnH;$fiXEem~rRI$*msXtz(pmAo!GrcQ~O){+{W6Fc@FwmRTPQjNJ04C$S=9<>Y107#&`^B&i?U zSArIX!_RdvCu+4akTdP9Cy5M;aIX3EjbfDd1WhnSY*oF zTo7`PK=nO3Wn&gk7#F+=Tn-+P)W5(Fp+99^>!Up$-&-8@dd5+&?g z90zTe%K^*{P8z{*n20itAwW3zXo&3YL)10!eXsHm_x<_0_j zNyUrdjV}XIZ)-@#iw02+{=?W5~uL_w8wF`)!{Ib zS8yX@jYvI?A|sYYqHIy%f>lly@UJCbF@htrj2bmTn6*QUwIx9d+YBZ_Cn zW<-ORk2{K)J?6k?^nnAPxdZ*zZ6veQ@pHK^&!FutCcy?NqJ>VM=b_d7M@4=90p_uA5Epz->#l!GT_&r70?p`-mbh#AKo>U z0Wb4y{hkovVrlZ>U6`i;>u*uux5uPV5x~PF^Tj&1d&}f~odd0h%!CQR-oPu0Iw% z99^oijcpI=KCU!m>p~E#HBvp2a2OLwd&ICLBCvX3;T+Mfdbz$T&Vt<#*H~&yz@k;%-;bI>&du!i1M_sU8Tov&KdM zK|nj=HS7E%0>v|5*kIDRH3WiSgfCT-dQmegkT0HJSiU@wl82$fUZId8Z=;Zwg-`Y8 z33Nr<`##DC_K;#`KI~}J-c)zV2z;iv=s0g5Huh^pvFNQ0e7PJX^@aa|&Nr89jGjCO z@Rlgs*UQyzgA3li>^lJAq!y}H4ge4e;p8JQbm8derx4_VRm3=5u1}9cEY>h#a$qqo z`UmsqCID>V&lH21dF4b@b%N)h5 zD%(t1(VjhgW}8$j21cKxI&;Qc3EQ%oItU3QH=TG#@LS6Mqw}RuR(`fUAPLf zeAM*Kx%~Pt^F_wJjMw^g4H9bDi|2So0SgQM4l|^la9}XQs|A&Y4jP+yT^))lp=q(m z&m$REI!L@ZK+{0mz%8MW#G(vo8vU0J%D@{U8#qa$V*z8ziA?+jmN;vY$~Oh}M`Ic(gf7!+JP#w;Q;U@WyEk#RBa;hRi$$iLygBmftr z^p!V-1(1Q~kD@K`uNk^O{_s~b_t(g*%jbUFX4R{rbB&JUgC42MSnKvRC)VW4 zS*EVGp$c?-Z~@c{D{n)2I1aimpRFND%O>h$?#YC?nWf(}a+$%Hf|C8A_z56c;aAuG z;-iq8sX3$%=7Ff=q+Y} zm!b=cCB2r_ZFe!=Uf$%+^1B)XOliOy&IDB01%r~Rs?*a`(QNRx^5bO_1$ftAB^q8% z1W_KApKjgw0g$(!o=mv`f5|_|AFgzj+rZEo)RE3=!PZqNLgis|ibXoD{D>^whSyI@Ao*Sp^OONFj5Q?^5Jdp|V)$=Qs>M=st* z#VZAWq5dKF$pUP?ogqFh4q_F73%aG5eduQjruEayX)>dW8aFv#JB*cj;~_-X^NrDf8Lijkd6;vy>)#S zfe7lTl_|TO(3DqAZN}q|zQ*I{zBxR4z{Up~8ncjL*b#S(jkX)70VG~W9>rG>8BeUb z)S29`DE3rSd!3nc3i~TBUADZR#zcRpKX{7ak&&uIvQa0xM9$W2CHcY6BNv>$UMJi}Yg7p)0p@sUoT!qUHF8T6Vw%PZ$+nlhCjAr5z|OS^=+iDcSO5#IC>k>q9Zz#)eOF z-*@<-9-7{QpwCkw{Zyz>XtC!$FTA{7jN*nfvc<)ku2dPSXO$$O^-2*tfPp&yszDs| z1G>+Xb*>u`OFFk6dyFs362fY@OC!v*_qKjkM8tIe%?8wzBQV}d71e@aCF!1{s!z0y z&Q&D|8bJOM=k#+m=ol4!ma`PhBPF1!&yyNXF%`M0s&BQA&ZSnAyd9#;NrXD+A{`kT zBk%jer-GU58j(<)BDi?6ARl@D(?oW0TClYdV9BM0g~N>aKQp4tSl2*c*d0Z$I(fFJ z&~ORG#^TFXUFSfzl-?)diDKd)I((5?!v?>NSV18h^H<1=ADejKzub{XfoSN_1Gzui zgDBVmrnfA5)DsyJ?pjPAC3no9W1T%l$CLGsBwKC6W`5)Qui^itcq>qe8p#>IIK>acIk=rfjA% zeixm4eGn1-$JP0>;zurcYI|DhWg^jAsqQ+0o-!2Dh38s<)!x!3Rc*OGRTNvHp%dh< z5qI~62u9_(T(7wG2qlsPXwd<{pD9AogUt8Y-PM*HC_fzEmRB^CSB4JG+k$ZK=AAs0 zkcgYpc2=A}mX_>H7kpWk`dN!RPa<#WZ+skJE5NVB-<~x+1xJi89CfPt$3GtY z)5E}>mRiTW!rGMw9L*}d@Ds8}|ZR;oJ1G3`^ zTujRoF;q#$w{#Un9!LXE=l0%61ki+DNV-q_v_gXRp@0ATi^)A}rx5i>$z!8t`#l3% z*u(-Oy;3M;Ls6)kIuq&gOj;W{rLKNyEX`%ZgG)zo*yzj-?uzxF`+rPWkzu~InZ#ak znEaUA##xn^t%DG5RrZS$v36$&fAo~FtmqggJAe!Wj5vWG!oa5mDQ#Ls%G`vk#5q{5 zkq5>I&`7!TUvft$0p)OZqV{>RxP^NqM+xL5=(ZY2GU-Ax&*K%M%4(I0Rcwi#dsx$lTqHIp5lMSi(kES@ng{ zP-x^AgTVy71=p3jzrEdeWSi`Cz<$H`r@Wzay58Q`PL%-`FvUSq&fi>r#_pKf9V&7} zTAKmT0xrBXwP*YLv=_*;`DA5-1Dl$-$ccRx`YV-Q*msNopYp|WfhGYt$V{tz@9NA@ z(a~MXT`O@I*wKczlR5=v<#C%dQuTv#9{MT%iRTrJL+qV4X;<$F)&IvQTTs(--}#*< zq`Qc>rMe)kl6x`)N+afCma4B5OXE;~@sFPW#cQDtTa=9AV=e8&-klcsZ%eimS51I! z7;l#+8J&?sU;Wn?-?7KRi6R{hzAr`BjMV>;==sOuW=h?^#oyw|qJ?$p#O@Ze$L=)B zAa_#;<_Dt4+xsf%2N*tt?VXuy&rJ>i!Ny00;F7KHpSxaeSqo>x$sIreHJ1E!M?b!$ zo{E+ly?TyH1K~!4Hs$gBmG)N1x^IrU!H6{@M(xD7m}sb2FIMV|zNl)QYds+;*Q_gu z-waoF(tn_*48h_hz3g5TNll6%e&OpayShdoMJo6PatWZhtJ`;QmZeZFfhjhWPHGy& ziOyva4VXPIc)Gy`$3DX9E%`>nP%6_UC)V?$goGA$G{5)8B`s`?rf4C{)3A0rnRZlf zq)N(#aw67q-QpKXIlsM)`eebKU75IUB*kVj{t}}7+4c|zBoQw~>IQb4iZKI#qzPbY z#9lgi?kFml_m>d@9S(fNY1!5_VWmirZCe}}h1G3g72;q7Vma0Utc`Rvmpo)H zBpUz=|Mo45ReL|(S3J(IQ}EXrVoUer&pf=w&_9;uNbzW${Z0pKsJQ7a-01e2d3&CP zqmX8KBUzAozh{jq8BoDks>wb||Bq-r2KYQ2zh+=`h}D$|$dobI!WYUGEu92Pe26yZ7w01X-*Y4#{8F1*$L(vqm@ePsp(4|4zu^5{ISdf z=p$YX(1f`wF|esD049~hdTTqAkQEViqWbE(_fCulLub{S9l5znqJB0)n$7>cs+j~9 zz`G?+5kZHSC8y$$Dr)!I_^9^JBP-5UW8mu-Yu+|f+OK*($YK_7#=m$f{LfvX!D`sos}!+z#4h;zw#>RKj8*JX$o2sStlO37x8#Q+4+8&jgJ=FH zFqrVg%zzL3p2)IDby4Z#4?Cd=0}k1hl+RlBbf!mN{sr?bU#e4P-_u^Lh#rP!QGt?^ zSDo*j?#`-;(XH3*w8hx>{Y6${sD{?0JRUl+Uu+I!I8X(fEK@j}d91EF{&5mzYx*C{ znge-R{4q!D%V=b~anCw~x;FGj%bl1^&cSL4#ll7mlu-7Z1BpmaOdU+cT4I5L zJp^eUErtwu@7S;_GSG{i69bGfoJk{-0^HfwJ3D^6$G11U!lB!=5}VR>-XCKwe_2To zL+~v4l$=JL3h%x@W|~`ZWq5brD~#2}e(il|bCtpxeEQo-$mJ+zUdD{r_u_;CXBIBl zDTYqS9*~H^PzxyS)>I0%_=D2@<#B8X z^1n1cECd$W$3A7J%k|=yolawpHNL!tPVvcLNC5Z(Cg<|zI@KaLJQ)tQcr$YM3^sh= zkIGGp7jIh=Nx=Y1OS>6aKrV~A{bd0z9}+CVV523x*L}7)okgrTo^qmr3?O?t zx$bZHm5&~{(q8o1g5RqK7W+Gm%EkBq`?M~aY9AHgtiztltC@t#hTvs)Uh4yAOdSUe zJ*@7GVODLv7fPGT-`3Tc%0&q3!#bK$verR{+Ir&GRkgq|xW z=uONh2mfXVQ(?>(Gvh{&r~cxB{!%vPzTB zYlR`<=wyj+rk%ByF+qh+4nCO34+ARETH0DPWoIi8t7`(?au4?!v($dhckIr=2$>mI za?;Y3cSVXI;G>MeN`+}TQ-DRi|M={HVoJpR9P~-hrTB3zNjSFX2^-Yp&#?-1ax4Z z6-5+Ti2VnTMO0cIa)33Ieyz#F30`kOFn%Um@9;otFsET<=BJ0n6MG~^a8GP_c6lEi z-YkrQ^5?@1042(+o+UA%d)$Sd6h#Ljf0aOS6h&aMk_e>al;l8qf~a(ki^qgxy^t_o zu|_uk83UW%n5+Z)4;N!u>h5+TR4v({+V1a4!M=O^09o2X{{l+G@)n&Ae_?aHNaOQR zF~qI?dhTjg_k3=Y5I%Rw3t%!r51H`&)#|@Je&j|lrKH%06Wx0Ig+ROQ@&)E zFcE2oLyKIPPVXzW$!ZPhd>=sMFT*S1PxX)ojRf1Qz4EDn&@-%H&$d6;((LH=RS3lo z)3F3->w-Zm)-@l$N2Z429LAWY(3+0Va<%ht5*HwO%DMl$bFvd!4*y)`=vDR`)srHE z$gh|t^JJ_{j0VdY4Xrhuf=U*obxZ(SQ;q!77#hZ1(_4hpO74RvW@zWzNGx{P-dUJ^ zOTA2sqi}atv(<@eje#Z-P&3Pj7%q-rKx!qg0{HQBF`9yhB=4e)6$$yneli_SCV$c{0?T;3zn^g2$*6WOSpggx0W2>o zw_hl>aJH-(*p_Wx*WKw*It%t92Tl$0gU{?q<13d+4er+ z-4WM8&$)$lvoL8$pY=|Rmrrb}h8l!gQOEZT)(ft^t@`ME+Yfj+zm9^sobjm)N|X;p ziyE6@8|iH{o$<8;wXqGlbUsh5uLg2ZeW#(U*DGeWV%*A6VQLQ)!EID}Pi;WY-MI<; zD4rGsU-BCeUQSs%$s~*>iE*xHl8fPex~{DhTF72OGgIC2y6~J9luV;?S+oW@}%Gu6_KDS7y#M{EN0N?`z06hYL0BIhhBJ; zb^cA%M8_fsoaj^-gVHD*5jd~K>AeltMf?9(I7PI0bddQs|q zgiQwfE)u{NF`&0VhK@s0Kad3@h-wJamE~tISqw zf-^!~3<K zsOsyb!&rB9`)ap4ucs9aQpz901*m-Fcg|pOFqFZrfzp6JSp)00KnOwMM%)emtbPc< zttv0dTpvq-nqjZ6LRja0JYP#kNucZTBGe?3^}nV33tAmNB>b^!Af<<;K@|;1vY%ky zpImS4cD7E-zb9nD`y4J>QIp_WcCvkJdo4oOsd*%f<;faF#Q)=hxbu$)f64WG;E#uQBh0ZrVLuWk>PZG( zU7Nw!uqy~n!Xfq(HK}TLK#&T>+?t`1v^+)yLjzaQH;o2@Op9u|riEv2N{%Msxu4Vo zJx8w21|^V@I~3IVu9=|yDNIoePWczAkegFpSykEPFQP5P6Ave}*gSKb$s2kpG))$J ziPu5mbtn@(PTUP=Z0V865_}42ur*BsTz|ifX&#a-A#e9D*HgRj1s^&(l=nsu$)LmU zah{X=3(D{6-CN$~#oAO}MS^oCJS2>(vQBG_)DWi3OpRvdhgGmcymz{Ja~T{95hy_A zptWz&teI%kCp_AE7EAju+=^}z9u*B3*WMj_BrLPufCQ14T94}Xt=bHP1QFD??2n+3 zhfGW2`$^i6Z{dFFDv@2xA385Nq2(rkqvxWpc;Y?HP4kx!^mS=nrFu>qb~#z{g)yOV zAZp|5LX;_;EIGo=+?0#RH91LdK@k>~6sk$U9vFi_`cv{85Y;QHbGN#@Fi@m`1+cGg z)7*r>Zc=Etq%CS$@9jXgJ&nlE*HQprzT`Z`$cG%3=ET+wVPc z9N~fl14eXpUR%1Is=A-7AP-QE+#Wh~&3o?`t|mj48*Ii+1(1;#2}c0{^q>Eo5x@#K zpJ+%mfUsPyln<0hzMjswuRTzhMemuI1CH8YiidD}wGPP zGW@T5lVA6SzfwkAys@HNc*|@bW~pIgBoMvWl&%C4ZzAo{S}zw?(9oj*(x~1t1q9FB z&(A!CfP)%6;E)C2v%m*HgtTxKk^bv~e(i9bfa^$GN^m`R62uC>67)4>$~e|m%n%d< z#cV?CT5#G|MJK=i*CRDUfp1(<>+)#a1HC;NczS&f8y@}P&Bl_z7ykNue;tBI;;D$G z2tjXpRqdWLg;~xB_mE>Od3sd*{ZbyBjtiD}^>BD}Ho?2*`3B6BiDIB*ghv5hO=V7G3$k=A9w|${!HznU^{hfY%U_Yw= z+=%K-tpe?dJFl6feCsd~)px%r=xf51HUvmmxVX7p3;nk6Cb_DW2<6@#H$>MKa{0R5 zU0J%c1!mh2Je-7!>G&ziJ)Z}^{-n%WvxvZP8CdlRJMFKCLU!`d=6BMA$^xejixW4vQ zHoo%KJijl4Zr>_P!&rfsNB#O1y0w-B%Che@lv6u@PG$5Xcd+K32b8|dQIe3z_<~iU zBD|qXEHl^l<9C-@kCPcyrfdogS#2wVT-&@!1HlcfdC7^(3+nVU?%8%2S*ehKURH6*mN0mFb=KB`B$Jnz9`K#Unu82##l%q@^V&-Z%lNjA_#wDtb& zFm_|Gt9JRNr#}L}5O@?RM*w?>P%IaEu|1Dq8L8o^+S&^$#f`(;t&w)TRXieKMM;9p zz0;6E?hiUCao;xdC+8ETNhHEg`b5;7dT+IJX29t429~R_*W04R%RG+0({<~DwwNHg zffo6Hf6*hvuU?a^U9ME23O(N2cmSKoKaB(I{*`z((aUvRz4MAgVlDehWd|~uDfs>0 zG)L&q;Vp8doy8Xql5P%(T%bm}8A`WS$L^lGqDld7f1m%6`%bqA$_Mwy`B}%H1j~@T zVMBl~3KcDu*k9xnS2wpt&HL}LC^AXJW{Rk5k2KvblK%nWLg_wx{fFmQc~ofizDfJ1 zx>sOz$)3B{JFF&O3tLGXmIRdUiMy<$UnQ>h^yoQC*ype4NkcF+jb88=g7{sB^+l6OsAhsf}D{@jwW?i!V$kc?YB%e|XP8n<6O5Cv9}D%{Ksf>Rw(e z*L+pk)xsC{jLTbn2lMmhT^FZO4EP&c63tCJ^7fcB*v~U-<)K3Vk@yS3w_@t;mm))X z>vTE+G7B9PQiL{0bNkCC20>`zW$3w?|3q0sJG6*_fj>jgU&q{0enEA&JaJN%>h$w zRph9=J~7|_6$*ndFM7VWH+50$60ij0iOJT3eSn3n+T4F1AcVf<;0PZQSvDAW-g{`# zFbVUircRtV0vnel5zchM^UJEFFD-G&D8)=12d_Q&B$fN7Ac-gf5ABk&KK zzjj+W(-b4(x56#zXn$?Ov)f7dBz*YrlMTV{dF7y3ueMAPdx9=d@ti8YsUJWS9m)T?iiR`V2>Mvn`HE}5`DShu~ zZ>ab@31BlOU1)}wE%Y{}18_O`mcZ;Aso#0AlYE{9 z#`iFctl!k~24vI>vjdPR7J@KHPscwRwdMa+DUd2_b)19;D0{=Cd45VgZThJqNf>s} z3y?g1P4e=Q?!R{)@ah3HZPhNRX+whkG0p>4M$G2^b}8n1S04Pv@AfN*9F1Z84_N?h zUr_aZ?cRp(YZg+H4ZDAoe1z#8Jzd4=y5JuBW9IvWWwhl0KslkcG$V&F-ZyR^2q$M`@Qoa0v(8f^5EeyDYDGh zx_u)=oHPzN9n6LD&T#VHdtVL+eZG6_V#e#{H0s3@HX*%i6WR>g2MNDCh_e8)X4*Iz zi?^sfUspvFjZ=j5P%69b3LY+pQ}y+^Y>9QfFF%n0H}?b(ANu`X`4VQ^wl}Ch z1_+auUJ7Z9b;rWJYpL1a^HFgoBm_AWSZO`P{I*8KEbNvK9EUkP2vZo2#De}H5@B>jy?Rwlkwuja`g!tJSed^+kOTRw3w_u4Id8&- z&l{)StVba~7&aA2d;(pae<3vjh6Uc^i|hkWQpO)tUSIq=w#;wceEfD+R|vV}B2U4d z?yo{;6(s*2yV9~2`cZ{#!q%%6E-}pq>WmqE1UBV30a<-uz33)0Y`jMCzF5W7y-{+% zUV0w&SL(0-tJdTze6D)-)0_AxIvmVpXx{p0T(AiO%lzalrCJoc$oiT4kXO?C^<;9t{i!eS?Qth*XShwWJVXisALyoE>1XxEn<<|Kc$E$xWrT?Tj+Y5?Tzi$T)8Pl;ch5}+@lnvOh3a@^qcb`|+y-==bBB#7JW27Wg|3cMJbjnb{rr*p@- z!wK^PJ@Z`VddS#`r2^QJ%7Uv=P!qud#!jb|LYb+NW;^KBq^4Q9#xrq1@- zoIrx`UfNGVO>N-$_xM3~z{azV2KrWl7!~Sq3?V$0<>q-b6n;mF-{}fS8CHE73N0qN zGiL68xI%w^yz2|0mHD!R1O@!7W~S+1E_M zw7Y_iTSD}egg^%wTpS{08POOmkB&1CxA%_3r!eaY*g8Vrr~3$D4+)7uGGSl5`1jXQ zmN_7k(rGi<(wsACGiHxnR$W#zSOad!tSf3iKOwF;{;QT;*3Ym8VNXpsntA$9hJNjr zE0CGKfJMUCjqhW#)#M=^{A+Y<6Xrt{api+$O8!j?YB-FoWYDgEDH~cpw{I4Fmu3n5 zv`-FCV4zIBKh#oHFyDMbUcQmW9fc{O3V()V*}^5#`jzCqdAcmWqnV~`_v|GYoB?s^ zFBAI@T42wWAtbNr8?E0F2w}ALE5Zd0W8We4vMutOY>dBzO41Y{^!ymt4-vZKy(MY# zb(iCY-lzEuO!`8LPVB(KTno+u4F&uqLQW%azhb&I?7RiIp!`?vU1SHhfGbo!H%djF z5srG=chNyEaV4L6#(s>D^Jv#+VMOWv&4*kXl*F2acBd8U+%#|c;=^~CD+Qi4(!8({ z*nMZ>U#w@SNvJEJL~N2TbC&rWYs{F>c$vjtu3(UN<#^lgD4of0(54ku)9e4qZd6VH zV35EnTfuPfT{$-JY2wQJ-v!cu^QX>4789xv{$hpKI$)PIC0z|+(^LF^w-0YiIbPz& UUcZ+AJ4sPSLP5Mn)FANx08Z(m-v9sr literal 28168 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 diff --git a/icons/mob/screen_plasmafire.dmi b/icons/mob/screen_plasmafire.dmi index f251b8b167e5d4d514bb18bce09fb7329e83c923..7e1fb8308fbcc71bf7df073334371e5b6cfb57af 100644 GIT binary patch literal 28383 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 literal 27392 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 G81z33OA1c_ diff --git a/icons/mob/screen_retro.dmi b/icons/mob/screen_retro.dmi index e57cefa83e38b879576b0f8d6f76251b867c161a..e7c40db5d302b5a1669e761283eb7516f66543ca 100644 GIT binary patch literal 12699 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 diff --git a/icons/mob/screen_slimecore.dmi b/icons/mob/screen_slimecore.dmi index 01831250b80bcda597cce30b288fb98fee555843..3d335a846f93878930e10a308a4ecd31bb0f98d5 100644 GIT binary patch delta 9928 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 delta 8840 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 KMNUMnLSTaS4Qa0c diff --git a/tgstation.dme b/tgstation.dme index 50ff9eba35a0..2b8e694dd3db 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -20,6 +20,7 @@ #include "code\_compile_options.dm" #include "code\world.dm" #include "code\__DEFINES\_auxtools.dm" +#include "code\__DEFINES\_click.dm" #include "code\__DEFINES\_globals.dm" #include "code\__DEFINES\_protect.dm" #include "code\__DEFINES\_tick.dm" @@ -160,6 +161,7 @@ #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\signals.dm" +#include "code\__DEFINES\dcs\signals\signals_action.dm" #include "code\__DEFINES\dcs\signals\signals_global.dm" #include "code\__DEFINES\dcs\signals\signals_hud.dm" #include "code\__DEFINES\dcs\signals\signals_medical.dm" @@ -169,6 +171,7 @@ #include "code\__DEFINES\dcs\signals\signals_screentips.dm" #include "code\__DEFINES\dcs\signals\signals_subsystem.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_main.dm" +#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_mouse.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movement.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_living.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_main.dm" @@ -223,6 +226,7 @@ #include "code\__HELPERS\reagents.dm" #include "code\__HELPERS\roundend.dm" #include "code\__HELPERS\sanitize_values.dm" +#include "code\__HELPERS\screen_objs.dm" #include "code\__HELPERS\shell.dm" #include "code\__HELPERS\stat_tracking.dm" #include "code\__HELPERS\text.dm" @@ -281,7 +285,6 @@ #include "code\_onclick\right_item_attack.dm" #include "code\_onclick\right_other_mobs.dm" #include "code\_onclick\telekinesis.dm" -#include "code\_onclick\hud\_defines.dm" #include "code\_onclick\hud\action_button.dm" #include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\alert.dm" From a8be340925e0e5722b5271bd91f414ae23ec665d Mon Sep 17 00:00:00 2001 From: SandPoot Date: Wed, 3 Jan 2024 22:46:19 -0300 Subject: [PATCH 2/9] fix constructs follow-up pr --- code/_onclick/hud/hud.dm | 8 +++++++- code/modules/mob/living/simple_animal/constructs.dm | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 740174138d7d..798acad4aa4f 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -340,6 +340,11 @@ GLOBAL_LIST_INIT(available_ui_styles, list( return /datum/hud/proc/position_action(atom/movable/screen/movable/action_button/button, position) + // This is kinda a hack, I'm sorry. + // Basically, FLOATING is never a valid position to pass into this proc. It exists as a generic marker for manually positioned buttons + // Not as a position to target + if(position == SCRN_OBJ_FLOATING) + return if(button.location != SCRN_OBJ_DEFAULT) hide_action(button) switch(position) @@ -429,7 +434,8 @@ GLOBAL_LIST_INIT(available_ui_styles, list( if(!button) action.ShowTo(mymob) button = action.viewers[src] - position_action(button, button.location) + else + position_action(button, button.location) /datum/action_group /// The hud we're owned by diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index a65e7a71da7d..5f6c7a8bb2bf 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -63,6 +63,8 @@ spellnum++ if(runetype) var/pos = 2+spellnum*31 + if(construct_spells.len >= 4) + pos -= 31*(construct_spells.len - 4) our_rune = new runetype(src) our_rune.default_button_position = "6:[pos],4:-2" // Set the default position to this random position our_rune.Grant(src) From 05e2cc0979ecefdfe646bd94740c082e8185a332 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Fri, 5 Jan 2024 00:18:21 -0300 Subject: [PATCH 3/9] there --- code/__DEFINES/misc.dm | 3 +- code/__HELPERS/roundend.dm | 2 +- code/_onclick/hud/action_button.dm | 2 + code/datums/action.dm | 45 +++++++++++++++------ code/datums/elements/polychromic.dm | 19 +++++---- code/game/objects/items/devices/PDA/PDA.dm | 1 + code/modules/client/preferences.dm | 13 ++++-- code/modules/client/preferences_savefile.dm | 41 ++++++++++++++----- code/modules/clothing/suits/wiz_robe.dm | 4 +- 9 files changed, 93 insertions(+), 37 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index da01956e641a..edd9149fa391 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -521,7 +521,8 @@ GLOBAL_LIST_INIT(pda_reskins, list( #define VARSET_TO_LIST(L, V) if(L) L[#V] = V #define VARSET_TO_LIST_IF(L, V, C...) if(L && (C)) L[#V] = V -#define PREF_SAVELOAD_COOLDOWN 5 +#define PREF_LOAD_COOLDOWN 5 +#define PREF_SAVE_COOLDOWN 2 SECONDS #define VOMIT_TOXIC 1 #define VOMIT_PURPLE 2 diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 469f27926ab8..0b28f4fb2b86 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -668,7 +668,7 @@ SSticker.show_roundend_report(owner.client) /datum/action/report/IsAvailable() - return 1 + return TRUE /datum/action/report/Topic(href,href_list) if(usr != owner) diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 6b70d8cd4562..af49128d2516 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -125,6 +125,7 @@ position_info = SCRN_OBJ_IN_PALETTE user.client.prefs.action_buttons_screen_locs["[name]_[id]"] = position_info + user.client.prefs.queue_save_pref(1 SECONDS, TRUE) /atom/movable/screen/movable/action_button/proc/load_position() var/mob/user = our_hud.mymob @@ -138,6 +139,7 @@ if(!user?.client) return user.client.prefs.action_buttons_screen_locs -= "[name]_[id]" + user.client.prefs.queue_save_pref(1 SECONDS, TRUE) /datum/hud/proc/get_action_buttons_icons() . = list() diff --git a/code/datums/action.dm b/code/datums/action.dm index 29c4fa90dacc..56697d9b3e52 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -16,9 +16,6 @@ /// Where any buttons we create should be by default. Accepts screen_loc and location defines var/default_button_position = SCRN_OBJ_IN_LIST - var/use_target_appearance = FALSE - var/list/target_appearance_matrix //if set, will be used to transform the target button appearance as an arglist. - var/button_icon = 'icons/mob/actions/backgrounds.dmi' //This is the file for the BACKGROUND icon var/background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND //And this is the state for the background icon @@ -134,7 +131,7 @@ ApplyIcon(button, force) - if(!IsAvailable()) + if(!IsAvailable(TRUE)) button.color = transparent_when_unavailable ? rgb(128,0,0,128) : rgb(128,0,0) else button.color = rgb(255,255,255,255) @@ -225,14 +222,11 @@ /datum/action/item_action check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_LYING|AB_CHECK_CONSCIOUS button_icon_state = null - use_target_appearance = TRUE // If you want to override the normal icon being the item // then change this to an icon state /datum/action/item_action/New(Target) ..() - if(button_icon_state) - use_target_appearance = FALSE var/obj/item/I = target LAZYINITLIST(I.actions) I.actions += src @@ -243,17 +237,43 @@ UNSETEMPTY(I.actions) return ..() -/datum/action/item_action/Trigger() - if(!..()) - return 0 +/datum/action/item_action/Trigger(trigger_flags) + . = ..() + if(!.) + return FALSE if(target) var/obj/item/I = target I.ui_action_click(owner, src) - return 1 + return TRUE + +/datum/action/item_action/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) + var/obj/item/item_target = target + if(button_icon && button_icon_state) + // If set, use the custom icon that we set instead + // of the item appearence + ..() + else if((target && current_button.appearance_cache != item_target.appearance) || force) //replace with /ref comparison if this is not valid. + var/old_layer = item_target.layer + var/old_plane = item_target.plane + item_target.layer = FLOAT_LAYER //AAAH + item_target.plane = FLOAT_PLANE //^ what that guy said + current_button.filters = null + current_button.cut_overlays() + current_button.add_overlay(item_target) + item_target.layer = old_layer + item_target.plane = old_plane + current_button.appearance_cache = item_target.appearance /datum/action/item_action/toggle_light name = "Toggle Light" +/datum/action/item_action/toggle_light/Trigger(trigger_flags) + if(istype(target, /obj/item/pda)) + var/obj/item/pda/P = target + P.toggle_light(owner) + return + ..() + /datum/action/item_action/toggle_hood name = "Toggle Hood" @@ -403,7 +423,6 @@ /datum/action/item_action/clock/quickbind name = "Quickbind" desc = "If you're seeing this, file a bug report." - use_target_appearance = FALSE var/scripture_index = 0 //the index of the scripture we're associated with /datum/action/item_action/toggle_helmet_flashlight @@ -942,7 +961,7 @@ target.plane = old_plane current_button.appearance_cache = target.appearance -/proc/get_action_of_type(mob/M, var/action_type) +/proc/get_action_of_type(mob/M, action_type) if(!M.actions || !ispath(action_type, /datum/action)) return for(var/datum/action/A in M.actions) diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm index 2649a8ee6f7e..5b60bed6fead 100644 --- a/code/datums/elements/polychromic.dm +++ b/code/datums/elements/polychromic.dm @@ -63,7 +63,7 @@ if(suits_with_helmet_typecache[A.type]) RegisterSignal(A, COMSIG_SUIT_MADE_HELMET, .proc/register_helmet) //you better work now you slut else if(_flags & POLYCHROMIC_ACTION && ismob(A)) //in the event mob update icon procs are ever standarized. - var/datum/action/polychromic/P = new(A) + var/datum/action/item_action/polychromic/P = new(A) RegisterSignal(P, COMSIG_ACTION_TRIGGER, .proc/activate_action) actions_by_atom[A] = P P.Grant(A) @@ -73,7 +73,7 @@ /datum/element/polychromic/Detach(atom/A) . = ..() colors_by_atom -= A - var/datum/action/polychromic/P = actions_by_atom[A] + var/datum/action/item_action/polychromic/P = actions_by_atom[A] if(P) actions_by_atom -= A qdel(P) @@ -146,7 +146,7 @@ /datum/element/polychromic/proc/grant_user_action(atom/source, mob/user, slot) if(slot == ITEM_SLOT_BACKPACK || slot == ITEM_SLOT_LEGCUFFED || slot == ITEM_SLOT_HANDCUFFED || slot == ITEM_SLOT_DEX_STORAGE) return - var/datum/action/polychromic/P = actions_by_atom[source] + var/datum/action/item_action/polychromic/P = actions_by_atom[source] if(!P) P = new (source) P.name = "Modify [source]'\s Colors" @@ -156,7 +156,7 @@ P.Grant(user) /datum/element/polychromic/proc/remove_user_action(atom/source, mob/user) - var/datum/action/polychromic/P = actions_by_atom[source] + var/datum/action/item_action/polychromic/P = actions_by_atom[source] P?.Remove(user) /datum/element/polychromic/proc/activate_action(datum/action/source, atom/target) @@ -197,9 +197,14 @@ helmet_by_suit -= S colors_by_atom -= source -/datum/action/polychromic +/datum/action/item_action/polychromic name = "Modify Polychromic Colors" background_icon_state = "bg_polychromic" - use_target_appearance = TRUE button_icon_state = null - target_appearance_matrix = list(0.8,0,0,0,0.8,0) + check_flags = NONE + +/datum/action/item_action/polychromic/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) + var/matrix/save_matrix = target.transform + target.transform = matrix(0.8, 0, 0, 0, 0.8, 0) + . = ..() + target.transform = save_matrix diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index bd8a57c85077..8e04f591f232 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -29,6 +29,7 @@ GLOBAL_LIST_EMPTY(PDAs) item_flags = NOBLUDGEON w_class = WEIGHT_CLASS_TINY slot_flags = ITEM_SLOT_ID | ITEM_SLOT_BELT + actions_types = list(/datum/action/item_action/toggle_light) armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF | ACID_PROOF diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index d6d50c9dbccf..14d1183d2539 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -41,10 +41,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/last_custom_holoform = 0 //Cooldowns for saving/loading. These are four are all separate due to loading code calling these one after another - var/saveprefcooldown - var/loadprefcooldown - var/savecharcooldown - var/loadcharcooldown + COOLDOWN_DECLARE(saveprefcooldown) + COOLDOWN_DECLARE(loadprefcooldown) + COOLDOWN_DECLARE(savecharcooldown) + COOLDOWN_DECLARE(loadcharcooldown) //game-preferences var/lastchangelog = "" //Saved changlog filesize to detect if there was a change @@ -267,6 +267,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/loadout_errors = 0 + var/pref_queue + var/char_queue + /datum/preferences/New(client/C) parent = C @@ -3212,6 +3215,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) load_character() if("changeslot") + if(char_queue != -1) + deltimer(char_queue) // Do not dare. if(!load_character(text2num(href_list["num"]))) random_character() real_name = random_unique_name(gender) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index afbaba72cd92..c01921a46a07 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -401,7 +401,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(istype(parent)) to_chat(parent, "You're attempting to load your preferences a little too fast. Wait half a second, then try again.") return FALSE - loadprefcooldown = world.time + PREF_SAVELOAD_COOLDOWN + COOLDOWN_START(src, loadprefcooldown, PREF_LOAD_COOLDOWN) if(!fexists(path)) return FALSE @@ -593,15 +593,17 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(!GLOB.keybindings_by_name[bindname]) modless_key_bindings -= key -/datum/preferences/proc/save_preferences(bypass_cooldown = FALSE) +/datum/preferences/proc/save_preferences(bypass_cooldown = FALSE, silent = FALSE) if(!path) return 0 if(!bypass_cooldown) if(world.time < saveprefcooldown) if(istype(parent)) - to_chat(parent, "You're attempting to save your preferences a little too fast. Wait half a second, then try again.") + queue_save_pref(PREF_SAVE_COOLDOWN, silent) return 0 - saveprefcooldown = world.time + PREF_SAVELOAD_COOLDOWN + COOLDOWN_START(src, saveprefcooldown, PREF_SAVE_COOLDOWN) + if(pref_queue != -1) + deltimer(pref_queue) var/savefile/S = new /savefile(path) if(!S) return 0 @@ -673,7 +675,17 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car else WRITE_FILE(S["unlockable_loadout"], safe_json_encode(list())) - return 1 + if(parent && !silent) + to_chat(parent, span_notice("Saved preferences!")) + + return TRUE + +/datum/preferences/proc/queue_save_pref(save_in, silent) + if(parent && !silent) + to_chat(parent, span_notice("Saving preferences in [save_in * 0.1] second\s.")) + if(pref_queue != -1) + deltimer(pref_queue) + pref_queue = addtimer(CALLBACK(src, PROC_REF(save_preferences), TRUE, silent), save_in) /datum/preferences/proc/load_character(slot, bypass_cooldown = FALSE) if(!path) @@ -683,7 +695,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(istype(parent)) to_chat(parent, "You're attempting to load your character a little too fast. Wait half a second, then try again.") return "SLOW THE FUCK DOWN" //the reason this isn't null is to make sure that people don't have their character slots overridden by random chars if they accidentally double-click a slot - loadcharcooldown = world.time + PREF_SAVELOAD_COOLDOWN + COOLDOWN_START(src, loadcharcooldown, PREF_LOAD_COOLDOWN) if(!fexists(path)) return FALSE var/savefile/S = new /savefile(path) @@ -1083,15 +1095,17 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car return 1 -/datum/preferences/proc/save_character(bypass_cooldown = FALSE) +/datum/preferences/proc/save_character(bypass_cooldown = FALSE, silent = FALSE) if(!path) return 0 if(!bypass_cooldown) if(world.time < savecharcooldown) if(istype(parent)) - to_chat(parent, "You're attempting to save your character a little too fast. Wait half a second, then try again.") + queue_save_char(PREF_SAVE_COOLDOWN, silent) return 0 - savecharcooldown = world.time + PREF_SAVELOAD_COOLDOWN + COOLDOWN_START(src, savecharcooldown, PREF_SAVE_COOLDOWN) + if(char_queue != -1) + deltimer(char_queue) var/savefile/S = new /savefile(path) if(!S) return 0 @@ -1278,8 +1292,17 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car cit_character_pref_save(S) + if(parent && !silent) + to_chat(parent, span_notice("Saved character slot!")) + return 1 +/datum/preferences/proc/queue_save_char(save_in, silent) + if(parent && !silent) + to_chat(parent, span_notice("Saving character in [save_in * 0.1] second\s.")) + if(char_queue != -1) + deltimer(char_queue) + char_queue = addtimer(CALLBACK(src, PROC_REF(save_character), TRUE, silent), save_in) #undef SAVEFILE_VERSION_MAX #undef SAVEFILE_VERSION_MIN diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 0d8aa60ba581..e5ad047931d4 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -315,7 +315,7 @@ /obj/item/clothing/suit/space/hardsuit/shielded/wizard/ComponentInitialize() . = ..() - AddElement(/datum/element/spellcasting, SPELL_WIZARD_HAT, ITEM_SLOT_HEAD) + AddElement(/datum/element/spellcasting, SPELL_WIZARD_ROBE, ITEM_SLOT_OCLOTHING) /obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard name = "battlemage helmet" @@ -330,7 +330,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard/ComponentInitialize() . = ..() - AddElement(/datum/element/spellcasting, SPELL_WIZARD_ROBE, ITEM_SLOT_OCLOTHING) + AddElement(/datum/element/spellcasting, SPELL_WIZARD_HAT, ITEM_SLOT_HEAD) /obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard/attack_self(mob/user) return From c7a2565255410c85860d2546b54c7b879e42d003 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Fri, 5 Jan 2024 00:28:56 -0300 Subject: [PATCH 4/9] stop this nonsense --- code/__HELPERS/angles.dm | 2 +- code/__HELPERS/files.dm | 4 +- code/__HELPERS/game.dm | 18 +++--- code/__HELPERS/heap.dm | 4 +- code/__HELPERS/icon_smoothing.dm | 6 +- code/__HELPERS/icons.dm | 8 +-- code/__HELPERS/sorts/__main.dm | 2 +- code/__HELPERS/text.dm | 14 ++--- code/__HELPERS/time.dm | 4 +- code/__HELPERS/type2type.dm | 8 +-- code/__HELPERS/unsorted.dm | 62 +++++++++---------- code/_onclick/adjacent.dm | 16 ++--- code/_onclick/hud/alert.dm | 8 +-- code/_onclick/hud/human.dm | 2 +- code/_onclick/hud/robot.dm | 4 +- code/_onclick/hud/screen_objects.dm | 6 +- code/_onclick/item_attack.dm | 2 +- code/_onclick/other_mobs.dm | 4 +- code/_rendering/atom_huds/data_huds.dm | 8 +-- code/controllers/hooks.dm | 4 +- code/controllers/master.dm | 4 +- code/controllers/subsystem/activity.dm | 2 +- code/controllers/subsystem/job.dm | 18 +++--- code/controllers/subsystem/pathfinder.dm | 2 +- code/controllers/subsystem/radio.dm | 2 +- code/controllers/subsystem/research.dm | 2 +- code/controllers/subsystem/shuttle.dm | 10 +-- code/controllers/subsystem/ticker.dm | 4 +- code/controllers/subsystem/vote.dm | 18 +++--- code/datums/achievements/_awards.dm | 2 +- code/datums/action.dm | 20 +++--- code/datums/components/material_container.dm | 4 +- code/datums/components/mood.dm | 4 +- code/datums/components/spawner.dm | 4 +- code/datums/components/storage/storage.dm | 2 +- code/datums/components/summoning.dm | 6 +- code/datums/diseases/advance/advance.dm | 10 +-- .../diseases/advance/symptoms/choking.dm | 10 +-- .../datums/diseases/advance/symptoms/fever.dm | 2 +- code/datums/diseases/advance/symptoms/fire.dm | 8 +-- .../diseases/advance/symptoms/flesh_eating.dm | 4 +- code/datums/diseases/advance/symptoms/heal.dm | 18 +++--- .../diseases/advance/symptoms/shivering.dm | 2 +- code/datums/dna.dm | 8 +-- code/datums/explosion.dm | 2 +- code/datums/martial/boxing.dm | 6 +- code/datums/mutations/_mutations.dm | 4 +- code/datums/recipe.dm | 6 +- code/datums/status_effects/status_effect.dm | 2 +- code/datums/weather/weather.dm | 2 +- code/game/area/areas.dm | 8 +-- code/game/area/areas/holodeck.dm | 10 +-- code/game/atoms.dm | 6 +- code/game/atoms_movement.dm | 4 +- code/game/communications.dm | 2 +- .../game/gamemodes/bloodsucker/bloodsucker.dm | 4 +- code/game/gamemodes/changeling/changeling.dm | 4 +- .../game/gamemodes/changeling/traitor_chan.dm | 8 +-- code/game/gamemodes/clock_cult/clock_cult.dm | 6 +- code/game/gamemodes/cult/cult.dm | 4 +- .../devil/devil agent/devil_agent.dm | 4 +- code/game/gamemodes/devil/devil_game_mode.dm | 6 +- code/game/gamemodes/dynamic/dynamic.dm | 2 +- .../gamemodes/dynamic/dynamic_rulesets.dm | 2 +- code/game/gamemodes/extended/extended.dm | 2 +- code/game/gamemodes/game_mode.dm | 50 +++++++-------- code/game/gamemodes/objective.dm | 4 +- code/game/gamemodes/objective_items.dm | 10 +-- code/game/gamemodes/objective_sabotage.dm | 2 +- code/game/gamemodes/overthrow/objective.dm | 2 +- code/game/gamemodes/sandbox/sandbox.dm | 2 +- code/game/machinery/_machinery.dm | 4 +- code/game/machinery/camera/camera.dm | 4 +- .../machinery/computer/camera_advanced.dm | 2 +- code/game/machinery/computer/card.dm | 10 +-- code/game/machinery/computer/law.dm | 12 ++-- code/game/machinery/computer/medical.dm | 4 +- code/game/machinery/computer/security.dm | 6 +- code/game/machinery/doors/airlock_types.dm | 30 ++++----- code/game/machinery/doors/brigdoors.dm | 10 +-- .../machinery/doors/checkForMultipleDoors.dm | 12 ++-- code/game/machinery/doors/door.dm | 18 +++--- code/game/machinery/doors/firedoor.dm | 2 +- code/game/machinery/doors/passworddoor.dm | 2 +- code/game/machinery/doors/poddoor.dm | 2 +- code/game/machinery/doors/windowdoor.dm | 18 +++--- .../embedded_controller/access_controller.dm | 2 +- .../embedded_controller/airlock_controller.dm | 2 +- .../embedded_controller_base.dm | 6 +- .../simple_vent_controller.dm | 2 +- code/game/machinery/flasher.dm | 4 +- code/game/machinery/igniter.dm | 4 +- code/game/machinery/pipe/pipe_dispenser.dm | 8 +-- .../machinery/porta_turret/portable_turret.dm | 14 ++--- code/game/machinery/recharger.dm | 10 +-- code/game/machinery/rechargestation.dm | 2 +- code/game/machinery/suit_storage_unit.dm | 2 +- code/game/objects/buckling.dm | 4 +- code/game/objects/effects/alien_acid.dm | 4 +- .../effects/effect_system/effects_foam.dm | 6 +- .../effects/effect_system/effects_smoke.dm | 28 ++++----- .../effects/effect_system/effects_water.dm | 4 +- code/game/objects/effects/effects.dm | 4 +- code/game/objects/effects/glowshroom.dm | 2 +- code/game/objects/effects/step_triggers.dm | 2 +- code/game/objects/empulse.dm | 2 +- code/game/objects/items.dm | 12 ++-- code/game/objects/items/AI_modules.dm | 8 +-- code/game/objects/items/RCD.dm | 18 +++--- code/game/objects/items/blueprints.dm | 2 +- code/game/objects/items/chrono_eraser.dm | 6 +- code/game/objects/items/crayons.dm | 2 +- code/game/objects/items/credit_holochip.dm | 2 +- code/game/objects/items/defib.dm | 2 +- code/game/objects/items/devices/camera_bug.dm | 6 +- .../objects/items/devices/dogborg_sleeper.dm | 2 +- .../objects/items/devices/lightreplacer.dm | 6 +- code/game/objects/items/devices/multitool.dm | 4 +- .../objects/items/devices/traitordevices.dm | 2 +- code/game/objects/items/dualsaber.dm | 2 +- code/game/objects/items/extinguisher.dm | 6 +- code/game/objects/items/implants/implant.dm | 6 +- .../objects/items/implants/implant_chem.dm | 2 +- .../items/implants/implant_explosive.dm | 2 +- .../items/implants/implant_mindshield.dm | 4 +- .../objects/items/implants/implantchair.dm | 4 +- code/game/objects/items/robot/robot_parts.dm | 4 +- code/game/objects/items/scrolls.dm | 2 +- code/game/objects/items/stacks/bscrystal.dm | 2 +- code/game/objects/items/stacks/stack.dm | 2 +- code/game/objects/items/stacks/wrap.dm | 8 +-- code/game/objects/items/storage/book.dm | 6 +- code/game/objects/items/storage/boxes.dm | 2 +- code/game/objects/items/summon.dm | 4 +- code/game/objects/items/tanks/tanks.dm | 8 +-- code/game/objects/items/tanks/watertank.dm | 6 +- code/game/objects/items/tools/weldingtool.dm | 4 +- code/game/objects/items/toys.dm | 6 +- code/game/objects/obj_defense.dm | 18 +++--- code/game/objects/objs.dm | 2 +- code/game/objects/structures/ai_core.dm | 4 +- .../objects/structures/beds_chairs/bed.dm | 6 +- .../structures/crates_lockers/closets.dm | 4 +- .../crates_lockers/closets/bodybag.dm | 18 +++--- .../crates_lockers/closets/cardboardbox.dm | 2 +- .../closets/secure/secure_closets.dm | 2 +- .../structures/crates_lockers/crates/large.dm | 2 +- .../crates_lockers/crates/secure.dm | 2 +- .../structures/destructible_structures.dm | 2 +- .../objects/structures/ghost_role_spawners.dm | 2 +- code/game/objects/structures/girders.dm | 4 +- code/game/objects/structures/janicart.dm | 4 +- code/game/objects/structures/morgue.dm | 4 +- .../objects/structures/petrified_statue.dm | 12 ++-- code/game/objects/structures/plasticflaps.dm | 12 ++-- code/game/objects/structures/reflector.dm | 2 +- code/game/objects/structures/spirit_board.dm | 10 +-- code/game/objects/structures/tables_racks.dm | 8 +-- .../structures/transit_tubes/station.dm | 6 +- .../structures/transit_tubes/transit_tube.dm | 10 +-- .../transit_tubes/transit_tube_pod.dm | 2 +- code/game/objects/structures/watercloset.dm | 4 +- .../objects/structures/windoor_assembly.dm | 2 +- code/game/objects/structures/window.dm | 16 ++--- code/game/say.dm | 4 +- code/game/turfs/closed.dm | 2 +- code/game/turfs/open.dm | 2 +- code/game/turfs/simulated/floor.dm | 8 +-- .../game/turfs/simulated/floor/fancy_floor.dm | 2 +- .../turfs/simulated/floor/mineral_floor.dm | 2 +- .../turfs/simulated/floor/plasteel_floor.dm | 2 +- code/game/turfs/simulated/wall/reinf_walls.dm | 46 +++++++------- code/game/turfs/space/space.dm | 8 +-- code/game/turfs/turf.dm | 2 +- code/modules/admin/DB_ban/functions.dm | 2 +- code/modules/admin/NewBan.dm | 24 +++---- code/modules/admin/create_poll.dm | 4 +- code/modules/admin/holder2.dm | 26 ++++---- code/modules/admin/topic.dm | 8 +-- code/modules/admin/verbs/debug.dm | 4 +- code/modules/admin/verbs/mapping.dm | 4 +- code/modules/admin/verbs/one_click_antag.dm | 30 ++++----- code/modules/admin/verbs/randomverbs.dm | 6 +- .../antagonists/_common/antag_datum.dm | 2 +- .../antagonists/_common/antag_spawner.dm | 2 +- .../antagonists/blob/blob/blob_report.dm | 2 +- .../antagonists/blob/blob/blobs/blob_mobs.dm | 2 +- .../blob/blob/blobstrains/_blobstrain.dm | 2 +- .../blob/blob/blobstrains/_reagent.dm | 2 +- .../blob/blob/blobstrains/blazing_oil.dm | 2 +- .../blob/blob/blobstrains/energized_jelly.dm | 2 +- .../blob/blobstrains/explosive_lattice.dm | 2 +- .../blob/blob/blobstrains/multiplex.dm | 2 +- .../blob/blob/blobstrains/reactive_spines.dm | 2 +- .../modules/antagonists/blob/blob/overmind.dm | 6 +- code/modules/antagonists/blob/blob/powers.dm | 20 +++--- code/modules/antagonists/blob/blob/theblob.dm | 8 +-- .../bloodsucker/items/bloodsucker_organs.dm | 2 +- .../bloodsucker/objects/bloodsucker_coffin.dm | 2 +- .../antagonists/changeling/changeling.dm | 6 +- .../changeling/changeling_power.dm | 4 +- .../antagonists/changeling/powers/hivemind.dm | 2 +- .../changeling/powers/humanform.dm | 2 +- .../changeling/powers/mutations.dm | 6 +- .../changeling/powers/tiny_prick.dm | 12 ++-- .../clockcult/clock_effects/clock_sigils.dm | 2 +- .../clock_helpers/clock_powerdrain.dm | 10 +-- .../clock_weapons/ratvarian_shield.dm | 2 +- .../clockcult/clock_items/clockwork_armor.dm | 8 +-- .../clockcult/clock_items/judicial_visor.dm | 16 ++--- .../clock_items/replica_fabricator.dm | 2 +- .../antagonists/clockcult/clock_mobs.dm | 2 +- .../clock_mobs/clockwork_guardian.dm | 2 +- .../antagonists/clockcult/clock_structure.dm | 2 +- .../clockcult/clock_structures/mania_motor.dm | 2 +- .../clock_structures/ocular_warden.dm | 4 +- .../clock_structures/prolonging_prism.dm | 10 +-- .../clockcult/clock_structures/wall_gear.dm | 6 +- code/modules/antagonists/cult/cult.dm | 2 +- code/modules/antagonists/cult/cult_comms.dm | 2 +- code/modules/antagonists/cult/runes.dm | 4 +- code/modules/antagonists/devil/devil.dm | 24 +++---- .../antagonists/devil/devil_helpers.dm | 2 +- .../devil/sintouched/sintouched.dm | 4 +- .../devil/true_devil/_true_devil.dm | 10 +-- .../antagonists/devil/true_devil/inventory.dm | 4 +- code/modules/antagonists/revenant/revenant.dm | 6 +- .../antagonists/slaughter/slaughter.dm | 2 +- code/modules/antagonists/swarmer/swarmer.dm | 12 ++-- .../antagonists/swarmer/swarmer_event.dm | 8 +-- .../antagonists/wizard/equipment/spellbook.dm | 42 ++++++------- code/modules/assembly/assembly.dm | 2 +- code/modules/assembly/health.dm | 2 +- .../atmospherics/gasmixtures/gas_mixture.dm | 4 +- .../gasmixtures/zextools_broke.dm | 12 ++-- .../atmospherics/machinery/airalarm.dm | 18 +++--- .../components/unary_devices/cryo.dm | 4 +- .../components/unary_devices/thermomachine.dm | 2 +- .../components/unary_devices/vent_scrubber.dm | 2 +- .../atmospherics/machinery/datum_pipeline.dm | 2 +- .../atmospherics/machinery/other/meter.dm | 6 +- .../atmospherics/machinery/pipes/pipes.dm | 4 +- .../portable/portable_atmospherics.dm | 2 +- .../awaymissions/mission_code/Cabin.dm | 2 +- .../awaymissions/mission_code/wildwest.dm | 2 +- code/modules/buildmode/buildmode.dm | 2 +- code/modules/buildmode/buttons.dm | 12 ++-- code/modules/cargo/exports.dm | 2 +- code/modules/cargo/exports/materials.dm | 6 +- code/modules/cargo/exports/seeds.dm | 6 +- code/modules/cargo/exports/sheets.dm | 2 +- code/modules/client/client_procs.dm | 24 +++---- code/modules/client/preferences.dm | 6 +- code/modules/client/preferences_savefile.dm | 16 ++--- code/modules/clothing/chameleon.dm | 6 +- code/modules/clothing/clothing.dm | 6 +- code/modules/clothing/glasses/_glasses.dm | 2 +- code/modules/clothing/head/misc.dm | 2 +- code/modules/clothing/masks/miscellaneous.dm | 4 +- code/modules/clothing/spacesuits/hardsuit.dm | 4 +- .../modules/clothing/suits/reactive_armour.dm | 2 +- code/modules/clothing/suits/toggles.dm | 4 +- code/modules/clothing/under/_under.dm | 14 ++--- code/modules/clothing/under/miscellaneous.dm | 2 +- code/modules/events/holiday/xmas.dm | 2 +- code/modules/events/immovable_rod.dm | 2 +- code/modules/events/pirates.dm | 4 +- code/modules/events/portal_storm.dm | 6 +- code/modules/events/spacevine.dm | 2 +- code/modules/events/wizard/greentext.dm | 2 +- code/modules/food_and_drinks/drinks/drinks.dm | 8 +-- .../modules/food_and_drinks/food/condiment.dm | 6 +- code/modules/food_and_drinks/food/snacks.dm | 36 +++++------ .../kitchen_machinery/icecream_vat.dm | 2 +- .../kitchen_machinery/processor.dm | 4 +- code/modules/holiday/holidays.dm | 8 +-- code/modules/holodeck/area_copy.dm | 2 +- code/modules/hydroponics/beekeeping/beebox.dm | 10 +-- code/modules/hydroponics/grown.dm | 4 +- code/modules/hydroponics/grown/cereals.dm | 2 +- code/modules/hydroponics/growninedible.dm | 4 +- code/modules/hydroponics/hydroponics.dm | 6 +- code/modules/hydroponics/seed_extractor.dm | 4 +- .../integrated_electronics/core/assemblies.dm | 2 +- .../integrated_electronics/subtypes/input.dm | 6 +- .../subtypes/weaponized.dm | 4 +- code/modules/jobs/job_exp.dm | 16 ++--- code/modules/jobs/job_types/_job.dm | 10 +-- code/modules/library/lib_machines.dm | 2 +- code/modules/lighting/lighting_object.dm | 2 +- code/modules/lighting/lighting_turf.dm | 2 +- code/modules/mining/fulton.dm | 6 +- code/modules/mining/lavaland/ash_flora.dm | 4 +- .../modules/mob/dead/new_player/new_player.dm | 6 +- code/modules/mob/dead/new_player/poll.dm | 22 +++---- code/modules/mob/dead/observer/observer.dm | 22 +++---- code/modules/mob/inventory.dm | 6 +- code/modules/mob/living/bloodcrawl.dm | 10 +-- code/modules/mob/living/brain/brain.dm | 2 +- code/modules/mob/living/carbon/alien/alien.dm | 4 +- .../mob/living/carbon/alien/alien_defense.dm | 2 +- .../mob/living/carbon/alien/damage_procs.dm | 2 +- .../carbon/alien/humanoid/alien_powers.dm | 32 +++++----- .../carbon/alien/humanoid/caste/drone.dm | 10 +-- .../carbon/alien/humanoid/caste/praetorian.dm | 8 +-- .../carbon/alien/humanoid/humanoid_defense.dm | 2 +- .../mob/living/carbon/alien/humanoid/queen.dm | 10 +-- .../carbon/alien/larva/larva_defense.dm | 2 +- .../mob/living/carbon/alien/larva/powers.dm | 6 +- code/modules/mob/living/carbon/alien/life.dm | 2 +- .../living/carbon/alien/special/facehugger.dm | 6 +- code/modules/mob/living/carbon/carbon.dm | 6 +- .../mob/living/carbon/carbon_movement.dm | 10 +-- .../mob/living/carbon/carbon_update_icons.dm | 2 +- .../modules/mob/living/carbon/damage_procs.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 8 +-- .../mob/living/carbon/human/human_defense.dm | 18 +++--- .../mob/living/carbon/human/human_helpers.dm | 4 +- .../mob/living/carbon/human/human_movement.dm | 8 +-- .../innate_abilities/limb_regeneration.dm | 4 +- .../mob/living/carbon/human/inventory.dm | 4 +- code/modules/mob/living/carbon/human/life.dm | 4 +- code/modules/mob/living/carbon/human/say.dm | 2 +- .../mob/living/carbon/human/species.dm | 24 +++---- .../carbon/human/species_types/arachnid.dm | 2 +- .../carbon/human/species_types/flypeople.dm | 2 +- .../carbon/human/species_types/golems.dm | 8 +-- .../carbon/human/species_types/jellypeople.dm | 4 +- .../carbon/human/species_types/plasmamen.dm | 2 +- .../human/species_types/shadowpeople.dm | 2 +- code/modules/mob/living/carbon/life.dm | 18 +++--- .../mob/living/carbon/monkey/combat.dm | 6 +- code/modules/mob/living/carbon/monkey/life.dm | 2 +- .../mob/living/carbon/monkey/monkey.dm | 4 +- .../living/carbon/monkey/monkey_defense.dm | 4 +- code/modules/mob/living/carbon/say.dm | 4 +- code/modules/mob/living/damage_procs.dm | 16 ++--- code/modules/mob/living/life.dm | 2 +- code/modules/mob/living/living.dm | 24 +++---- code/modules/mob/living/living_defense.dm | 26 ++++---- code/modules/mob/living/living_movement.dm | 2 +- code/modules/mob/living/say.dm | 26 ++++---- code/modules/mob/living/silicon/ai/ai.dm | 4 +- .../mob/living/silicon/ai/ai_defense.dm | 4 +- .../living/silicon/ai/freelook/cameranet.dm | 4 +- .../mob/living/silicon/ai/freelook/eye.dm | 2 +- code/modules/mob/living/silicon/ai/say.dm | 4 +- .../mob/living/silicon/damage_procs.dm | 4 +- code/modules/mob/living/silicon/pai/pai.dm | 2 +- .../mob/living/silicon/pai/personality.dm | 12 ++-- .../mob/living/silicon/pai/software.dm | 4 +- .../mob/living/silicon/robot/inventory.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 8 +-- .../mob/living/silicon/robot/robot_modules.dm | 4 +- .../living/silicon/robot/robot_movement.dm | 2 +- code/modules/mob/living/silicon/say.dm | 6 +- code/modules/mob/living/silicon/silicon.dm | 6 +- .../mob/living/silicon/silicon_defense.dm | 2 +- .../living/simple_animal/animal_defense.dm | 2 +- .../mob/living/simple_animal/bot/ed209bot.dm | 4 +- .../mob/living/simple_animal/bot/floorbot.dm | 4 +- .../mob/living/simple_animal/constructs.dm | 12 ++-- .../mob/living/simple_animal/friendly/dog.dm | 2 +- .../simple_animal/friendly/drone/_drone.dm | 6 +- .../friendly/drone/extra_drone_types.dm | 2 +- .../friendly/drone/interaction.dm | 2 +- .../simple_animal/friendly/drone/inventory.dm | 14 ++--- .../simple_animal/friendly/farm_animals.dm | 4 +- .../living/simple_animal/gremlin/gremlin.dm | 2 +- .../simple_animal/guardian/types/dextrous.dm | 8 +-- .../simple_animal/guardian/types/protector.dm | 2 +- .../simple_animal/hostile/giant_spider.dm | 12 ++-- .../living/simple_animal/hostile/hostile.dm | 24 +++---- .../simple_animal/hostile/mecha_pilot.dm | 6 +- .../hostile/megafauna/bubblegum.dm | 2 +- .../simple_animal/hostile/megafauna/drake.dm | 4 +- .../mob/living/simple_animal/hostile/mimic.dm | 10 +-- .../hostile/retaliate/retaliate.dm | 2 +- .../living/simple_animal/hostile/sharks.dm | 2 +- .../living/simple_animal/hostile/statue.dm | 8 +-- .../mob/living/simple_animal/parrot.dm | 22 +++---- .../mob/living/simple_animal/simple_animal.dm | 2 +- .../mob/living/simple_animal/slime/life.dm | 10 +-- .../mob/living/simple_animal/slime/powers.dm | 12 ++-- .../mob/living/simple_animal/slime/slime.dm | 8 +-- code/modules/mob/living/status_procs.dm | 16 ++--- code/modules/mob/mob.dm | 12 ++-- code/modules/mob/mob_helpers.dm | 14 ++--- code/modules/mob/say.dm | 2 +- code/modules/mob/say_readme.dm | 4 +- code/modules/mob/transform_procs.dm | 26 ++++---- .../computers/item/computer.dm | 2 +- .../computers/item/computer_power.dm | 2 +- .../computers/item/computer_ui.dm | 2 +- .../modular_computers/file_system/program.dm | 8 +-- .../file_system/programs/alarm.dm | 2 +- .../file_system/programs/configurator.dm | 2 +- .../modular_computers/hardware/_hardware.dm | 4 +- .../hardware/network_card.dm | 12 ++-- .../modular_computers/hardware/recharger.dm | 2 +- code/modules/movespeed/_movespeed_modifier.dm | 2 +- code/modules/newscaster/newspaper.dm | 8 +-- code/modules/paperwork/contract.dm | 18 +++--- code/modules/power/antimatter/control.dm | 12 ++-- code/modules/power/antimatter/shielding.dm | 10 +-- code/modules/power/apc.dm | 6 +- code/modules/power/cable.dm | 14 ++--- code/modules/power/cell.dm | 12 ++-- code/modules/power/power.dm | 20 +++--- code/modules/power/powernet.dm | 2 +- .../power/singularity/field_generator.dm | 32 +++++----- .../particle_accelerator.dm | 4 +- .../particle_accelerator/particle_emitter.dm | 8 +-- code/modules/power/singularity/singularity.dm | 44 ++++++------- code/modules/power/solar.dm | 2 +- code/modules/power/supermatter/supermatter.dm | 2 +- code/modules/power/tesla/coil.dm | 2 +- .../procedural_mapping/mapGenerator.dm | 6 +- .../procedural_mapping/mapGeneratorModule.dm | 4 +- .../mapGeneratorModules/helpers.dm | 4 +- .../mapGenerators/cellular.dm | 4 +- .../modules/projectiles/ammunition/_firing.dm | 6 +- .../boxes_magazines/_box_magazine.dm | 10 +-- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/guns/ballistic.dm | 10 +-- .../projectiles/guns/ballistic/automatic.dm | 2 +- .../projectiles/guns/ballistic/magweapon.dm | 6 +- .../projectiles/guns/ballistic/shotgun.dm | 8 +-- .../guns/energy/kinetic_accelerator.dm | 2 +- code/modules/projectiles/guns/magic.dm | 4 +- .../projectiles/guns/misc/beam_rifle.dm | 2 +- .../projectiles/guns/misc/blastcannon.dm | 6 +- code/modules/projectiles/guns/misc/medbeam.dm | 10 +-- .../projectiles/guns/misc/syringe_gun.dm | 6 +- code/modules/reagents/chem_splash.dm | 2 +- code/modules/reagents/chemistry/holder.dm | 26 ++++---- .../chemistry/machinery/chem_master.dm | 2 +- code/modules/reagents/chemistry/reagents.dm | 4 +- .../chemistry/reagents/toxin_reagents.dm | 2 +- code/modules/reagents/reagent_containers.dm | 6 +- .../reagents/reagent_containers/borghypo.dm | 2 +- .../reagents/reagent_containers/patch.dm | 4 +- .../reagents/reagent_containers/syringes.dm | 2 +- code/modules/reagents/reagent_dispenser.dm | 2 +- code/modules/recycling/disposal/pipe.dm | 2 +- .../modules/research/machinery/_production.dm | 6 +- .../xenobiology/crossbreeding/_weapons.dm | 4 +- .../research/xenobiology/xenobiology.dm | 4 +- .../lavalandruin_code/elephantgraveyard.dm | 14 ++--- .../modules/ruins/lavalandruin_code/puzzle.dm | 8 +-- .../ruins/objects_and_mobs/necropolis_gate.dm | 8 +-- code/modules/shuttle/shuttle.dm | 4 +- code/modules/spells/spell.dm | 6 +- code/modules/spells/spell_types/lightning.dm | 2 +- code/modules/surgery/amputation.dm | 2 +- code/modules/surgery/bodyparts/helpers.dm | 4 +- code/modules/surgery/cavity_implant.dm | 8 +-- code/modules/surgery/core_removal.dm | 10 +-- code/modules/surgery/dental_implant.dm | 8 +-- code/modules/surgery/helpers.dm | 32 +++++----- code/modules/surgery/implant_removal.dm | 2 +- code/modules/surgery/lipoplasty.dm | 8 +-- code/modules/surgery/organ_manipulation.dm | 2 +- code/modules/surgery/organic_steps.dm | 4 +- code/modules/surgery/organs/augments_chest.dm | 14 ++--- code/modules/surgery/organs/heart.dm | 4 +- code/modules/surgery/organs/organ_internal.dm | 2 +- code/modules/surgery/organs/vocal_cords.dm | 10 +-- .../modules/surgery/prosthetic_replacement.dm | 10 +-- .../modules/surgery/remove_embedded_object.dm | 2 +- code/modules/surgery/surgery.dm | 2 +- code/modules/unit_tests/vore_tests.dm | 6 +- code/modules/vehicles/mecha/combat/neovgre.dm | 4 +- .../mecha/equipment/tools/medical_tools.dm | 18 +++--- .../mecha/equipment/tools/other_tools.dm | 2 +- .../mecha/equipment/tools/work_tools.dm | 10 +-- .../mecha/equipment/weapons/weapons.dm | 12 ++-- .../modules/vehicles/mecha/mech_fabricator.dm | 4 +- .../vehicles/mecha/mech_melee_attack.dm | 4 +- code/modules/vehicles/mecha/mecha_defense.dm | 8 +-- code/modules/vehicles/mecha/working/ripley.dm | 2 +- code/modules/vehicles/scooter.dm | 4 +- code/modules/vore/hook-defs.dm | 2 +- code/modules/vore/trycatch.dm | 2 +- .../eventmaps/Spookystation/JTGSZwork.dm | 2 +- modular_citadel/code/modules/festive/turfs.dm | 48 +++++++------- .../modules/projectiles/guns/pumpenergy.dm | 2 +- 487 files changed, 1662 insertions(+), 1662 deletions(-) diff --git a/code/__HELPERS/angles.dm b/code/__HELPERS/angles.dm index a3fc2404bd67..08351357888b 100644 --- a/code/__HELPERS/angles.dm +++ b/code/__HELPERS/angles.dm @@ -16,7 +16,7 @@ /proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. if(!start || !end) - return 0 + return FALSE var/dy var/dx dy=(32*end.y+end.pixel_y)-(32*start.y+start.pixel_y) diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm index aad5b4cab198..a97d1280ea6b 100644 --- a/code/__HELPERS/files.dm +++ b/code/__HELPERS/files.dm @@ -45,12 +45,12 @@ var/time_to_wait = GLOB.fileaccess_timer - world.time if(time_to_wait > 0) to_chat(src, "Error: file_spam_check(): Spam. Please wait [DisplayTimeText(time_to_wait)].") - return 1 + return TRUE var/delay = FTPDELAY if(holder) delay *= ADMIN_FTPDELAY_MODIFIER GLOB.fileaccess_timer = world.time + delay - return 0 + return FALSE #undef FTPDELAY #undef ADMIN_FTPDELAY_MODIFIER diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 0182f2b6f846..0540d57f7334 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -97,8 +97,8 @@ if(C == must_be_alone) continue if(our_area == get_area(C)) - return 0 - return 1 + return FALSE + return TRUE //We used to use linear regression to approximate the answer, but Mloc realized this was actually faster. //And lo and behold, it is, and it's more accurate to boot. @@ -310,14 +310,14 @@ var/turf/T if(X1==X2) if(Y1==Y2) - return 1 //Light cannot be blocked on same tile + return TRUE //Light cannot be blocked on same tile else var/s = SIGN(Y2-Y1) Y1+=s while(Y1!=Y2) T=locate(X1,Y1,Z) if(T.opacity) - return 0 + return FALSE Y1+=s else var/m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1)) @@ -333,8 +333,8 @@ X1+=signX //Line exits tile horizontally T=locate(X1,Y1,Z) if(T.opacity) - return 0 - return 1 + return FALSE + return TRUE #undef SIGNV @@ -343,13 +343,13 @@ var/turf/Bturf = get_turf(B) if(!Aturf || !Bturf) - return 0 + return FALSE if(inLineOfSight(Aturf.x,Aturf.y, Bturf.x,Bturf.y,Aturf.z)) - return 1 + return TRUE else - return 0 + return FALSE /proc/get_cardinal_step_away(atom/start, atom/finish) //returns the position of a step from start away from finish, in one of the cardinal directions diff --git a/code/__HELPERS/heap.dm b/code/__HELPERS/heap.dm index eabcb0e0dc7a..b8b24c2360df 100644 --- a/code/__HELPERS/heap.dm +++ b/code/__HELPERS/heap.dm @@ -29,7 +29,7 @@ //(i.e the max or the min dependant on the comparison function) /datum/heap/proc/pop() if(!length(L)) - return 0 + return FALSE . = L[1] L[1] = L[length(L)] @@ -60,7 +60,7 @@ //or 0 if there's no child /datum/heap/proc/get_greater_child(index) if(index * 2 > length(L)) - return 0 + return FALSE if(index * 2 + 1 > length(L)) return index * 2 diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 801a2cd4319f..0e4010aff036 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -56,7 +56,7 @@ /proc/calculate_adjacencies(atom/A) if(!A.loc) - return 0 + return FALSE var/adjacencies = 0 @@ -64,7 +64,7 @@ if(ismovable(A)) AM = A if(AM.can_be_unanchored && !AM.anchored) - return 0 + return FALSE for(var/direction in GLOB.cardinals) AM = find_type_in_direction(A, direction) @@ -374,7 +374,7 @@ if(N_SOUTH|N_EAST|N_SOUTHEAST) return SOUTHEAST else - return 0 + return FALSE //SSicon_smooth /proc/queue_smooth_neighbors(atom/A) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 2ccd9deaf248..4924b1c0e02e 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -1027,15 +1027,15 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) //Returns the same icon specifed in the argument, but with the pixel drawn /proc/DrawPixel(icon/I,colour,drawX,drawY) if(!I) - return 0 + return FALSE var/Iwidth = I.Width() var/Iheight = I.Height() if(drawX > Iwidth || drawX <= 0) - return 0 + return FALSE if(drawY > Iheight || drawY <= 0) - return 0 + return FALSE I.DrawBox(colour,drawX, drawY) return I @@ -1048,7 +1048,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) if(J) //Only set the icon if it succeeded, the icon without the pixel is 1000x better than a black square. icon = J return J - return 0 + return FALSE //For creating consistent icons for human looking simple animals /proc/get_flat_human_icon(icon_id, datum/job/J, datum/preferences/prefs, dummy_key, showDirs = GLOB.cardinals, outfit_override = null, no_anim = FALSE) diff --git a/code/__HELPERS/sorts/__main.dm b/code/__HELPERS/sorts/__main.dm index 493f7b209661..2fb771506977 100644 --- a/code/__HELPERS/sorts/__main.dm +++ b/code/__HELPERS/sorts/__main.dm @@ -138,7 +138,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new()) var/runHi = lo + 1 if(runHi >= hi) - return 1 + return TRUE var/last = fetchElement(L,lo) var/current = fetchElement(L,runHi++) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 77e39ccf0ff8..204eb8e60bf8 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -228,15 +228,15 @@ /proc/text_in_list(haystack, list/needle_list, start=1, end=0) for(var/needle in needle_list) if(findtext(haystack, needle, start, end)) - return 1 - return 0 + return TRUE + return FALSE //Like above, but case sensitive /proc/text_in_list_case(haystack, list/needle_list, start=1, end=0) for(var/needle in needle_list) if(findtextEx(haystack, needle, start, end)) - return 1 - return 0 + return TRUE + return FALSE //Adds 'char' ahead of 'text' until there are 'count' characters total /proc/add_leading(text, count, char = " ") @@ -301,7 +301,7 @@ else if(b == replace) //if B is the replacement char newtext = copytext(newtext, 1, newtext_it) + a + copytext(newtext, newtext_it + length(newtext[newtext_it])) else //The lists disagree, Uh-oh! - return 0 + return FALSE text_it += length(a) comp_it += length(b) newtext_it += length(newtext[newtext_it]) @@ -311,7 +311,7 @@ //This proc returns the number of chars of the string that is the character //This is used for detective work to determine fingerprint completion. if(!text || !character) - return 0 + return FALSE var/count = 0 var/lentext = length(text) var/a = "" @@ -403,7 +403,7 @@ GLOBAL_LIST_INIT(binary, list("0","1")) . = findtextEx(haystack, char, start, end) if(.) return - return 0 + return FALSE /proc/parsemarkdown_basic_step1(t, limited=FALSE) if(length(t) <= 0) diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 519a54b38d95..0af855cbf6de 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -14,7 +14,7 @@ var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day if(month == MM && day == DD) - return 1 + return TRUE //returns timestamp in a sql and a not-quite-compliant ISO 8601 friendly format /proc/SQLtime(timevar) @@ -41,7 +41,7 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) if(28 to INFINITY) return 5 else - return 1 + return TRUE //Takes a value of time in deciseconds. //Returns a text value of that number in hours, minutes, or seconds. diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 3939fb94ccfe..89eb7b75c34f 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -158,7 +158,7 @@ /proc/dir2angle(D) switch(D) if(NORTH) - return 0 + return FALSE if(SOUTH) return 180 if(EAST) @@ -301,7 +301,7 @@ /proc/unix2date(timestamp, seperator = "-") if(timestamp < 0) - return 0 //Do not accept negative values + return FALSE //Do not accept negative values var/year = 1970 //Unix Epoc begins 1970-01-01 var/dayInSeconds = 86400 //60secs*60mins*24hours @@ -363,7 +363,7 @@ var/list/covered_parts = list() if(!bpc) - return 0 + return FALSE if(bpc & FULL_BODY) covered_parts |= list(BODY_ZONE_L_ARM,BODY_ZONE_R_ARM,BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_L_LEG,BODY_ZONE_R_LEG) @@ -557,7 +557,7 @@ //assumes format #RRGGBB #rrggbb /proc/color_hex2num(A) if(!A || length(A) != length_char(A)) - return 0 + return FALSE var/R = hex2num(copytext(A, 2, 4)) var/G = hex2num(copytext(A, 4, 6)) var/B = hex2num(copytext(A, 6, 0)) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index e84085b86b0b..8fda6b1b0f4a 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -394,7 +394,7 @@ Turf and target are separate in case you want to teleport some distance from a t /proc/get_edge_target_turf(atom/A, direction) var/turf/target = locate(A.x, A.y, A.z) if(!A || !target) - return 0 + return FALSE //since NORTHEAST == NORTH|EAST, etc, doing it this way allows for diagonal mass drivers in the future //and isn't really any more complicated @@ -512,35 +512,35 @@ Turf and target are separate in case you want to teleport some distance from a t current = get_step_towards(current, target_turf) while(current != target_turf) if(steps > length) - return 0 + return FALSE if(current.opacity) - return 0 + return FALSE for(var/thing in current) var/atom/A = thing if(A.opacity) - return 0 + return FALSE current = get_step_towards(current, target_turf) steps++ - return 1 + return TRUE /proc/is_blocked_turf(turf/T, exclude_mobs) if(T.density) - return 1 + return TRUE for(var/i in T) var/atom/A = i if(A.density && (!exclude_mobs || !ismob(A))) - return 1 - return 0 + return TRUE + return FALSE /proc/is_anchored_dense_turf(turf/T) //like the older version of the above, fails only if also anchored if(T.density) - return 1 + return TRUE for(var/i in T) var/atom/movable/A = i if(A.density && A.anchored) - return 1 - return 0 + return TRUE + return FALSE /proc/get_step_towards2(atom/ref , atom/trg) var/base_dir = get_dir(ref, get_step_towards(ref,trg)) @@ -577,9 +577,9 @@ Turf and target are separate in case you want to teleport some distance from a t //Returns: 1 if found, 0 if not. /proc/hasvar(datum/A, varname) if(A.vars.Find(lowertext(varname))) - return 1 + return TRUE else - return 0 + return FALSE /proc/get_cardinal_dir(atom/A, atom/B) var/dx = abs(B.x - A.x) @@ -700,7 +700,7 @@ Turf and target are separate in case you want to teleport some distance from a t //of course mathematically this is just adding world.icon_size on again /proc/getPixelDistance(atom/A, atom/B, centered = TRUE) if(!istype(A)||!istype(B)) - return 0 + return FALSE . = bounds_dist(A, B) + sqrt((((A.pixel_x+B.pixel_x)**2) + ((A.pixel_y+B.pixel_y)**2))) if(centered) . += world.icon_size @@ -741,28 +741,28 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( //Direction works sometimes if(is_type_in_typecache(O, GLOB.WALLITEMS_INVERSE)) if(O.dir == turn(dir, 180)) - return 1 + return TRUE else if(O.dir == dir) - return 1 + return TRUE //Some stuff doesn't use dir properly, so we need to check pixel instead //That's exactly what get_turf_pixel() does if(get_turf_pixel(O) == locdir) - return 1 + return TRUE if(is_type_in_typecache(O, GLOB.WALLITEMS_EXTERNAL) && check_external) if(is_type_in_typecache(O, GLOB.WALLITEMS_INVERSE)) if(O.dir == turn(dir, 180)) - return 1 + return TRUE else if(O.dir == dir) - return 1 + return TRUE //Some stuff is placed directly on the wallturf (signs) for(var/obj/O in locdir) if(is_type_in_typecache(O, GLOB.WALLITEMS) && check_external != 2) if(O.pixel_x == 0 && O.pixel_y == 0) - return 1 - return 0 + return TRUE + return FALSE /proc/check_target_facings(mob/living/initator, mob/living/target) /*This can be used to add additional effects on interactions between mobs depending on how the mobs are facing each other, such as adding a crit damage to blows to the back of a guy's head. @@ -835,25 +835,25 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( /proc/IsValidSrc(datum/D) if(istype(D)) return !QDELETED(D) - return 0 + return FALSE //Compare A's dir, the clockwise dir of A and the anticlockwise dir of A //To the opposite dir of the dir returned by get_dir(B,A) //If one of them is a match, then A is facing B /proc/is_A_facing_B(atom/A,atom/B) if(!istype(A) || !istype(B)) - return 0 + return FALSE if(isliving(A)) var/mob/living/LA = A if(LA.lying) - return 0 + return FALSE var/goal_dir = get_dir(A,B) var/clockwise_A_dir = turn(A.dir, -45) var/anticlockwise_A_dir = turn(A.dir, 45) if(A.dir == goal_dir || clockwise_A_dir == goal_dir || anticlockwise_A_dir == goal_dir) - return 1 - return 0 + return TRUE + return FALSE /* @@ -1046,10 +1046,10 @@ B --><-- A /atom/proc/contains(var/atom/A) if(!A) - return 0 + return FALSE for(var/atom/location = A.loc, location, location = location.loc) if(location == src) - return 1 + return TRUE /proc/flick_overlay_static(O, atom/A, duration) set waitfor = 0 @@ -1149,7 +1149,7 @@ GLOBAL_REAL_VAR(list/stack_trace_storage) /proc/stoplag(initial_delay) if (!Master || !(Master.current_runlevel & RUNLEVELS_DEFAULT)) sleep(world.tick_lag) - return 1 + return TRUE if (!initial_delay) initial_delay = world.tick_lag . = 0 @@ -1568,11 +1568,11 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) /proc/num2sign(numeric) if(numeric > 0) - return 1 + return TRUE else if(numeric < 0) return -1 else - return 0 + return FALSE // Converts browser keycodes to BYOND keycodes. /proc/browser_keycode_to_byond(keycode) diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index e629a6eb57b7..06499b3a642b 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -11,7 +11,7 @@ to check that the mob is not inside of something */ /atom/proc/Adjacent(atom/neighbor) // basic inheritance, unused - return 0 + return FALSE // Not a sane use of the function and (for now) indicative of an error elsewhere /area/Adjacent(var/atom/neighbor) @@ -57,9 +57,9 @@ if(!src.ClickCross(get_dir(src,T1), border_only = 1, target_atom = target, mover = mover)) continue // could not enter src - return 1 // we don't care about our own density + return TRUE // we don't care about our own density - return 0 + return FALSE /* Adjacency (to anything else): @@ -78,11 +78,11 @@ // This is necessary for storage items not on your person. /obj/item/Adjacent(var/atom/neighbor, var/recurse = 1) if(neighbor == loc) - return 1 + return TRUE if(isitem(loc)) if(recurse > 0) return loc.Adjacent(neighbor,recurse - 1) - return 0 + return FALSE return ..() /* @@ -99,7 +99,7 @@ if( O.flags_1&ON_BORDER_1) // windows are on border, check them first if( O.dir & target_dir || O.dir & (O.dir-1) ) // full tile windows are just diagonals mechanically - return 0 //O.dir&(O.dir-1) is false for any cardinal direction, but true for diagonal ones + return FALSE //O.dir&(O.dir-1) is false for any cardinal direction, but true for diagonal ones else if( !border_only ) // dense, not on border, cannot pass over - return 0 - return 1 + return FALSE + return TRUE diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 5029d51452db..592a647e5d8f 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -75,9 +75,9 @@ /mob/proc/clear_alert(category, clear_override = FALSE) var/atom/movable/screen/alert/alert = alerts[category] if(!alert) - return 0 + return FALSE if(alert.override_alerts && !clear_override) - return 0 + return FALSE alerts -= category if(client && hud_used) @@ -784,7 +784,7 @@ so as to remain in compliance with the most up-to-date laws." if(!hud_shown) for(var/i = 1, i <= alerts.len, i++) screenmob.client.screen -= alerts[alerts[i]] - return 1 + return TRUE for(var/i = 1, i <= alerts.len, i++) var/atom/movable/screen/alert/alert = alerts[alerts[i]] if(alert.icon_state == "template") @@ -807,7 +807,7 @@ so as to remain in compliance with the most up-to-date laws." if(!viewmob) for(var/M in mymob.observers) reorganize_alerts(M) - return 1 + return TRUE /atom/movable/screen/alert/Click(location, control, params) if(!usr || !usr.client) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 96260f75a293..6d7c25120a29 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -29,7 +29,7 @@ /atom/movable/screen/human/equip/Click() if(ismecha(usr.loc)) // stops inventory actions in a mech - return 1 + return TRUE var/mob/living/carbon/human/H = usr H.quick_equip() diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index e20bae87d781..175d6e2a536b 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -7,7 +7,7 @@ /atom/movable/screen/robot/Click() if(isobserver(usr)) - return 1 + return TRUE /atom/movable/screen/robot/module/Click() if(..()) @@ -15,7 +15,7 @@ var/mob/living/silicon/robot/R = usr if(R.module.type != /obj/item/robot_module) R.hud_used.toggle_show_robot_modules() - return 1 + return TRUE R.pick_module() /atom/movable/screen/robot/module1 diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 33c0bb0f04a0..231f8db6f044 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -62,12 +62,12 @@ // At this point in client Click() code we have passed the 1/10 sec check and little else // We don't even know if it's a middle click if(usr.incapacitated()) - return 1 + return TRUE if(ismob(usr)) var/mob/M = usr M.swap_hand() - return 1 + return TRUE // /atom/movable/screen/skills // name = "skills" @@ -455,7 +455,7 @@ var/icon_y = text2num(LAZYACCESS(modifiers, "icon-y")) var/choice = get_zone_at(icon_x, icon_y) if (!choice) - return 1 + return TRUE return set_selected_zone(choice, usr) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 23486cac29a8..488a50193c0e 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -236,7 +236,7 @@ attack_message_local = "You [message_verb] yourself[message_hit_area] with [I]" visible_message("[attack_message]",\ "[attack_message_local]", null, COMBAT_MESSAGE_RANGE) - return 1 + return TRUE /// How much stamina this takes to swing this is not for realism purposes hecc off. /obj/item/proc/getweight(mob/living/user, multiplier = 1, trait = SKILL_STAMINA_COST) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 073f50d8c536..fc9a4207ae97 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -18,7 +18,7 @@ . = attackchain_flags // Special glove functions: - // If the gloves do anything, have them return 1 to stop + // If the gloves do anything, have them return TRUE to stop // normal attack_hand() here. var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines if(proximity && istype(G)) @@ -99,7 +99,7 @@ */ /mob/living/carbon/RestrainedClickOn(atom/A) - return 0 + return FALSE /mob/living/carbon/human/RangedAttack(atom/A, mouseparams) . = ..() diff --git a/code/_rendering/atom_huds/data_huds.dm b/code/_rendering/atom_huds/data_huds.dm index 291923ee4ea9..f120a0b82431 100644 --- a/code/_rendering/atom_huds/data_huds.dm +++ b/code/_rendering/atom_huds/data_huds.dm @@ -24,13 +24,13 @@ /datum/atom_hud/data/human/medical/basic/proc/check_sensors(mob/living/carbon/human/H) if(!istype(H)) - return 0 + return FALSE var/obj/item/clothing/under/U = H.w_uniform if(!istype(U)) - return 0 + return FALSE if(U.sensor_mode <= SENSOR_VITALS) - return 0 - return 1 + return FALSE + return TRUE /datum/atom_hud/data/human/medical/basic/add_to_single_hud(mob/M, mob/living/carbon/H) if(check_sensors(H)) diff --git a/code/controllers/hooks.dm b/code/controllers/hooks.dm index fe6a49c8544a..9eb6631c3b70 100644 --- a/code/controllers/hooks.dm +++ b/code/controllers/hooks.dm @@ -11,9 +11,9 @@ * @code /hook/foo/proc/bar() if(1) - return 1 //Sucessful + return TRUE //Sucessful else - return 0 //Error, or runtime. + return FALSE //Error, or runtime. * @endcode * All hooks must return nonzero on success, as runtimes will force return null. */ diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 055271fd8672..1ec8e1d2bb99 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -129,7 +129,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new /proc/Recreate_MC() . = -1 //so if we runtime, things know we failed if (world.time < Master.restart_timeout) - return 0 + return FALSE if (world.time < Master.restart_clear) Master.restart_count *= 0.5 @@ -142,7 +142,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new new/datum/controller/master() catch return -1 - return 1 + return TRUE /datum/controller/master/Recover() diff --git a/code/controllers/subsystem/activity.dm b/code/controllers/subsystem/activity.dm index d10e67f21001..91f31fc2e865 100644 --- a/code/controllers/subsystem/activity.dm +++ b/code/controllers/subsystem/activity.dm @@ -48,7 +48,7 @@ SUBSYSTEM_DEF(activity) /datum/controller/subsystem/activity/proc/get_average_threat() if(!length(threat_history)) - return 0 + return FALSE var/total_weight = 0 var/total_amt = 0 for(var/i in 1 to threat_history.len-1) diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 4daff9157502..9ff65d83c07f 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -47,7 +47,7 @@ SUBSYSTEM_DEF(job) var/list/all_jobs = subtypesof(/datum/job) if(!all_jobs.len) to_chat(world, "Error setting up jobs, no job datums found") - return 0 + return FALSE for(var/J in all_jobs) var/datum/job/job = new J() @@ -65,7 +65,7 @@ SUBSYSTEM_DEF(job) name_occupations[job.title] = job type_occupations[J] = job - return 1 + return TRUE /datum/controller/subsystem/job/proc/GetJob(rank) @@ -199,8 +199,8 @@ SUBSYSTEM_DEF(job) continue var/mob/dead/new_player/candidate = pick(candidates) if(AssignRole(candidate, command_position)) - return 1 - return 0 + return TRUE + return FALSE //This proc is called at the start of the level loop of DivideOccupations() and will cause head jobs to be checked before any other jobs of the same level @@ -222,7 +222,7 @@ SUBSYSTEM_DEF(job) var/ai_selected = 0 var/datum/job/job = GetJob("AI") if(!job) - return 0 + return FALSE for(var/i = job.total_positions, i > 0, i--) for(var/level in level_order) var/list/candidates = list() @@ -233,8 +233,8 @@ SUBSYSTEM_DEF(job) ai_selected++ break if(ai_selected) - return 1 - return 0 + return TRUE + return FALSE /** Proc DivideOccupations @@ -599,8 +599,8 @@ SUBSYSTEM_DEF(job) if(hpc || epc) var/relevent_cap = max(hpc, epc) if((initial_players_to_assign - unassigned.len) >= relevent_cap) - return 1 - return 0 + return TRUE + return FALSE /datum/controller/subsystem/job/proc/RejectPlayer(mob/dead/new_player/player) if(player.mind && player.mind.special_role) diff --git a/code/controllers/subsystem/pathfinder.dm b/code/controllers/subsystem/pathfinder.dm index ccbea7930663..cee625b3f1c0 100644 --- a/code/controllers/subsystem/pathfinder.dm +++ b/code/controllers/subsystem/pathfinder.dm @@ -36,7 +36,7 @@ SUBSYSTEM_DEF(pathfinder) flow[t] = M return free else - return 0 + return FALSE /datum/flowcache/proc/toolong(l) log_game("Pathfinder route took longer than 150 ticks, src bot [flow[flow[l]]]") diff --git a/code/controllers/subsystem/radio.dm b/code/controllers/subsystem/radio.dm index 8299709392d3..22f7b4920716 100644 --- a/code/controllers/subsystem/radio.dm +++ b/code/controllers/subsystem/radio.dm @@ -25,7 +25,7 @@ SUBSYSTEM_DEF(radio) if(frequency) frequency.remove_listener(device) // let's don't delete frequencies in case a non-listener keeps a reference - return 1 + return TRUE /datum/controller/subsystem/radio/proc/return_frequency(new_frequency as num) var/f_text = num2text(new_frequency) diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index be722ed4f135..fb863690ceb8 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -358,7 +358,7 @@ SUBSYSTEM_DEF(research) /datum/controller/subsystem/research/proc/calculate_server_coefficient() //Diminishing returns. var/amt = servers.len if(!amt) - return 0 + return FALSE var/coeff = 100 coeff = sqrt(coeff / amt) return coeff diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 20d3ffd971bb..7b004c7ce653 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -294,7 +294,7 @@ SUBSYSTEM_DEF(shuttle) log_shuttle("[key_name(user)] has recalled the shuttle.") message_admins("[ADMIN_LOOKUPFLW(user)] has recalled the shuttle.") deadchat_broadcast(" has recalled the shuttle from [span_name("[get_area_name(user, TRUE)]")].", span_name("[user.real_name]"), user, message_type=DEADCHAT_ANNOUNCEMENT) - return 1 + return TRUE /datum/controller/subsystem/shuttle/proc/canRecall() if(!emergency || emergency.mode != SHUTTLE_CALL || emergencyNoRecall || SSticker.mode.name == "meteor") @@ -400,7 +400,7 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/toggleShuttle(shuttleId, dockHome, dockAway, timed) var/obj/docking_port/mobile/M = getShuttle(shuttleId) if(!M) - return 1 + return TRUE var/obj/docking_port/stationary/dockedAt = M.get_docked() var/destination = dockHome if(dockedAt && dockedAt.id == dockHome) @@ -411,7 +411,7 @@ SUBSYSTEM_DEF(shuttle) else if(M.initiate_docking(getDock(destination)) != DOCKING_SUCCESS) return 2 - return 0 //dock successful + return FALSE //dock successful /datum/controller/subsystem/shuttle/proc/moveShuttle(shuttleId, dockId, timed) @@ -419,14 +419,14 @@ SUBSYSTEM_DEF(shuttle) var/obj/docking_port/stationary/D = getDock(dockId) if(!M) - return 1 + return TRUE if(timed) if(M.request(D)) return 2 else if(M.initiate_docking(D) != DOCKING_SUCCESS) return 2 - return 0 //dock successful + return FALSE //dock successful /datum/controller/subsystem/shuttle/proc/request_transit_dock(obj/docking_port/mobile/M) if(!istype(M)) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 6f856f3edb6f..0818f41a69a6 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -245,7 +245,7 @@ SUBSYSTEM_DEF(ticker) mode = null SSjob.ResetOccupations() emergency_swap++ - return 0 + return FALSE CHECK_TICK //Configure mode and assign player to special mode stuff @@ -264,7 +264,7 @@ SUBSYSTEM_DEF(ticker) to_chat(world, "Error setting up [GLOB.master_mode]. Reverting to pre-game lobby.") SSjob.ResetOccupations() emergency_swap++ - return 0 + return FALSE else message_admins("DEBUG: Bypassing prestart checks...") diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 407a8f927cb9..d860cca1b214 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -373,7 +373,7 @@ SUBSYSTEM_DEF(vote) /datum/controller/subsystem/vote/proc/submit_vote(vote, score = 0) if(mode) if(CONFIG_GET(flag/no_dead_vote) && usr.stat == DEAD && !usr.client.holder) - return 0 + return FALSE if(vote && ISINRANGE(vote, 1, choices.len)) switch(vote_system) if(PLURALITY_VOTING) @@ -415,7 +415,7 @@ SUBSYSTEM_DEF(vote) voted[usr.ckey] = list() voted[usr.ckey][choices[vote]] = score saved -= usr.ckey - return 0 + return FALSE /datum/controller/subsystem/vote/proc/initiate_vote(vote_type, initiator_key, display = display_votes, votesystem = PLURALITY_VOTING, forced = FALSE,vote_time = -1)//CIT CHANGE - adds display argument to votes to allow for obfuscated votes vote_system = votesystem @@ -424,7 +424,7 @@ SUBSYSTEM_DEF(vote) var/next_allowed_time = (started_time + CONFIG_GET(number/vote_delay)) if(mode) to_chat(usr, "There is already a vote in progress! please wait for it to finish.") - return 0 + return FALSE var/admin = FALSE var/ckey = ckey(initiator_key) @@ -433,7 +433,7 @@ SUBSYSTEM_DEF(vote) if(next_allowed_time > world.time && !admin) to_chat(usr, "A vote was initiated recently, you must wait [DisplayTimeText(next_allowed_time-world.time)] before a new vote can be started!") - return 0 + return FALSE SEND_SOUND(world, sound('sound/misc/notice2.ogg')) reset() @@ -464,7 +464,7 @@ SUBSYSTEM_DEF(vote) if("custom") question = stripped_input(usr,"What is the vote for?") if(!question) - return 0 + return FALSE var/system_string = input(usr,"Which voting type?",GLOB.vote_type_names[1]) in GLOB.vote_type_names vote_system = GLOB.vote_type_names[system_string] for(var/i=1,i<=10,i++) @@ -488,7 +488,7 @@ SUBSYSTEM_DEF(vote) toggles ^= choices[chosen] display_votes = toggles else - return 0 + return FALSE mode = vote_type initiator = initiator_key ? initiator_key : "the Server" // austation -- Crew autotransfer vote started_time = world.time @@ -521,8 +521,8 @@ SUBSYSTEM_DEF(vote) popup.set_window_options("can_close=0") popup.set_content(SSvote.interface(C)) popup.open(0) - return 1 - return 0 + return TRUE + return FALSE /datum/controller/subsystem/vote/proc/interface(client/C) if(!C) @@ -736,7 +736,7 @@ SUBSYSTEM_DEF(vote) Remove(owner) /datum/action/vote/IsAvailable(silent = FALSE) - return 1 + return TRUE /datum/action/vote/proc/remove_from_client() if(!owner) diff --git a/code/datums/achievements/_awards.dm b/code/datums/achievements/_awards.dm index 22296b90f524..ce9482963748 100644 --- a/code/datums/achievements/_awards.dm +++ b/code/datums/achievements/_awards.dm @@ -50,7 +50,7 @@ ) if(!Q.Execute(async = TRUE)) qdel(Q) - return 0 + return FALSE var/result = 0 if(Q.NextRow()) result = text2num(Q.item[1]) diff --git a/code/datums/action.dm b/code/datums/action.dm index 56697d9b3e52..f536a5d933de 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -151,7 +151,7 @@ /datum/action/ghost/Trigger() if(!..()) - return 0 + return FALSE var/mob/M = target M.ghostize(can_reenter_corpse = TRUE, voluntary = TRUE) @@ -389,7 +389,7 @@ if(istype(target, /obj/item/hierophant_club)) var/obj/item/hierophant_club/H = target if(H.teleporting) - return 0 + return FALSE return ..() /datum/action/item_action/clock @@ -399,7 +399,7 @@ /datum/action/item_action/clock/IsAvailable(silent = FALSE) if(!is_servant_of_ratvar(owner)) - return 0 + return FALSE return ..() /datum/action/item_action/clock/toggle_visor @@ -408,11 +408,11 @@ /datum/action/item_action/clock/toggle_visor/IsAvailable(silent = FALSE) if(!is_servant_of_ratvar(owner)) - return 0 + return FALSE if(istype(target, /obj/item/clothing/glasses/judicial_visor)) var/obj/item/clothing/glasses/judicial_visor/V = target if(V.recharging) - return 0 + return FALSE return ..() /datum/action/item_action/clock/hierophant @@ -486,7 +486,7 @@ /datum/action/item_action/jetpack_stabilization/IsAvailable(silent = FALSE) var/obj/item/tank/jetpack/J = target if(!istype(J) || !J.on) - return 0 + return FALSE return ..() /datum/action/item_action/hands_free @@ -518,7 +518,7 @@ else owner.research_scanner-- to_chat(owner, "[target] research scanner has been [active ? "activated" : "deactivated"].") - return 1 + return TRUE /datum/action/item_action/toggle_research_scanner/Remove(mob/M) if(owner && active) @@ -543,7 +543,7 @@ /datum/action/item_action/organ_action/IsAvailable(silent = FALSE) var/obj/item/organ/I = target if(!I.owner) - return 0 + return FALSE return ..() /datum/action/item_action/organ_action/toggle/New(Target) @@ -743,12 +743,12 @@ /datum/action/innate/Trigger() if(!..()) - return 0 + return FALSE if(!active) Activate() else Deactivate() - return 1 + return TRUE /datum/action/innate/proc/Activate() return diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index cc988544b8f0..d42c39fc1e34 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -328,9 +328,9 @@ /// For spawning mineral sheets at a specific location. Used by machines to output sheets. /datum/component/material_container/proc/retrieve_sheets(sheet_amt, var/datum/material/M, target = null) if(!M.sheet_type) - return 0 //Add greyscale sheet handling here later + return FALSE //Add greyscale sheet handling here later if(sheet_amt <= 0) - return 0 + return FALSE if(!target) target = get_turf(parent) diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 6a1d8a3d7537..4e46a2f48c2e 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -268,7 +268,7 @@ else if(the_event.timeout) addtimer(CALLBACK(src, .proc/clear_event, null, category), the_event.timeout, TIMER_UNIQUE|TIMER_OVERRIDE) - return 0 //Don't have to update the event. + return FALSE //Don't have to update the event. the_event = new type(src, param)//This causes a runtime for some reason, was this me? No - there's an event floating around missing a definition. mood_events[category] = the_event @@ -280,7 +280,7 @@ /datum/component/mood/proc/clear_event(datum/source, category) var/datum/mood_event/event = mood_events[category] if(!event) - return 0 + return FALSE mood_events -= category qdel(event) diff --git a/code/datums/components/spawner.dm b/code/datums/components/spawner.dm index 44fbf313cfe8..33fd7ba3752d 100644 --- a/code/datums/components/spawner.dm +++ b/code/datums/components/spawner.dm @@ -43,9 +43,9 @@ /datum/component/spawner/proc/try_spawn_mob() var/atom/P = parent if(spawned_mobs.len >= max_mobs) - return 0 + return FALSE if(spawn_delay > world.time) - return 0 + return FALSE spawn_delay = world.time + spawn_time var/chosen_mob_type = pick(mob_types) var/mob/living/simple_animal/L = new chosen_mob_type(P.loc) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 76c5830765fd..1aba2ac085ef 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -486,7 +486,7 @@ var/atom/A = parent A.do_squish() -//This proc return 1 if the item can be picked up and 0 if it can't. +//This proc return TRUE if the item can be picked up and 0 if it can't. //Set the stop_messages to stop it from printing messages /datum/component/storage/proc/can_be_inserted(obj/item/I, stop_messages = FALSE, mob/M) if(!istype(I) || (I.item_flags & ABSTRACT)) diff --git a/code/datums/components/summoning.dm b/code/datums/components/summoning.dm index ffb4309c1c8a..68cc8ba509c0 100644 --- a/code/datums/components/summoning.dm +++ b/code/datums/components/summoning.dm @@ -49,11 +49,11 @@ /datum/component/summoning/proc/do_spawn_mob(atom/spawn_location, summoner) if(spawned_mobs.len >= max_mobs) - return 0 + return FALSE if(last_spawned_time > world.time) - return 0 + return FALSE if(!prob(spawn_chance)) - return 0 + return FALSE last_spawned_time = world.time + spawn_delay var/chosen_mob_type = pick(mob_types) var/mob/living/simple_animal/L = new chosen_mob_type(spawn_location) diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 1ca07bf50223..8108b8b6fe04 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -135,11 +135,11 @@ /datum/disease/advance/IsSame(datum/disease/advance/D) if(!(istype(D, /datum/disease/advance))) - return 0 + return FALSE if(GetDiseaseID() != D.GetDiseaseID()) - return 0 - return 1 + return FALSE + return TRUE // Returns the advance disease with a different reference memory. /datum/disease/advance/Copy() @@ -178,8 +178,8 @@ /datum/disease/advance/proc/HasSymptom(datum/symptom/S) for(var/datum/symptom/symp in symptoms) if(symp.type == S.type) - return 1 - return 0 + return TRUE + return FALSE // Will generate new unique symptoms, use this if there are none. Returns a list of symptoms that were generated. /datum/disease/advance/proc/GenerateSymptoms(level_min, level_max, amount_get = 0) diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm index c34ab566cfac..a46e874698ad 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -64,11 +64,11 @@ Bonus /datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A) M.adjustOxyLoss(rand(6,13)) - return 1 + return TRUE /datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A) M.adjustOxyLoss(rand(10,18)) - return 1 + return TRUE /* ////////////////////////////////////// @@ -136,17 +136,17 @@ Bonus /datum/symptom/asphyxiation/proc/Asphyxiate_stage_3_4(mob/living/M, datum/disease/advance/A) var/get_damage = rand(10,15) * power M.adjustOxyLoss(get_damage) - return 1 + return TRUE /datum/symptom/asphyxiation/proc/Asphyxiate(mob/living/M, datum/disease/advance/A) var/get_damage = rand(15,21) * power M.adjustOxyLoss(get_damage) if(paralysis) M.reagents.add_reagent_list(list(/datum/reagent/toxin/pancuronium = 3, /datum/reagent/toxin/sodium_thiopental = 3)) - return 1 + return TRUE /datum/symptom/asphyxiation/proc/Asphyxiate_death(mob/living/M, datum/disease/advance/A) var/get_damage = rand(25,35) * power M.adjustOxyLoss(get_damage) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, get_damage/2) - return 1 + return TRUE diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/advance/symptoms/fever.dm index 0348e3981844..be551addbf95 100644 --- a/code/datums/diseases/advance/symptoms/fever.dm +++ b/code/datums/diseases/advance/symptoms/fever.dm @@ -58,4 +58,4 @@ Bonus M.adjust_bodytemperature(get_heat * A.stage, 0, BODYTEMP_HEAT_DAMAGE_LIMIT - 1) else M.adjust_bodytemperature(get_heat * A.stage) - return 1 + return TRUE diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm index c30da0614a44..57c6ff820305 100644 --- a/code/datums/diseases/advance/symptoms/fire.dm +++ b/code/datums/diseases/advance/symptoms/fire.dm @@ -71,14 +71,14 @@ Bonus M.adjustFireLoss(3 * power) if(infective) A.spread(2) - return 1 + return TRUE /datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A) M.adjust_fire_stacks(3 * power) M.adjustFireLoss(5 * power) if(infective) A.spread(4) - return 1 + return TRUE /* ////////////////////////////////////// @@ -157,7 +157,7 @@ Bonus M.adjustFireLoss(get_stacks/2) if(chems) M.reagents.add_reagent(/datum/reagent/clf3, 2 * power) - return 1 + return TRUE /datum/symptom/alkali/proc/Alkali_fire_stage_5(mob/living/M, datum/disease/advance/A) var/get_stacks = 8 * power @@ -165,4 +165,4 @@ Bonus M.adjustFireLoss(get_stacks) if(chems) M.reagents.add_reagent_list(list(/datum/reagent/napalm = 4 * power, /datum/reagent/clf3 = 4 * power)) - return 1 + return TRUE diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index b5b55c1e14ae..0fb97cdc41f6 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -65,7 +65,7 @@ Bonus var/mob/living/carbon/human/H = M var/obj/item/bodypart/random_part = pick(H.bodyparts) random_part.generic_bleedstacks += 5 * power - return 1 + return TRUE /* ////////////////////////////////////// @@ -133,4 +133,4 @@ Bonus M.reagents.add_reagent_list(list(/datum/reagent/toxin/heparin = 2, /datum/reagent/toxin/lipolicide = 2)) if(zombie) M.reagents.add_reagent(/datum/reagent/romerol, 1) - return 1 + return TRUE diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 0b4b3ef2dd73..8f48b9c44fb9 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -92,7 +92,7 @@ for(var/obj/item/bodypart/L in parts) if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len)) M.update_damage_overlays() - return 1 + return TRUE /datum/symptom/heal/starlight/passive_message_condition(mob/living/M) if(M.getBruteLoss() || M.getFireLoss() || M.getToxLoss()) @@ -129,7 +129,7 @@ M.adjust_nutrition(0.3) if(prob(2)) to_chat(M, "You feel a mild warmth as your blood purifies itself.") - return 1 + return TRUE @@ -167,7 +167,7 @@ C.adjust_nutrition(-lost_nutrition * HUNGER_FACTOR) //Hunger depletes at 10x the normal speed if(prob(2)) to_chat(C, "You feel an odd gurgle in your stomach, as if it was working much faster than normal.") - return 1 + return TRUE /datum/symptom/heal/darkness name = "Nocturnal Regeneration" @@ -210,7 +210,7 @@ for(var/obj/item/bodypart/L in parts) if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len * 0.5)) //more effective on brute M.update_damage_overlays() - return 1 + return TRUE /datum/symptom/heal/darkness/passive_message_condition(mob/living/M) if(M.getBruteLoss() || M.getFireLoss()) @@ -307,7 +307,7 @@ if(active_coma && M.getBruteLoss() + M.getFireLoss() == 0) uncoma(M) - return 1 + return TRUE /datum/symptom/heal/coma/passive_message_condition(mob/living/M) if((M.getBruteLoss() + M.getFireLoss()) > 30) @@ -365,7 +365,7 @@ if(L.heal_damage(heal_amt/parts.len * 0.5, heal_amt/parts.len)) M.update_damage_overlays() - return 1 + return TRUE /datum/symptom/heal/water/passive_message_condition(mob/living/M) if(M.getBruteLoss() || M.getFireLoss()) @@ -435,7 +435,7 @@ for(var/obj/item/bodypart/L in parts) if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len)) M.update_damage_overlays() - return 1 + return TRUE /datum/symptom/heal/radiation @@ -475,7 +475,7 @@ if(RAD_BURN_THRESHOLD to RAD_MOB_MUTATE) return 0.75 if(RAD_MOB_MUTATE to RAD_MOB_KNOCKDOWN) - return 1 + return TRUE else return 1.5 @@ -498,4 +498,4 @@ for(var/obj/item/bodypart/L in parts) if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len)) M.update_damage_overlays() - return 1 + return TRUE diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm index 7674d80495e2..4bce1ac65e32 100644 --- a/code/datums/diseases/advance/symptoms/shivering.dm +++ b/code/datums/diseases/advance/symptoms/shivering.dm @@ -58,4 +58,4 @@ Bonus if(unsafe) limit = 0 M.adjust_bodytemperature(-get_cold * A.stage, limit) - return 1 + return TRUE diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 7d1ddc56488b..83e2de80b9dc 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -538,7 +538,7 @@ /datum/dna/proc/check_block_string(mutation) if((LAZYLEN(mutation_index) > DNA_MUTATION_BLOCKS) || !(mutation in mutation_index)) - return 0 + return FALSE return is_gene_active(mutation) /datum/dna/proc/is_gene_active(mutation) @@ -585,7 +585,7 @@ /proc/setblock(istring, blocknumber, replacement, blocksize=DNA_BLOCK_SIZE) if(!istring || !blocknumber || !replacement || !blocksize) - return 0 + return FALSE return getleftblocks(istring, blocknumber, blocksize) + replacement + getrightblocks(istring, blocknumber, blocksize) /datum/dna/proc/mutation_in_sequence(mutation) @@ -649,7 +649,7 @@ /proc/scramble_dna(mob/living/carbon/M, ui=FALSE, se=FALSE, probability) if(!M.has_dna()) - return 0 + return FALSE if(se) for(var/i=1, i<=DNA_MUTATION_BLOCKS, i++) if(prob(probability)) @@ -660,7 +660,7 @@ if(prob(probability)) M.dna.uni_identity = setblock(M.dna.uni_identity, i, random_string(DNA_BLOCK_SIZE, GLOB.hex_characters)) M.updateappearance(mutations_overlay_update=1) - return 1 + return TRUE //value in range 1 to values. values must be greater than 0 //all arguments assumed to be positive integers diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm index dabfcea52cf7..b64862c93bc0 100644 --- a/code/datums/explosion.dm +++ b/code/datums/explosion.dm @@ -397,7 +397,7 @@ GLOBAL_LIST_EMPTY(explosions) var/choice = input("Bomb Size?") in choices switch(choice) if(null) - return 0 + return FALSE if("Small Bomb") dev = 1 heavy = 2 diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 32b916d72442..8fb2c9a14170 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -6,11 +6,11 @@ /datum/martial_art/boxing/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) to_chat(A, "Can't disarm while boxing!") - return 1 + return TRUE /datum/martial_art/boxing/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) to_chat(A, "Can't grab while boxing!") - return 1 + return TRUE /datum/martial_art/boxing/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) @@ -46,7 +46,7 @@ log_combat(A, D, "knocked out (boxing) ") else if(D.lying) D.forcesay(GLOB.hit_appends) - return 1 + return TRUE /datum/martial_art/boxing/teach(mob/living/carbon/human/H, make_temporary = TRUE) . = ..() diff --git a/code/datums/mutations/_mutations.dm b/code/datums/mutations/_mutations.dm index 33a082372e75..e3a4181d1b2c 100644 --- a/code/datums/mutations/_mutations.dm +++ b/code/datums/mutations/_mutations.dm @@ -119,8 +119,8 @@ owner.RemoveSpell(power) qdel(power) SEND_SIGNAL(owner, COMSIG_HUMAN_MUTATION_LOSS, src) - return 0 - return 1 + return FALSE + return TRUE /datum/mutation/human/proc/say_mod(message) if(message) diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm index c4d0d6f9c6a8..9a484c9e4d5e 100644 --- a/code/datums/recipe.dm +++ b/code/datums/recipe.dm @@ -48,7 +48,7 @@ if (aval_r_amnt>reagents_list[r_r]) . = -1 else - return 0 + return FALSE if ((reagents_list?(reagents_list.len):(0)) < avail_reagents.reagent_list.len) return -1 return . @@ -58,7 +58,7 @@ if (locate(/obj/) in container) return -1 else - return 1 + return TRUE . = 1 var/list/checklist = items.Copy() for (var/obj/O in container) @@ -71,7 +71,7 @@ if (!found) . = -1 if (checklist.len) - return 0 + return FALSE return . //general version diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index f3171f61970f..d55289c32da1 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -95,7 +95,7 @@ * Multiplied to clickdelays */ /datum/status_effect/proc/action_cooldown_mod() - return 1 + return TRUE //////////////// // ALERT HOOK // diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index 797b26b51d75..746299768768 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -178,7 +178,7 @@ */ /datum/weather/proc/end() if(stage == END_STAGE) - return 1 + return TRUE stage = END_STAGE STOP_PROCESSING(SSweather, src) update_areas() diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 54f1db323aff..6e40728a67e5 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -560,9 +560,9 @@ GLOBAL_LIST_EMPTY(teleportlocs) /area/proc/powered(chan) // return true if the area has power to given channel if(!requires_power) - return 1 + return TRUE if(always_unpowered) - return 0 + return FALSE switch(chan) if(EQUIP) return power_equip @@ -571,10 +571,10 @@ GLOBAL_LIST_EMPTY(teleportlocs) if(ENVIRON) return power_environ - return 0 + return FALSE /area/space/powered(chan) //Nope.avi - return 0 + return FALSE // called when power status changes diff --git a/code/game/area/areas/holodeck.dm b/code/game/area/areas/holodeck.dm index 35d6f1d202d7..ff73bf54343e 100644 --- a/code/game/area/areas/holodeck.dm +++ b/code/game/area/areas/holodeck.dm @@ -26,18 +26,18 @@ /area/holodeck/powered(var/chan) if(!requires_power) - return 1 + return TRUE if(always_unpowered) - return 0 + return FALSE if(!linked) - return 0 + return FALSE var/area/A = get_area(linked) ASSERT(!istype(A, /area/holodeck)) return A.powered(chan) /area/holodeck/usage(var/chan) if(!linked) - return 0 + return FALSE var/area/A = get_area(linked) ASSERT(!istype(A, /area/holodeck)) return A.usage(chan) @@ -51,7 +51,7 @@ /area/holodeck/use_power(var/amount, var/chan) if(!linked) - return 0 + return FALSE var/area/A = get_area(linked) ASSERT(!istype(A, /area/holodeck)) return A.use_power(amount,chan) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index c72b4f7b601e..1da8c7717acf 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -667,7 +667,7 @@ if((explosion_flags & EXPLOSION_FLAG_DENSITY_DEPENDENT) && !density) return power // no block else if((explosion_flags & EXPLOSION_FLAG_HARD_OBSTACLE) && !QDELETED(src)) - return 0 // fully blocked + return FALSE // fully blocked /** * Called when a wave explosion hits this atom. @@ -1411,7 +1411,7 @@ T = get_turf(src) if(!T) - return 0 + return FALSE var/list/forced_gravity = list() SEND_SIGNAL(src, COMSIG_ATOM_HAS_GRAVITY, T, forced_gravity) @@ -1424,7 +1424,7 @@ return max_grav if(isspaceturf(T)) // Turf never has gravity - return 0 + return FALSE var/area/A = get_area(T) if(A.has_gravity) // Areas which always has gravity diff --git a/code/game/atoms_movement.dm b/code/game/atoms_movement.dm index 7e0a1e6899e9..7cf86be7cf1d 100644 --- a/code/game/atoms_movement.dm +++ b/code/game/atoms_movement.dm @@ -291,9 +291,9 @@ * Called whenever an object moves and by mobs when they attempt to move themselves through space * And when an object or action applies a force on src, see [newtonian_move][/atom/movable/proc/newtonian_move] * - * Return 0 to have src start/keep drifting in a no-grav area and 1 to stop/not start drifting + * return FALSE to have src start/keep drifting in a no-grav area and 1 to stop/not start drifting * - * Mobs should return 1 if they should be able to move of their own volition, see [/client/proc/Move] + * Mobs should return TRUE if they should be able to move of their own volition, see [/client/proc/Move] * * Arguments: * * movement_dir - 0 when stopping or any dir when trying to move diff --git a/code/game/communications.dm b/code/game/communications.dm index 2b45fc9469c4..d3b4d69dad76 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -150,7 +150,7 @@ GLOBAL_LIST_INIT(reverseradiochannels, list( if(range) start_point = get_turf(source) if(!start_point) - return 0 + return FALSE //Send the data for(var/current_filter in filter_list) diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index aa8edeaa7212..73f24948d05c 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -199,7 +199,7 @@ // Check Overdose: Am I even addicted to blood? Do I even have any in me? //if (!target.reagents.addiction_list || !target.reagents.reagent_list) //message_admins("DEBUG2: can_make_vassal() Abort: No reagents") - // return 0 + // return FALSE // Check Overdose: Did my current volume go over the Overdose threshold? //var/am_addicted = 0 //for (var/datum/reagent/blood/vampblood/blood in target.reagents.addiction_list) // overdosed is tracked in reagent_list, not addiction_list. @@ -210,7 +210,7 @@ //if (!am_addicted) //message_admins("DEBUG4: can_make_vassal() Abort: No Blood") - // return 0 + // return FALSE // No Mind! if(!target.mind || !target.mind.key) if(display_warning) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 77c953567cd6..05979867e23f 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -51,10 +51,10 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th changelings += changeling changeling.special_role = ROLE_CHANGELING changeling.restricted_roles = restricted_jobs - return 1 + return TRUE else setup_error = "Not enough changeling candidates" - return 0 + return FALSE /datum/game_mode/changeling/post_setup() for(var/datum/mind/changeling in changelings) diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index 691111031da4..a21d6c676d52 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -20,11 +20,11 @@ /datum/game_mode/traitor/changeling/can_start() if(!..()) - return 0 + return FALSE possible_changelings = get_players_for_role(ROLE_CHANGELING) if(possible_changelings.len < required_enemies) - return 0 - return 1 + return FALSE + return TRUE /datum/game_mode/traitor/changeling/pre_setup() if(CONFIG_GET(flag/protect_roles_from_antagonist)) @@ -55,7 +55,7 @@ changeling.restricted_roles = restricted_jobs return ..() else - return 0 + return FALSE /datum/game_mode/traitor/changeling/post_setup() for(var/datum/mind/changeling in changelings) diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 77371ad7bce0..d852ce9850f5 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -188,16 +188,16 @@ Credit where due: equip_servant(L) add_servant_of_ratvar(L, TRUE) ..() - return 1 + return TRUE /datum/game_mode/proc/greet_servant(mob/M) //Description of their role if(!M) - return 0 + return FALSE to_chat(M, "You are a servant of Ratvar, the Clockwork Justiciar!") to_chat(M, "Unlock Script scripture by converting a new servant or when 35kw of power is reached.") to_chat(M, "Application scripture will be unlocked when 50kw of power is reached.") M.playsound_local(get_turf(M), 'sound/ambience/antag/clockcultalr.ogg', 100, FALSE, pressure_affected = FALSE) - return 1 + return TRUE /datum/game_mode/proc/equip_servant(mob/living/M) //Grants a clockwork slab to the mob if(!M || !ishuman(M)) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 9a49c0573993..72b3b5398918 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -154,9 +154,9 @@ if(cult_mind.current.onCentCom() || cult_mind.current.onSyndieBase()) acolytes_survived++ if(acolytes_survived>=acolytes_needed) - return 0 + return FALSE else - return 1 + return TRUE /datum/game_mode/cult/generate_report() diff --git a/code/game/gamemodes/devil/devil agent/devil_agent.dm b/code/game/gamemodes/devil/devil agent/devil_agent.dm index ccfd6f1dd53e..d491594d400c 100644 --- a/code/game/gamemodes/devil/devil agent/devil_agent.dm +++ b/code/game/gamemodes/devil/devil agent/devil_agent.dm @@ -41,8 +41,8 @@ outsellobjective.target = target_mind outsellobjective.update_explanation_text() D.objectives += outsellobjective - return 1 - return 0 + return TRUE + return FALSE /datum/game_mode/devil/devil_agents/generate_report() return "Multiple soul merchants have been spotted in the quadrant, and appear to be competing over who can purchase the most souls. Be advised that they are likely to manufacture \ diff --git a/code/game/gamemodes/devil/devil_game_mode.dm b/code/game/gamemodes/devil/devil_game_mode.dm index 7fe2f917145f..64de9f209794 100644 --- a/code/game/gamemodes/devil/devil_game_mode.dm +++ b/code/game/gamemodes/devil/devil_game_mode.dm @@ -47,15 +47,15 @@ if(devils.len < required_enemies) setup_error = "Not enough devil candidates" - return 0 - return 1 + return FALSE + return TRUE /datum/game_mode/devil/post_setup() for(var/datum/mind/devil in devils) post_setup_finalize(devil) ..() - return 1 + return TRUE /datum/game_mode/devil/generate_report() return "Infernal creatures have been seen nearby offering great boons in exchange for souls. This is considered theft against Nanotrasen, as all employment contracts contain a lien on the \ diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index c31cbbdcfc25..8d7a48385bf0 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -546,7 +546,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) return ruleset.cost + added_threat else stack_trace("The starting rule \"[ruleset.name]\" failed to pre_execute.") - return 0 + return FALSE /// Mainly here to facilitate delayed rulesets. All roundstart rulesets are executed with a timered callback to this proc. /datum/game_mode/dynamic/proc/execute_roundstart_rule(sent_rule) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/code/game/gamemodes/dynamic/dynamic_rulesets.dm index b742f6f36c0b..88c1dfc7478e 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets.dm @@ -115,7 +115,7 @@ /// Returns how much threat to actually spend in the end. /datum/dynamic_ruleset/proc/scale_up(population, max_scale) if (!scaling_cost) - return 0 + return FALSE var/antag_fraction = 0 for(var/_ruleset in (mode.executed_rules + list(src))) // we care about the antags we *will* assign, too diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm index bfc75a9dc16c..1692e9fef68d 100644 --- a/code/game/gamemodes/extended/extended.dm +++ b/code/game/gamemodes/extended/extended.dm @@ -9,7 +9,7 @@ announce_text = "Just have fun and enjoy the game!" /datum/game_mode/extended/pre_setup() - return 1 + return TRUE /datum/game_mode/extended/generate_report() return "The transmission mostly failed to mention your sector. It is possible that there is nothing in the Syndicate that could threaten your station during this shift." diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 2bc497e62a28..b0b1a1a4b14b 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -68,22 +68,22 @@ playerC++ if(!GLOB.Debug2) if(playerC < required_players || (maximum_players >= 0 && playerC > maximum_players)) - return 0 + return FALSE antag_candidates = get_players_for_role(antag_flag) if(!GLOB.Debug2) if(antag_candidates.len < required_enemies) - return 0 - return 1 + return FALSE + return TRUE else message_admins("DEBUG: GAME STARTING WITHOUT PLAYER NUMBER CHECKS, THIS WILL PROBABLY BREAK SHIT.") - return 1 + return TRUE ///Attempts to select players for special roles the mode might have. /datum/game_mode/proc/pre_setup() - return 1 + return TRUE ///Everyone should now be on the station and have their normal gear. This is the place to give the special roles extra things /datum/game_mode/proc/post_setup(report) //Gamemodes can override the intercept report. Passing TRUE as the argument will force a report. @@ -162,10 +162,10 @@ switch(SSshuttle.emergency.mode) //Rounds on the verge of ending don't get new antags, they just run out if(SHUTTLE_STRANDED, SHUTTLE_ESCAPE) - return 1 + return TRUE if(SHUTTLE_CALL) if(SSshuttle.emergency.timeLeft(1) < initial(SSshuttle.emergencyCallTime)*0.5) - return 1 + return TRUE var/matc = CONFIG_GET(number/midround_antag_time_check) if(world.time >= (matc * 600)) @@ -202,7 +202,7 @@ //somewhere between 1 and 3 minutes from now if(!CONFIG_GET(keyed_list/midround_antag)[SSticker.mode.config_tag]) round_converted = 0 - return 1 + return TRUE for(var/mob/living/carbon/human/H in antag_candidates) if(H.client) replacementmode.make_antag_chance(H) @@ -213,7 +213,7 @@ ///Called by the gameSSticker /datum/game_mode/process() - return 0 + return FALSE //For things that do not die easily /datum/game_mode/proc/are_special_antags_dead() @@ -237,44 +237,44 @@ if(Player.mind) if(Player.mind.special_role || LAZYLEN(Player.mind.antag_datums)) continuous_sanity_checked = 1 - return 0 + return FALSE if(!continuous_sanity_checked) message_admins("The roundtype ([config_tag]) has no antagonists, continuous round has been defaulted to on and midround_antag has been defaulted to off.") continuous[config_tag] = TRUE midround_antag[config_tag] = FALSE SSshuttle.clearHostileEnvironment(src) - return 0 + return FALSE if(living_antag_player && living_antag_player.mind && isliving(living_antag_player) && living_antag_player.stat != DEAD && !isnewplayer(living_antag_player) &&!isbrain(living_antag_player) && (living_antag_player.mind.special_role || LAZYLEN(living_antag_player.mind.antag_datums))) - return 0 //A resource saver: once we find someone who has to die for all antags to be dead, we can just keep checking them, cycling over everyone only when we lose our mark. + return FALSE //A resource saver: once we find someone who has to die for all antags to be dead, we can just keep checking them, cycling over everyone only when we lose our mark. for(var/mob/Player in GLOB.alive_mob_list) if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player) && Player.client) if(Player.mind.special_role || LAZYLEN(Player.mind.antag_datums)) //Someone's still antaging! living_antag_player = Player - return 0 + return FALSE if(!are_special_antags_dead()) return FALSE if(!continuous[config_tag] || force_ending) - return 1 + return TRUE else round_converted = convert_roundtype() if(!round_converted) if(round_ends_with_antag_death) - return 1 + return TRUE else midround_antag[config_tag] = 0 - return 0 + return FALSE - return 0 + return FALSE /datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere. - return 0 + return FALSE /datum/game_mode/proc/send_intercept() if(flipseclevel && !(config_tag == "extended"))//CIT CHANGE - lets the security level be flipped roundstart @@ -533,21 +533,21 @@ //If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1 /datum/game_mode/proc/age_check(client/C) if(get_remaining_days(C) == 0) - return 1 //Available in 0 days = available right now = player is old enough to play. - return 0 + return TRUE //Available in 0 days = available right now = player is old enough to play. + return FALSE /datum/game_mode/proc/get_remaining_days(client/C) if(!C) - return 0 + return FALSE if(C.prefs?.db_flags & DB_FLAG_EXEMPT) - return 0 + return FALSE if(!CONFIG_GET(flag/use_age_restriction_for_jobs)) - return 0 + return FALSE if(!isnum(C.player_age)) - return 0 //This is only a number if the db connection is established, otherwise it is text: "Requires database", meaning these restrictions cannot be enforced + return FALSE //This is only a number if the db connection is established, otherwise it is text: "Requires database", meaning these restrictions cannot be enforced if(!isnum(enemy_minimum_age)) - return 0 + return FALSE return max(0, enemy_minimum_age - C.player_age) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index bf45fe7efe90..f0dadc835055 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -639,11 +639,11 @@ GLOBAL_LIST_EMPTY(possible_items) if(istype(I, steal_target)) if(!targetinfo) //If there's no targetinfo, then that means it was a custom objective. At this point, we know you have the item, so return 1. return TRUE - else if(targetinfo.check_special_completion(I))//Returns 1 by default. Items with special checks will return 1 if the conditions are fulfilled. + else if(targetinfo.check_special_completion(I))//Returns 1 by default. Items with special checks will return TRUE if the conditions are fulfilled. return TRUE if(targetinfo && (I.type in targetinfo.altitems)) //Ok, so you don't have the item. Do you have an alternative, at least? - if(targetinfo.check_special_completion(I))//Yeah, we do! Don't return 0 if we don't though - then you could fail if you had 1 item that didn't pass and got checked first! + if(targetinfo.check_special_completion(I))//Yeah, we do! Don't return FALSE if we don't though - then you could fail if you had 1 item that didn't pass and got checked first! return TRUE return FALSE diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 78644281b84a..2a64f690380c 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -9,7 +9,7 @@ var/list/special_equipment = list() /datum/objective_item/proc/check_special_completion() //for objectives with special checks (is that slime extract unused? does that intellicard have an ai in it? etcetc) - return 1 + return TRUE /datum/objective_item/proc/TargetExists() return TRUE @@ -142,8 +142,8 @@ /datum/objective_item/steal/functionalai/check_special_completion(obj/item/aicard/C) for(var/mob/living/silicon/ai/A in C) if(isAI(A) && A.stat != DEAD) //See if any AI's are alive inside that card. - return 1 - return 0 + return TRUE + return FALSE /datum/objective_item/steal/blueprints name = "the station blueprints." @@ -169,8 +169,8 @@ /datum/objective_item/steal/slime/check_special_completion(obj/item/slime_extract/E) if(E.Uses > 0) - return 1 - return 0 + return TRUE + return FALSE //Unique Objectives /datum/objective_item/unique/docs_red diff --git a/code/game/gamemodes/objective_sabotage.dm b/code/game/gamemodes/objective_sabotage.dm index 75a4ba3a1009..74cc485d78ca 100644 --- a/code/game/gamemodes/objective_sabotage.dm +++ b/code/game/gamemodes/objective_sabotage.dm @@ -23,7 +23,7 @@ START_PROCESSING(SSprocessing, src) /datum/sabotage_objective/processing/proc/check_condition_processing() - return 1 + return TRUE /datum/sabotage_objective/processing/process() check_condition_processing() diff --git a/code/game/gamemodes/overthrow/objective.dm b/code/game/gamemodes/overthrow/objective.dm index 75b7f9f3b83e..098fcce31a5d 100644 --- a/code/game/gamemodes/overthrow/objective.dm +++ b/code/game/gamemodes/overthrow/objective.dm @@ -34,7 +34,7 @@ return get_points() ? TRUE : FALSE /datum/objective/overthrow/proc/get_points() - return 0 // int, not bool + return FALSE // int, not bool /datum/objective/overthrow/proc/result_points(datum/mind/the_dude, base_points) // App var/initial_points = base_points diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm index 9c38bd83e846..667bf3808a0f 100644 --- a/code/game/gamemodes/sandbox/sandbox.dm +++ b/code/game/gamemodes/sandbox/sandbox.dm @@ -11,7 +11,7 @@ /datum/game_mode/sandbox/pre_setup() for(var/mob/M in GLOB.player_list) M.CanBuild() - return 1 + return TRUE /datum/game_mode/sandbox/post_setup() ..() diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index e1d7737f5c5e..dcea7810813f 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -509,8 +509,8 @@ Class Procs: I.play_tool_sound(src, 50) setDir(turn(dir,-90)) to_chat(user, "You rotate [src].") - return 1 - return 0 + return TRUE + return FALSE /obj/proc/can_be_unfasten_wrench(mob/user, silent) //if we can unwrench this object; returns SUCCESSFUL_UNFASTEN and FAILED_UNFASTEN, which are both TRUE, or CANT_UNFASTEN, which isn't. if(!(isfloorturf(loc) || istype(loc, /turf/open/indestructible)) && !anchored) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 6e794b80722e..aca26ee4bc78 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -274,7 +274,7 @@ /obj/machinery/camera/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(damage_flag == MELEE && damage_amount < 12 && !(stat & BROKEN)) - return 0 + return FALSE . = ..() /obj/machinery/camera/obj_break(damage_flag) @@ -417,4 +417,4 @@ else user.sight = 0 user.see_in_dark = 2 - return 1 + return TRUE diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 30463f4f01f1..95c4a089f392 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -179,7 +179,7 @@ user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras user.sight = SEE_TURFS | SEE_BLACKNESS user.see_in_dark = 2 - return 1 + return TRUE /mob/camera/aiEye/remote/Destroy() if(origin && eye_user) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index a16e70155f13..659bbd651bdd 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -505,10 +505,10 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) var/datum/job/j = SSjob.GetJob(edit_job_target) if(!j) updateUsrDialog() - return 0 + return FALSE if(can_open_job(j) != 1) updateUsrDialog() - return 0 + return FALSE if(opened_positions[edit_job_target] >= 0) GLOB.time_last_changed_position = world.time / 10 j.total_positions++ @@ -522,10 +522,10 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) var/datum/job/j = SSjob.GetJob(edit_job_target) if(!j) updateUsrDialog() - return 0 + return FALSE if(can_close_job(j) != 1) updateUsrDialog() - return 0 + return FALSE //Allow instant closing without cooldown if a position has been opened before if(opened_positions[edit_job_target] <= 0) GLOB.time_last_changed_position = world.time / 10 @@ -540,7 +540,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) var/datum/job/j = SSjob.GetJob(priority_target) if(!j) updateUsrDialog() - return 0 + return FALSE var/priority = TRUE if(j in SSjob.prioritized_jobs) SSjob.prioritized_jobs -= j diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index 6fee35766a98..397446b0a747 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -27,8 +27,8 @@ /obj/machinery/computer/upload/proc/can_upload_to(mob/living/silicon/S) if(S.stat == DEAD) - return 0 - return 1 + return FALSE + return TRUE /obj/machinery/computer/upload/ai name = "\improper AI upload console" @@ -45,9 +45,9 @@ /obj/machinery/computer/upload/ai/can_upload_to(mob/living/silicon/ai/A) if(!A || !isAI(A)) - return 0 + return FALSE if(A.control_disabled) - return 0 + return FALSE return ..() @@ -66,7 +66,7 @@ /obj/machinery/computer/upload/borg/can_upload_to(mob/living/silicon/robot/B) if(!B || !iscyborg(B)) - return 0 + return FALSE if(B.scrambledcodes || B.emagged) - return 0 + return FALSE return ..() diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 7f5fafcd80c9..e2bc508e5545 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -571,8 +571,8 @@ if(user.canUseTopic(src, !hasSiliconAccessInArea(user))) if(!record1 || record1 == active1) if(!record2 || record2 == active2) - return 1 - return 0 + return TRUE + return FALSE /obj/machinery/computer/med_data/laptop name = "medical laptop" diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 45bb9bd327b5..4d1bea7b1a18 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -805,9 +805,9 @@ What a mess.*/ if(authenticated) if(user.canUseTopic(src, !hasSiliconAccessInArea(user))) if(!trim(message1)) - return 0 + return FALSE if(!record1 || record1 == active1) if(!record2 || record2 == active2) - return 1 - return 0 + return TRUE + return FALSE diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 9575c45c576c..a35e8b123204 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -255,7 +255,7 @@ qdel(src) /obj/machinery/door/airlock/plasma/BlockThermalConductivity() //we don't stop the heat~ - return 0 + return FALSE /obj/machinery/door/airlock/plasma/attackby(obj/item/C, mob/user, params) if(C.get_temperature() > 300)//If the temperature of the object is over 300, then ignite @@ -507,11 +507,11 @@ /obj/machinery/door/airlock/cult/allowed(mob/living/L) if(!density) - return 1 + return TRUE if(friendly || iscultist(L) || isshade(L) || isconstruct(L)) if(!stealthy) new openingoverlaytype(loc) - return 1 + return TRUE else if(!stealthy) new /obj/effect/temp_visual/cult/sac(loc) @@ -521,7 +521,7 @@ flash_color(L, flash_color="#960000", flash_time=20) L.DefaultCombatKnockdown(40) L.throw_at(throwtarget, 5, 1) - return 0 + return FALSE /obj/machinery/door/airlock/cult/proc/conceal() icon = 'icons/obj/doors/airlocks/station/maintenance.dmi' @@ -619,7 +619,7 @@ return (is_servant_of_ratvar(user) && !isAllPowerCut()) /obj/machinery/door/airlock/clockwork/ratvar_act() - return 0 + return FALSE /obj/machinery/door/airlock/clockwork/narsie_act() ..() @@ -635,8 +635,8 @@ /obj/machinery/door/airlock/clockwork/allowed(mob/M) if(is_servant_of_ratvar(M)) - return 1 - return 0 + return TRUE + return FALSE /obj/machinery/door/airlock/clockwork/hasPower() return TRUE //yes we do have power @@ -657,36 +657,36 @@ /obj/machinery/door/airlock/clockwork/proc/attempt_construction(obj/item/I, mob/living/user) if(!I || !user || !user.canUseTopic(src)) - return 0 + return FALSE else if(I.tool_behaviour == TOOL_WRENCH) if(construction_state == GEAR_SECURE) user.visible_message("[user] begins loosening [src]'s cogwheel...", "You begin loosening [src]'s cogwheel...") if(!I.use_tool(src, user, 75, volume=50) || construction_state != GEAR_SECURE) - return 1 + return TRUE user.visible_message("[user] loosens [src]'s cogwheel!", "[src]'s cogwheel pops off and dangles loosely.") playsound(src, 'sound/items/deconstruct.ogg', 50, 1) construction_state = GEAR_LOOSE else if(construction_state == GEAR_LOOSE) user.visible_message("[user] begins tightening [src]'s cogwheel...", "You begin tightening [src]'s cogwheel into place...") if(!I.use_tool(src, user, 75, volume=50) || construction_state != GEAR_LOOSE) - return 1 + return TRUE user.visible_message("[user] tightens [src]'s cogwheel!", "You firmly tighten [src]'s cogwheel into place.") playsound(src, 'sound/items/deconstruct.ogg', 50, 1) construction_state = GEAR_SECURE - return 1 + return TRUE else if(I.tool_behaviour == TOOL_CROWBAR) if(construction_state == GEAR_SECURE) to_chat(user, "[src]'s cogwheel is too tightly secured! Your [I.name] can't reach under it!") - return 1 + return TRUE else if(construction_state == GEAR_LOOSE) user.visible_message("[user] begins slowly lifting off [src]'s cogwheel...", "You slowly begin lifting off [src]'s cogwheel...") if(!I.use_tool(src, user, 75, volume=50) || construction_state != GEAR_LOOSE) - return 1 + return TRUE user.visible_message("[user] lifts off [src]'s cogwheel, causing it to fall apart!", \ "You lift off [src]'s cogwheel, causing it to fall apart!") deconstruct(TRUE) - return 1 - return 0 + return TRUE + return FALSE /obj/machinery/door/airlock/clockwork/brass glass = TRUE diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index c20911853733..45babec03710 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -81,7 +81,7 @@ // linked door is open/closed (by density) then opens it/closes it. /obj/machinery/door_timer/proc/timer_start() if(stat & (NOPOWER|BROKEN)) - return 0 + return FALSE activation_time = REALTIMEOFDAY timing = TRUE @@ -98,12 +98,12 @@ continue C.locked = TRUE C.update_icon() - return 1 + return TRUE /obj/machinery/door_timer/proc/timer_end(forced = FALSE) if(stat & (NOPOWER|BROKEN)) - return 0 + return FALSE if(!forced) Radio.set_frequency(FREQ_SECURITY) @@ -127,7 +127,7 @@ C.locked = FALSE C.update_icon() - return 1 + return TRUE /obj/machinery/door_timer/proc/time_left(seconds = FALSE) @@ -137,7 +137,7 @@ /obj/machinery/door_timer/proc/set_timer(value) var/new_time = clamp(value,0,MAX_TIMER) - . = new_time == timer_duration //return 1 on no change + . = new_time == timer_duration //return TRUE on no change timer_duration = new_time /obj/machinery/door_timer/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/game/machinery/doors/checkForMultipleDoors.dm b/code/game/machinery/doors/checkForMultipleDoors.dm index 73a9edde6fe5..0d985714f921 100644 --- a/code/game/machinery/doors/checkForMultipleDoors.dm +++ b/code/game/machinery/doors/checkForMultipleDoors.dm @@ -1,16 +1,16 @@ /obj/machinery/door/proc/checkForMultipleDoors() if(!src.loc) - return 0 + return FALSE for(var/obj/machinery/door/D in src.loc) if(!istype(D, /obj/machinery/door/window) && D.density && D != src) - return 0 - return 1 + return FALSE + return TRUE /turf/closed/wall/proc/checkForMultipleDoors() if(!src.loc) - return 0 + return FALSE for(var/obj/machinery/door/D in locate(src.x,src.y,src.z)) if(!istype(D, /obj/machinery/door/window) && D.density) - return 0 + return FALSE //There are no false wall checks because that would be fucking - return 1 + return TRUE diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index a3483e5702eb..248de83ef720 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -222,13 +222,13 @@ /obj/machinery/door/attackby(obj/item/I, mob/user, params) if(user.a_intent != INTENT_HARM && (I.tool_behaviour == TOOL_CROWBAR || istype(I, /obj/item/fireaxe))) try_to_crowbar(I, user) - return 1 + return TRUE else if(I.tool_behaviour == TOOL_WELDER) try_to_weld(I, user) - return 1 + return TRUE else if(!(I.item_flags & NOBLUDGEON) && user.a_intent != INTENT_HARM) try_to_activate_door(user) - return 1 + return TRUE return ..() /obj/machinery/door/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) @@ -284,7 +284,7 @@ /obj/machinery/door/proc/open() if(!density) - return 1 + return TRUE if(operating) return operating = TRUE @@ -302,7 +302,7 @@ if(autoclose) spawn(autoclose) close() - return 1 + return TRUE /obj/machinery/door/proc/close() if(density) @@ -335,7 +335,7 @@ CheckForMobs() else if(!(flags_1 & ON_BORDER_1)) crush() - return 1 + return TRUE /obj/machinery/door/proc/CheckForMobs() if(locate(/mob/living) in get_turf(src)) @@ -380,7 +380,7 @@ addtimer(CALLBACK(src, .proc/autoclose), wait, TIMER_UNIQUE | TIMER_NO_HASH_WAIT | TIMER_OVERRIDE) /obj/machinery/door/proc/requiresID() - return 1 + return TRUE /obj/machinery/door/proc/hasPower() return !(stat & NOPOWER) @@ -391,8 +391,8 @@ /obj/machinery/door/BlockThermalConductivity() // All non-glass airlocks block heat, this is intended. if(opacity || heat_proof) - return 1 - return 0 + return TRUE + return FALSE /obj/machinery/door/morgue icon = 'icons/obj/doors/doormorgue.dmi' diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index d040b98a3812..948878c9d077 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -393,7 +393,7 @@ for(var/T2 in T.atmos_adjacent_turfs) turfs[T2] = 1 if(turfs.len <= 10) - return 0 // not big enough to matter + return FALSE // not big enough to matter return start_point.air.return_pressure() < 20 ? -1 : 1 /obj/machinery/door/firedoor/border_only/CanAllowThrough(atom/movable/mover, turf/target) diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index 64afc07ae3a7..a58d84b164c5 100644 --- a/code/game/machinery/doors/passworddoor.dm +++ b/code/game/machinery/doors/passworddoor.dm @@ -73,4 +73,4 @@ return /obj/machinery/door/password/wave_ex_act(power, datum/wave_explosion/explosion, dir) - return 0 //no. + return FALSE //no. diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index ba96cb5bf6f2..b606c8e25909 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -64,7 +64,7 @@ /obj/machinery/door/poddoor/Bumped(atom/movable/AM) if(density) - return 0 + return FALSE else return ..() diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 7d9ec6a9a1dc..4ec093c8ffbc 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -129,7 +129,7 @@ if(get_dir(loc, T) == dir) return !density else - return 1 + return TRUE //used in the AStar algorithm to determinate if the turf the door is on is passable /obj/machinery/door/window/CanAStarPass(obj/item/card/id/ID, to_dir) @@ -144,13 +144,13 @@ /obj/machinery/door/window/open(forced=0) if (src.operating == 1) //doors can still open when emag-disabled - return 0 + return FALSE if(!forced) if(!hasPower()) - return 0 + return FALSE if(forced < 2) if(obj_flags & EMAGGED) - return 0 + return FALSE if(!src.operating) //in case of emag operating = TRUE do_animate("opening") @@ -171,13 +171,13 @@ /obj/machinery/door/window/close(forced=0) if (src.operating) - return 0 + return FALSE if(!forced) if(!hasPower()) - return 0 + return FALSE if(forced < 2) if(obj_flags & EMAGGED) - return 0 + return FALSE operating = TRUE do_animate("closing") playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1) @@ -423,8 +423,8 @@ /obj/machinery/door/window/clockwork/allowed(mob/M) if(is_servant_of_ratvar(M)) - return 1 - return 0 + return TRUE + return FALSE /obj/machinery/door/window/northleft dir = NORTH diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm index 3beb481e00ae..badec7ef3822 100644 --- a/code/game/machinery/embedded_controller/access_controller.dm +++ b/code/game/machinery/embedded_controller/access_controller.dm @@ -164,7 +164,7 @@ set waitfor = FALSE if(A.density) goIdle() - return 0 + return FALSE update_icon() A.unbolt() . = 1 diff --git a/code/game/machinery/embedded_controller/airlock_controller.dm b/code/game/machinery/embedded_controller/airlock_controller.dm index 125c6692f395..bb601ccac475 100644 --- a/code/game/machinery/embedded_controller/airlock_controller.dm +++ b/code/game/machinery/embedded_controller/airlock_controller.dm @@ -190,7 +190,7 @@ memory["processing"] = state != target_state //sensor_pressure = null //not sure if we can comment this out. Uncomment in case of problems -rastaf0 - return 1 + return TRUE /obj/machinery/embedded_controller/radio/airlock_controller diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 0a0a4e08f3c9..60bd454e730f 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -19,7 +19,7 @@ return null /datum/computer/file/embedded_program/process() - return 0 + return FALSE /obj/machinery/embedded_controller var/datum/computer/file/embedded_program/program @@ -44,7 +44,7 @@ /obj/machinery/embedded_controller/proc/return_text() /obj/machinery/embedded_controller/proc/post_signal(datum/signal/signal, comm_line) - return 0 + return FALSE /obj/machinery/embedded_controller/receive_signal(datum/signal/signal) if(istype(signal) && program) @@ -52,7 +52,7 @@ /obj/machinery/embedded_controller/Topic(href, href_list) if(..()) - return 0 + return FALSE if(program) program.receive_user_command(href_list["command"]) diff --git a/code/game/machinery/embedded_controller/simple_vent_controller.dm b/code/game/machinery/embedded_controller/simple_vent_controller.dm index 6416de70f1cb..76e802f787de 100644 --- a/code/game/machinery/embedded_controller/simple_vent_controller.dm +++ b/code/game/machinery/embedded_controller/simple_vent_controller.dm @@ -28,7 +28,7 @@ ))) /datum/computer/file/embedded_program/simple_vent_controller/process() - return 0 + return FALSE /obj/machinery/embedded_controller/radio/simple_vent_controller diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 9b16f4ad0c04..b67a9817aa24 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -94,7 +94,7 @@ /obj/machinery/flasher/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(damage_flag == MELEE && damage_amount < 10) //any melee attack below 10 dmg does nothing - return 0 + return FALSE . = ..() /obj/machinery/flasher/proc/flash() @@ -126,7 +126,7 @@ if(flashed) bulb.times_used++ - return 1 + return TRUE /obj/machinery/flasher/emp_act(severity) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 2f70bfcecb68..b7e5f4962018 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -38,7 +38,7 @@ var/turf/location = src.loc if (isturf(location)) location.hotspot_expose(700,10,1) - return 1 + return TRUE /obj/machinery/igniter/Initialize(mapload) . = ..() @@ -127,7 +127,7 @@ var/turf/location = src.loc if (isturf(location)) location.hotspot_expose(1000,100,1) - return 1 + return TRUE /obj/machinery/sparker/emp_act(severity) . = ..() diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index c144616c0565..fe242c4559b3 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -33,11 +33,11 @@ /obj/machinery/pipedispenser/Topic(href, href_list) if(..()) - return 1 + return TRUE var/mob/living/L = usr if(!anchored || !istype(L) || !CHECK_MOBILITY(L, MOBILITY_USE)) usr << browse(null, "window=pipedispenser") - return 1 + return TRUE usr.set_machine(src) add_fingerprint(usr) if(href_list["makepipe"]) @@ -130,7 +130,7 @@ /obj/machinery/pipedispenser/disposal/Topic(href, href_list) if(..()) - return 1 + return TRUE usr.set_machine(src) add_fingerprint(usr) if(href_list["dmake"]) @@ -181,7 +181,7 @@ /obj/machinery/pipedispenser/disposal/transit_tube/Topic(href, href_list) if(..()) - return 1 + return TRUE usr.set_machine(src) add_fingerprint(usr) if(wait < world.time) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index b94e51b813cd..5d216c1194b3 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -513,7 +513,7 @@ DEFINE_BITFIELD(turret_flags, list( var/atom/movable/M = pick(targets) targets -= M if(target(M)) - return 1 + return TRUE /obj/machinery/porta_turret/proc/popUp() //pops the turret up set waitfor = FALSE @@ -566,8 +566,8 @@ DEFINE_BITFIELD(turret_flags, list( if(turret_flags & TURRET_FLAG_AUTH_WEAPONS) //check for weapon authorization if(isnull(perp.wear_id) || istype(perp.wear_id.GetID(), /obj/item/card/id/syndicate)) - if(allowed(perp)) //if the perp has security access, return 0 - return 0 + if(allowed(perp)) //if the perp has security access, return FALSE + return FALSE if(perp.is_holding_item_of_type(/obj/item/gun) || perp.is_holding_item_of_type(/obj/item/melee/baton)) threatcount += 4 @@ -585,7 +585,7 @@ DEFINE_BITFIELD(turret_flags, list( // If we aren't shooting heads then return a threatcount of 0 if (!(turret_flags & TURRET_FLAG_SHOOT_HEADS) && (perp.get_assignment() in GLOB.command_positions)) - return 0 + return FALSE return threatcount @@ -600,7 +600,7 @@ DEFINE_BITFIELD(turret_flags, list( popUp() //pop the turret up if it's not already up. setDir(get_dir(base, target))//even if you can't shoot, follow the target INVOKE_ASYNC(src, .proc/shootAt, target) - return 1 + return TRUE return /obj/machinery/porta_turret/proc/shootAt(atom/movable/target, stagger_enabled = FALSE) @@ -840,7 +840,7 @@ DEFINE_BITFIELD(turret_flags, list( faction = list("neutral","silicon","turret") //Minebots, medibots, etc that should not be shot. /obj/machinery/porta_turret/aux_base/assess_perp(mob/living/carbon/human/perp) - return 0 //Never shoot humanoids. You are on your own if Ashwalkers or the like attack! + return FALSE //Never shoot humanoids. You are on your own if Ashwalkers or the like attack! /obj/machinery/porta_turret/aux_base/setup() return @@ -874,7 +874,7 @@ DEFINE_BITFIELD(turret_flags, list( AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) /obj/machinery/porta_turret/centcom_shuttle/assess_perp(mob/living/carbon/human/perp) - return 0 + return FALSE /obj/machinery/porta_turret/centcom_shuttle/setup() return diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index d58edbd0255d..dc506ee9b2b0 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -80,27 +80,27 @@ if(allowed) if(anchored) if(charging || panel_open) - return 1 + return TRUE //Checks to make sure he's not in space doing it, and that the area got proper power. var/area/a = get_area(src) if(!a || !a.powered(EQUIP)) to_chat(user, "[src] blinks red as you try to insert [G].") - return 1 + return TRUE if (istype(G, /obj/item/gun/energy)) var/obj/item/gun/energy/E = G if(!E.can_charge) to_chat(user, "Your gun has no external power connector.") - return 1 + return TRUE if(!user.transferItemToLoc(G, src)) - return 1 + return TRUE setCharging(G) else to_chat(user, "[src] isn't connected to anything!") - return 1 + return TRUE if(anchored && !charging) if(default_deconstruction_screwdriver(user, "recharger", "recharger", G)) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 1bd795e4f1cc..41d00f23e6d7 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -63,7 +63,7 @@ if(occupant) process_occupant() - return 1 + return TRUE /obj/machinery/recharge_station/relaymove(mob/user) if(user.stat) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index ca57e8457a2c..6ea3f3b9dd48 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -372,7 +372,7 @@ s.set_up(5, 1, src) s.start() if(electrocute_mob(user, src, src, 1, TRUE)) - return 1 + return TRUE /obj/machinery/suit_storage_unit/relaymove(mob/user) if(locked) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index aae6cbaa5c8f..e4be50e19c01 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -20,10 +20,10 @@ if(buckled_mobs.len > 1) var/unbuckled = input(user, "Who do you wish to unbuckle?","Unbuckle Who?") as null|mob in buckled_mobs if(user_unbuckle_mob(unbuckled,user)) - return 1 + return TRUE else if(user_unbuckle_mob(buckled_mobs[1],user)) - return 1 + return TRUE /atom/movable/attackby(obj/item/attacking_item, mob/user, params) if(!can_buckle || !istype(attacking_item, /obj/item/riding_offhand) || !user.Adjacent(src)) diff --git a/code/game/objects/effects/alien_acid.dm b/code/game/objects/effects/alien_acid.dm index 40d950332c25..1e49602766df 100644 --- a/code/game/objects/effects/alien_acid.dm +++ b/code/game/objects/effects/alien_acid.dm @@ -36,7 +36,7 @@ . = 1 if(!target) qdel(src) - return 0 + return FALSE if(prob(5)) playsound(loc, 'sound/items/welder.ogg', 100, 1) @@ -51,7 +51,7 @@ acid_level = max(acid_level - (5 + 2*round(sqrt(acid_level))), 0) if(acid_level <= 0) qdel(src) - return 0 + return FALSE /obj/effect/acid/Crossed(AM as mob|obj) . = ..() diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index d9cfc092203d..89e1678c6fcd 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -169,14 +169,14 @@ /obj/effect/particle_effect/foam/proc/foam_mob(mob/living/L) if(lifetime<1) - return 0 + return FALSE if(!istype(L)) - return 0 + return FALSE var/fraction = 1/initial(reagent_divisor) if(lifetime % reagent_divisor) reagents.reaction(L, VAPOR, fraction) lifetime-- - return 1 + return TRUE /obj/effect/particle_effect/foam/proc/spread_foam() var/turf/t_loc = get_turf(src) diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 9e6cde93365c..453009fdafa7 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -49,23 +49,23 @@ lifetime-- if(lifetime < 1) kill_smoke() - return 0 + return FALSE for(var/mob/living/L in range(0,src)) smoke_mob(L) - return 1 + return TRUE /obj/effect/particle_effect/smoke/proc/smoke_mob(mob/living/carbon/C) if(!istype(C)) - return 0 + return FALSE if(lifetime<1) - return 0 + return FALSE if(C.internal != null || C.has_smoke_protection()) - return 0 + return FALSE if(C.smoke_delay) - return 0 + return FALSE C.smoke_delay++ addtimer(CALLBACK(src, .proc/remove_smoke_delay, C), 10) - return 1 + return TRUE /obj/effect/particle_effect/smoke/proc/remove_smoke_delay(mob/living/carbon/C) if(C) @@ -131,7 +131,7 @@ M.drop_all_held_items() M.adjustOxyLoss(1) M.emote("cough") - return 1 + return TRUE /obj/effect/particle_effect/smoke/bad/Crossed(atom/movable/AM, oldloc) . = ..() @@ -210,7 +210,7 @@ if(..()) M.Sleeping(200) M.emote("cough") - return 1 + return TRUE /datum/effect_system/smoke_spread/sleeping effect_type = /obj/effect/particle_effect/smoke/sleeping @@ -235,20 +235,20 @@ reagents.reaction(AM, TOUCH, fraction) reagents.reaction(T, TOUCH, fraction) - return 1 + return TRUE /obj/effect/particle_effect/smoke/chem/smoke_mob(mob/living/carbon/M) if(lifetime<1) - return 0 + return FALSE if(!istype(M)) - return 0 + return FALSE var/mob/living/carbon/C = M if(C.internal != null || C.has_smoke_protection()) - return 0 + return FALSE var/fraction = 1/initial(lifetime) reagents.copy_to(C, fraction*reagents.total_volume) reagents.reaction(M, INGEST, fraction) - return 1 + return TRUE diff --git a/code/game/objects/effects/effect_system/effects_water.dm b/code/game/objects/effects/effect_system/effects_water.dm index 8fafda8b5198..7b2878e11ece 100644 --- a/code/game/objects/effects/effect_system/effects_water.dm +++ b/code/game/objects/effects/effect_system/effects_water.dm @@ -14,9 +14,9 @@ /obj/effect/particle_effect/water/Move(turf/newloc) if (--src.life < 1) qdel(src) - return 0 + return FALSE if(newloc.density) - return 0 + return FALSE .=..() /obj/effect/particle_effect/water/Bump(atom/A) diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 5d573c5a431f..ba4fce80bb89 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -22,7 +22,7 @@ return /obj/effect/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) - return 0 + return FALSE /obj/effect/experience_pressure_difference() return @@ -43,7 +43,7 @@ /obj/effect/singularity_act() qdel(src) - return 0 + return FALSE /obj/effect/ConveyorMove() return diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 22dd772ebe18..78c33ac83a1e 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -183,7 +183,7 @@ return newDir floor = 1 - return 1 + return TRUE /** * Causes the glowshroom to decay by decreasing its endurance. diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index 80178c95c425..914c70bec789 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -8,7 +8,7 @@ anchored = TRUE /obj/effect/step_trigger/proc/Trigger(atom/movable/A) - return 0 + return FALSE /obj/effect/step_trigger/Crossed(H as mob|obj) ..() diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index c467cbd4e854..c9c000d124d2 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -22,7 +22,7 @@ if(distance != 0) //please dont divide by 0 severity = min(max((max_distance / distance^0.3) * (100/max_distance), 1),100) //if it goes below 1 or above 100 stuff gets bad T.emp_act(severity) - return 1 + return TRUE /proc/empulse_using_range(turf/epicenter, range, log=0) //make an emp using range instead of power var/power_from_range = (7*(range^(1/0.7))) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index ea3531dcd020..0178a8b688d7 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -242,9 +242,9 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb /obj/item/proc/check_allowed_items(atom/target, not_inside, target_self) if(((src in target) && !target_self) || (!isturf(target.loc) && !isturf(target) && not_inside)) - return 0 + return FALSE else - return 1 + return TRUE /obj/item/blob_act(obj/structure/blob/B) if(B && B.loc == loc) @@ -576,7 +576,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb return FALSE return TRUE -//the mob M is attempting to equip this item into the slot passed through as 'slot'. Return 1 if it can do this and 0 if it can't. +//the mob M is attempting to equip this item into the slot passed through as 'slot'. return TRUE if it can do this and 0 if it can't. //if this is being done by a mob other than M, it will include the mob equipper, who is trying to equip the item to mob M. equipper will be null otherwise. //If you are making custom procs but would like to retain partial or complete functionality of this one, include a 'return ..()' to where you want this to happen. //Set disable_warning to TRUE if you wish it to not give you outputs. @@ -838,12 +838,12 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb return SEND_SIGNAL(src, COMSIG_ATOM_HITBY, AM, skipcatch, hitpush, blocked, throwingdatum) /obj/item/attack_hulk(mob/living/carbon/human/user) - return 0 + return FALSE /obj/item/attack_animal(mob/living/simple_animal/M) if (obj_flags & CAN_BE_HIT) return ..() - return 0 + return FALSE /obj/item/burn() if(!QDELETED(src)) @@ -1039,7 +1039,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb // Returns a numeric value for sorting items used as parts in machines, so they can be replaced by the rped /obj/item/proc/get_part_rating() - return 0 + return FALSE //Can this item be given to people? /obj/item/proc/can_give() diff --git a/code/game/objects/items/AI_modules.dm b/code/game/objects/items/AI_modules.dm index bd674d061561..7492f5779ff3 100644 --- a/code/game/objects/items/AI_modules.dm +++ b/code/game/objects/items/AI_modules.dm @@ -115,7 +115,7 @@ AI MODULES to_chat(law_datum.owner, "It would be in your best interest to play along with [sender.real_name] that:") for(var/failedlaw in laws) to_chat(law_datum.owner, "[failedlaw]") - return 1 + return TRUE for(var/templaw in laws) if(law_datum.owner) @@ -162,7 +162,7 @@ AI MODULES /obj/item/ai_module/supplied/safeguard/install(datum/ai_laws/law_datum, mob/user) if(!targetName) to_chat(user, "No name detected on module, please enter one.") - return 0 + return FALSE ..() /obj/item/ai_module/supplied/safeguard/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) @@ -188,7 +188,7 @@ AI MODULES /obj/item/ai_module/zeroth/oneHuman/install(datum/ai_laws/law_datum, mob/user) if(!targetName) to_chat(user, "No name detected on module, please enter one.") - return 0 + return FALSE ..() /obj/item/ai_module/zeroth/oneHuman/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) @@ -251,7 +251,7 @@ AI MODULES /obj/item/ai_module/supplied/freeform/install(datum/ai_laws/law_datum, mob/user) if(laws[1] == "") to_chat(user, "No law detected on module, please create one.") - return 0 + return FALSE ..() diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 8896170bd3cc..e4f03d4efd3b 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -106,9 +106,9 @@ RLD matter += value*amount_to_use playsound(src.loc, 'sound/machines/click.ogg', 50, 1) to_chat(user, "You insert [amount_to_use] [S.name] sheets into [src]. ") - return 1 + return TRUE to_chat(user, "You can't insert any more [S.name] sheets into [src]!") - return 0 + return FALSE /obj/item/construction/proc/activate() playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) @@ -575,12 +575,12 @@ RLD /obj/item/construction/rcd/borg/useResource(amount, mob/user) if(!iscyborg(user)) - return 0 + return FALSE var/mob/living/silicon/robot/borgy = user if(!borgy.cell) if(user) to_chat(user, no_ammo_message) - return 0 + return FALSE . = borgy.cell.use(amount * energyfactor) //borgs get 1.3x the use of their RCDs if(!. && user) to_chat(user, no_ammo_message) @@ -588,12 +588,12 @@ RLD /obj/item/construction/rcd/borg/checkResource(amount, mob/user) if(!iscyborg(user)) - return 0 + return FALSE var/mob/living/silicon/robot/borgy = user if(!borgy.cell) if(user) to_chat(user, no_ammo_message) - return 0 + return FALSE . = borgy.cell.charge >= (amount * energyfactor) if(!. && user) to_chat(user, no_ammo_message) @@ -750,7 +750,7 @@ RLD playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, decondelay, target = A)) if(!useResource(deconcost, user)) - return 0 + return FALSE activate() qdel(A) return TRUE @@ -811,9 +811,9 @@ RLD playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, 1) if(do_after(user, floordelay, target = A)) if(!istype(F)) - return 0 + return FALSE if(!useResource(floorcost, user)) - return 0 + return FALSE activate() var/destination = get_turf(A) var/obj/machinery/light/floor/FL = new /obj/machinery/light/floor(destination) diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 1a6d78b6948a..e891b2f7d5eb 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -202,7 +202,7 @@ log_game("[key_name(usr)] has renamed [prevname] to [str]") A.update_areasize() interact() - return 1 + return TRUE /obj/item/areaeditor/proc/set_area_machinery_title(area/A,title,oldtitle) diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index 8c510bb4895a..6670af9bea98 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -35,7 +35,7 @@ /obj/item/chrono_eraser/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == ITEM_SLOT_BACK) - return 1 + return TRUE /obj/item/gun/energy/chrono_gun name = "T.E.D. Projection Apparatus" @@ -108,9 +108,9 @@ var/turf/currentpos = get_turf(src) var/mob/living/user = src.loc if((currentpos == startpos) && (field in view(CHRONO_BEAM_RANGE, currentpos)) && !user.lying && (user.stat == CONSCIOUS)) - return 1 + return TRUE field_disconnect(F) - return 0 + return FALSE /obj/item/gun/energy/chrono_gun/proc/pass_mind(datum/mind/M) if(TED) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 0b733d6192b6..b4bf42b93dff 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -127,7 +127,7 @@ refill() else if(check_empty(user, amount, requires_full)) - return 0 + return FALSE else . = min(charges_left, amount) charges_left -= . diff --git a/code/game/objects/items/credit_holochip.dm b/code/game/objects/items/credit_holochip.dm index b7f7f5f2d151..d5ccd4d96090 100644 --- a/code/game/objects/items/credit_holochip.dm +++ b/code/game/objects/items/credit_holochip.dm @@ -70,7 +70,7 @@ qdel(src) return credits else - return 0 + return FALSE /obj/item/holochip/attackby(obj/item/I, mob/user, params) ..() diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 6873b59146bd..bae573fad50c 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -188,7 +188,7 @@ /obj/item/defibrillator/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == user.getBackSlot()) - return 1 + return TRUE /obj/item/defibrillator/proc/remove_paddles(mob/user) //this fox the bug with the paddles when other player stole you the defib when you have the paddles equiped if(ismob(paddles.loc)) diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index cbe795ca76af..2804582e894e 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -62,15 +62,15 @@ /obj/item/camera_bug/check_eye(mob/user) if ( loc != user || user.incapacitated() || user.eye_blind || !current ) user.unset_machine() - return 0 + return FALSE var/turf/T_user = get_turf(user.loc) var/turf/T_current = get_turf(current) if(T_user.z != T_current.z || !current.can_use()) to_chat(user, "[src] has lost the signal.") current = null user.unset_machine() - return 0 - return 1 + return FALSE + return TRUE /obj/item/camera_bug/on_unset_machine(mob/user) user.reset_perspective(null) diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm index 95245989569b..bcdff3d6acd3 100644 --- a/code/game/objects/items/devices/dogborg_sleeper.dm +++ b/code/game/objects/items/devices/dogborg_sleeper.dm @@ -59,7 +59,7 @@ return ..() /obj/item/dogborg/sleeper/Exit(atom/movable/O) - return 0 + return FALSE /obj/item/dogborg/sleeper/proc/get_host() if(!loc) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index c5e92349c705..9c206d2003f3 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -170,7 +170,7 @@ /obj/item/lightreplacer/proc/Use(mob/user) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) AddUses(-1) - return 1 + return TRUE // Negative numbers will subtract /obj/item/lightreplacer/proc/AddUses(amount = 1) @@ -239,9 +239,9 @@ /obj/item/lightreplacer/proc/CanUse(mob/living/user) src.add_fingerprint(user) if(uses > 0) - return 1 + return TRUE else - return 0 + return FALSE /obj/item/lightreplacer/afterattack(atom/T, mob/U, proximity) . = ..() diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index fbc241c5defc..a8fe41bb7ba6 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -236,11 +236,11 @@ /datum/action/item_action/toggle_multitool/Trigger() if(!..()) - return 0 + return FALSE if(target) var/obj/item/multitool/ai_detect/M = target M.toggle_hud(owner) - return 1 + return TRUE /obj/item/multitool/cyborg name = "multitool" diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index dea3bda14435..63de809b3236 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -217,7 +217,7 @@ effective or pretty fucking useless. /obj/item/shadowcloak/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == ITEM_SLOT_BELT) - return 1 + return TRUE /obj/item/shadowcloak/proc/Activate(mob/living/carbon/human/user) if(!user) diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index dc1a9fbd49c4..0f7e7d08767d 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -209,7 +209,7 @@ /obj/item/dualsaber/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) //In case thats just so happens that it is still activated on the groud, prevents hulk from picking it up if(wielded) to_chat(user, "You can't pick up such dangerous item with your meaty hands without losing fingers, better not to!") - return 1 + return TRUE /obj/item/dualsaber/process() if(wielded) diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index 372d1a17332b..57c91bfd40ab 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -119,7 +119,7 @@ if(reagents.total_volume == reagents.maximum_volume) to_chat(user, "\The [src] is already full!") safety = safety_save - return 1 + return TRUE var/obj/structure/reagent_dispensers/W = target //will it work? var/transferred = W.reagents.trans_to(src, max_water) if(transferred > 0) @@ -130,9 +130,9 @@ else to_chat(user, "\The [W] is empty!") safety = safety_save - return 1 + return TRUE else - return 0 + return FALSE /obj/item/extinguisher/afterattack(atom/target, mob/user , flag) . = ..() diff --git a/code/game/objects/items/implants/implant.dm b/code/game/objects/items/implants/implant.dm index f8e02eaf0358..0df8c35196f7 100644 --- a/code/game/objects/items/implants/implant.dm +++ b/code/game/objects/items/implants/implant.dm @@ -38,8 +38,8 @@ //What does the implant do upon injection? -//return 1 if the implant injects -//return 0 if there is no room for implant / it fails +//return TRUE if the implant injects +//return FALSE if there is no room for implant / it fails /obj/item/implant/proc/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) if(SEND_SIGNAL(src, COMSIG_IMPLANT_IMPLANTING, args) & COMPONENT_STOP_IMPLANTING) return @@ -99,7 +99,7 @@ var/mob/living/carbon/human/H = source H.sec_hud_set_implants() - return 1 + return TRUE /obj/item/implant/Destroy() if(imp_in) diff --git a/code/game/objects/items/implants/implant_chem.dm b/code/game/objects/items/implants/implant_chem.dm index 5f0b4f3fc33e..07de277a76cc 100644 --- a/code/game/objects/items/implants/implant_chem.dm +++ b/code/game/objects/items/implants/implant_chem.dm @@ -59,7 +59,7 @@ /obj/item/implant/chem/activate(cause) . = ..() if(!cause || !imp_in) - return 0 + return FALSE var/mob/living/carbon/R = imp_in var/injectamount = null if (cause == "action_button") diff --git a/code/game/objects/items/implants/implant_explosive.dm b/code/game/objects/items/implants/implant_explosive.dm index 370924063d58..7faffeef30e3 100644 --- a/code/game/objects/items/implants/implant_explosive.dm +++ b/code/game/objects/items/implants/implant_explosive.dm @@ -48,7 +48,7 @@ imp_e.weak += weak imp_e.delay += delay qdel(src) - return 1 + return TRUE return ..() diff --git a/code/game/objects/items/implants/implant_mindshield.dm b/code/game/objects/items/implants/implant_mindshield.dm index 395c0c4ce0a3..14a49c1a00f3 100644 --- a/code/game/objects/items/implants/implant_mindshield.dm +++ b/code/game/objects/items/implants/implant_mindshield.dm @@ -64,8 +64,8 @@ L.sec_hud_set_implants() if(target.stat != DEAD && !silent) to_chat(target, "Your mind suddenly feels terribly vulnerable. You are no longer safe from brainwashing.") - return 1 - return 0 + return TRUE + return FALSE /obj/item/implanter/mindshield name = "implanter (mindshield)" diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm index 8777a9f5e0e3..263aab4039fe 100644 --- a/code/game/objects/items/implants/implantchair.dm +++ b/code/game/objects/items/implants/implantchair.dm @@ -158,11 +158,11 @@ /obj/machinery/implantchair/genepurge/implant_action(mob/living/carbon/human/H,mob/user) if(!istype(H)) - return 0 + return FALSE H.set_species(/datum/species/human, 1)//lizards go home purrbation_remove(H)//remove cats H.dna.remove_all_mutations()//hulks out - return 1 + return TRUE /obj/machinery/implantchair/brainwash diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 1667e023f5c1..d473e1c7e190 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -59,8 +59,8 @@ if(src.l_leg && src.r_leg) if(src.chest && src.head) SSblackbox.record_feedback("amount", "cyborg_frames_built", 1) - return 1 - return 0 + return TRUE + return FALSE /obj/item/robot_suit/wrench_act(mob/living/user, obj/item/I) //Deconstucts empty borg shell. Flashes remain unbroken because they haven't been used yet var/turf/T = get_turf(src) diff --git a/code/game/objects/items/scrolls.dm b/code/game/objects/items/scrolls.dm index d58f670dc4e4..f1f9bd0f0bc8 100644 --- a/code/game/objects/items/scrolls.dm +++ b/code/game/objects/items/scrolls.dm @@ -33,7 +33,7 @@ if (usr.stat || usr.restrained() || src.loc != usr) return if (!ishuman(usr)) - return 1 + return TRUE var/mob/living/carbon/human/H = usr if(H.is_holding(src)) H.set_machine(src) diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 125065c83eae..bcc194154d0d 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -24,7 +24,7 @@ pixel_y = rand(-5, 5) /obj/item/stack/ore/bluespace_crystal/get_part_rating() - return 1 + return TRUE /obj/item/stack/ore/bluespace_crystal/attack_self(mob/user) user.visible_message("[user] crushes [src]!", "You crush [src]!") diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 6de1991675ad..7555763f4ec7 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -379,7 +379,7 @@ return FALSE return TRUE -/obj/item/stack/use(used, transfer = FALSE, check = TRUE) // return 0 = borked; return 1 = had enough +/obj/item/stack/use(used, transfer = FALSE, check = TRUE) // return FALSE = borked; return TRUE = had enough if(check && zero_amount()) return FALSE if (is_cyborg) diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index c969e2d1d470..9b8c0fa1307d 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -53,16 +53,16 @@ return SHAME /obj/item/proc/can_be_package_wrapped() //can the item be wrapped with package wrapper into a delivery package - return 1 + return TRUE /obj/item/storage/can_be_package_wrapped() - return 0 + return FALSE /obj/item/storage/box/can_be_package_wrapped() - return 1 + return TRUE /obj/item/smallDelivery/can_be_package_wrapped() - return 0 + return FALSE /obj/item/stack/packageWrap/afterattack(obj/target, mob/user, proximity) . = ..() diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index 3a8f5a5cc86a..99fec03c8d3e 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -25,7 +25,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", var/obj/item/storage/book/bible/B = locate() in src if(is_holding(B)) return B - return 0 + return FALSE /obj/item/storage/book/bible name = "bible" @@ -105,7 +105,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", var/obj/item/bodypart/BP = X if(BP.is_robotic_limb()) to_chat(user, "[src.deity_name] refuses to heal this metallic taint!") - return 0 + return FALSE var/heal_amt = 5 var/list/hurt_limbs = H.get_damaged_bodyparts(1, 1) @@ -119,7 +119,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", to_chat(H, "May the power of [deity_name] compel you to be healed!") playsound(src.loc, "punch", 25, 1, -1) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing) - return 1 + return TRUE /obj/item/storage/book/bible/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1, heal_mode = TRUE) diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 4465a4eb8b2d..781111f6311a 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -73,7 +73,7 @@ /obj/item/storage/box/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stack/packageWrap)) - return 0 + return FALSE return ..() //Disk boxes diff --git a/code/game/objects/items/summon.dm b/code/game/objects/items/summon.dm index ca678e2cbb6f..f9d5875603d2 100644 --- a/code/game/objects/items/summon.dm +++ b/code/game/objects/items/summon.dm @@ -431,7 +431,7 @@ src.rotation = rotation // end animations animate(atom, time = 0, flags = ANIMATION_END_NOW) - return 0 + return FALSE // grab source var/rel_x = (destination.x - relative_to.x) * world.icon_size + src.dist * sin(src.angle) @@ -458,7 +458,7 @@ /datum/summon_weapon/proc/Rotate(degrees, time, rotation) . = time if(!dist) - return 0 + return FALSE var/matrix/M = ConstructMatrix(angle + degrees, dist, rotation || src.rotation) if(rotation) src.rotation = rotation diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 7804abdc91a1..ad18d1049efb 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -247,19 +247,19 @@ air_contents.merge(giver) check_status() - return 1 + return TRUE /obj/item/tank/assume_air_moles(datum/gas_mixture/giver, moles) giver.transfer_to(air_contents, moles) check_status() - return 1 + return TRUE /obj/item/tank/assume_air_ratio(datum/gas_mixture/giver, ratio) giver.transfer_ratio_to(air_contents, ratio) check_status() - return 1 + return TRUE /obj/item/tank/proc/remove_air_volume(volume_to_return) if(!air_contents) @@ -281,7 +281,7 @@ //Handle exploding, leaking, and rupturing of the tank if(!air_contents) - return 0 + return FALSE var/pressure = air_contents.return_pressure() var/temperature = air_contents.return_temperature() diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 188a8763cd7c..db895bbcd755 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -26,7 +26,7 @@ /obj/item/watertank/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == user.getBackSlot()) - return 1 + return TRUE /obj/item/watertank/proc/toggle_mister(mob/living/user) if(!istype(user)) @@ -88,7 +88,7 @@ /obj/item/watertank/attackby(obj/item/W, mob/user, params) if(W == noz) remove_noz() - return 1 + return TRUE else return ..() @@ -349,7 +349,7 @@ /obj/item/reagent_containers/chemtank/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == ITEM_SLOT_BACK) - return 1 + return TRUE /obj/item/reagent_containers/chemtank/proc/toggle_injection() var/mob/living/carbon/human/user = usr diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 5bd7217484ff..0c8e0db98727 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -212,8 +212,8 @@ if(get_fuel() <= 0 && welding) switched_on(user) update_icon() - return 0 - return 1 + return FALSE + return TRUE //Switches the welder on /obj/item/weldingtool/proc/switched_on(mob/user) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index e6600d323e9b..dafd4afc2cec 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -160,10 +160,10 @@ if(istype(A, /obj/item/toy/ammo/gun)) if (src.bullets >= 7) to_chat(user, "It's already fully loaded!") - return 1 + return TRUE if (A.amount_left <= 0) to_chat(user, "There are no more caps!") - return 1 + return TRUE if (A.amount_left < (7 - src.bullets)) src.bullets += A.amount_left to_chat(user, text("You reload [] cap\s.", A.amount_left)) @@ -173,7 +173,7 @@ A.amount_left -= 7 - src.bullets src.bullets = 7 A.update_icon() - return 1 + return TRUE else return ..() diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index e7ab7214b70c..67739db991db 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -23,12 +23,12 @@ //returns the damage value of the attack after processing the obj's various armor protections /obj/proc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armour_penetration = 0) if(damage_flag == MELEE && damage_amount < damage_deflection) // TODO: Refactor armor datums and types entirely jfc - return 0 + return FALSE switch(damage_type) if(BRUTE) if(BURN) else - return 0 + return FALSE var/armor_protection = 0 if(damage_flag) armor_protection = armor.getRating(damage_flag) @@ -107,8 +107,8 @@ else playsound(src, 'sound/effects/bang.ogg', 50, 1) take_damage(hulk_damage(), BRUTE, MELEE, 0, get_dir(src, user)) - return 1 - return 0 + return TRUE + return FALSE /obj/blob_act(obj/structure/blob/B) if(isturf(loc)) @@ -135,7 +135,7 @@ return if(!M.melee_damage_upper && !M.obj_damage) M.emote("custom", message = "[M.friendly_verb_continuous] [src].") - return 0 + return FALSE else var/play_soundeffect = 1 if(M.environment_smash) @@ -187,7 +187,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e /obj/acid_act(acidpwr, acid_volume) if(!(resistance_flags & UNACIDABLE) && acid_volume) AddComponent(/datum/component/acid, acidpwr, acid_volume) - return 1 + return TRUE //called when the obj is destroyed by acid. /obj/proc/acid_melt() @@ -201,7 +201,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e if(acid) return acid.level else - return 0 + return FALSE //// FIRE @@ -216,7 +216,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e resistance_flags |= ON_FIRE SSfire_burning.processing[src] = src update_icon() - return 1 + return TRUE //called when the obj is destroyed by fire /obj/proc/burn() @@ -232,7 +232,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e /obj/zap_act(power, zap_flags, shocked_targets) if(QDELETED(src)) - return 0 + return FALSE obj_flags |= BEING_SHOCKED addtimer(CALLBACK(src, .proc/reset_shocked), 10) return power / 2 diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index cfe1afad5acb..10b8c04367d1 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -271,7 +271,7 @@ . = !density /obj/proc/check_uplink_validity() - return 1 + return TRUE /obj/vv_get_dropdown() . = ..() diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 30cacb78023e..9d34e5e6590c 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -414,8 +414,8 @@ That prevents a few funky behaviors. if(istype(card)) if(card.flush) to_chat(user, "ERROR: AI flush is in progress, cannot execute transfer protocol.") - return 0 - return 1 + return FALSE + return TRUE /obj/structure/ai_core/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/aicard/card) if(state != AI_READY_CORE || !..()) diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 8f5e1c507927..5ed8c8ee024c 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -87,7 +87,7 @@ R.loaded = src forceMove(R) user.visible_message("[user] collects [src].", "You collect [src].") - return 1 + return TRUE else return ..() @@ -95,9 +95,9 @@ . = ..() if(over_object == usr && Adjacent(usr)) if(!ishuman(usr) || !usr.canUseTopic(src, BE_CLOSE)) - return 0 + return FALSE if(has_buckled_mobs()) - return 0 + return FALSE usr.visible_message("[usr] collapses \the [src.name].", "You collapse \the [src.name].") var/obj/structure/bed/roller/B = new foldabletype(get_turf(src)) usr.put_in_hands(B) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index d90d44ddfdec..10cf74d44af6 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -269,7 +269,7 @@ if(user in src) return if(src.tool_interact(W,user)) - return 1 // No afterattack + return TRUE // No afterattack else return ..() @@ -396,7 +396,7 @@ close() else O.forceMove(T) - return 1 + return TRUE /obj/structure/closet/relaymove(mob/living/user, direction) if(user.stat || !isturf(loc)) diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index 09441a577e36..8cf85d7f1ed0 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -46,8 +46,8 @@ /obj/structure/closet/body_bag/close() if(..()) density = FALSE - return 1 - return 0 + return TRUE + return FALSE /obj/structure/closet/body_bag/handle_lock_addition() return @@ -59,11 +59,11 @@ . = ..() if(over_object == usr && Adjacent(usr) && (in_range(src, usr) || usr.contents.Find(src))) if(!ishuman(usr)) - return 0 + return FALSE if(opened) - return 0 + return FALSE if(contents.len) - return 0 + return FALSE visible_message("[usr] folds up [src].") var/obj/item/bodybag/B = new foldedbag_path(get_turf(src)) usr.put_in_hands(B) @@ -83,15 +83,15 @@ . = ..() if(over_object == usr && Adjacent(usr) && (in_range(src, usr) || usr.contents.Find(src))) if(!ishuman(usr)) - return 0 + return FALSE if(opened) - return 0 + return FALSE if(contents.len >= mob_storage_capacity / 2) to_chat(usr, "There are too many things inside of [src] to fold it up!") - return 0 + return FALSE for(var/obj/item/bodybag/bluespace/B in src) to_chat(usr, "You can't recursively fold bluespace body bags!" ) - return 0 + return FALSE visible_message("[usr] folds up [src].") var/obj/item/bodybag/B = new foldedbag_path(get_turf(src)) usr.put_in_hands(B) diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index 1d6826b5486f..3167d2cc2265 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -35,7 +35,7 @@ /obj/structure/closet/cardboard/open() if(opened || !can_open()) - return 0 + return FALSE var/list/alerted = null if(egged < world.time) var/mob/living/Snake = null diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 22996339efb5..ef0dd5f2d54d 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -10,7 +10,7 @@ /obj/structure/closet/secure_closet/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(damage_flag == MELEE && damage_amount < melee_min_damage) - return 0 + return FALSE . = ..() // Exists to work around the minimum 700 cr price for goodies / small items / materials diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm index c376e63880d6..bc024202a91e 100644 --- a/code/game/objects/structures/crates_lockers/crates/large.dm +++ b/code/game/objects/structures/crates_lockers/crates/large.dm @@ -34,7 +34,7 @@ qdel(src) else - if(user.a_intent == INTENT_HARM) //Only return ..() if intent is harm, otherwise return 0 or just end it. + if(user.a_intent == INTENT_HARM) //Only return ..() if intent is harm, otherwise return FALSE or just end it. return ..() //Stops it from opening and turning invisible when items are used on it. else diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm index e60454a7ce01..887ca6d09b41 100644 --- a/code/game/objects/structures/crates_lockers/crates/secure.dm +++ b/code/game/objects/structures/crates_lockers/crates/secure.dm @@ -10,7 +10,7 @@ /obj/structure/closet/crate/secure/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(damage_flag == MELEE && damage_amount < 25) - return 0 + return FALSE . = ..() /obj/structure/closet/crate/secure/update_overlays() diff --git a/code/game/objects/structures/destructible_structures.dm b/code/game/objects/structures/destructible_structures.dm index cfed4561d49d..de55ab8cb452 100644 --- a/code/game/objects/structures/destructible_structures.dm +++ b/code/game/objects/structures/destructible_structures.dm @@ -16,4 +16,4 @@ if(break_sound) playsound(src, break_sound, 50, 1) qdel(src) - return 1 + return TRUE diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 90224af8cc64..d5efe63bb970 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -753,7 +753,7 @@ /datum/action/toggle_dead_chat_mob/Trigger() if(!..()) - return 0 + return FALSE var/mob/M = target if(HAS_TRAIT_FROM(M,TRAIT_SIXTHSENSE,GHOSTROLE_TRAIT)) REMOVE_TRAIT(M,TRAIT_SIXTHSENSE,GHOSTROLE_TRAIT) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 5b4b3a229fb4..925184b7c779 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -378,7 +378,7 @@ var/obj/item/stack/sheet/runed_metal/R = W if(R.get_amount() < 1) to_chat(user, "You need at least one sheet of runed metal to construct a runed wall!") - return 0 + return FALSE user.visible_message("[user] begins laying runed metal on [src]...", "You begin constructing a runed wall...") if(do_after(user, 50, target = src)) if(R.get_amount() < 1) @@ -452,7 +452,7 @@ var/obj/item/stack/sheet/bronze/B = W if(B.get_amount() < 2) to_chat(user, "You need at least two bronze sheets to build a bronze wall!") - return 0 + return FALSE user.visible_message("[user] begins plating [src] with bronze...", "You begin constructing a bronze wall...") if(do_after(user, 50, target = src)) if(B.get_amount() < 2) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 5075ecd074cc..c0b936a76ff5 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -22,12 +22,12 @@ /obj/structure/janitorialcart/proc/wet_mop(obj/item/mop, mob/user) if(reagents.total_volume < 1) to_chat(user, "[src] is out of water!") - return 0 + return FALSE else reagents.trans_to(mop, 5) to_chat(user, "You wet [mop] in [src].") playsound(loc, 'sound/effects/slosh.ogg', 25, 1) - return 1 + return TRUE /obj/structure/janitorialcart/proc/put_in_cart(obj/item/I, mob/user) if(!user.transferItemToLoc(I, src)) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index c39b3f64b175..42a5a0d8cb89 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -380,9 +380,9 @@ GLOBAL_LIST_EMPTY(crematoriums) if(.) return if(locate(/obj/structure/table) in get_turf(mover)) - return 1 + return TRUE else - return 0 + return FALSE /obj/structure/tray/m_tray/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) . = !density diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index 97eadff5f635..13bd885413c0 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -78,28 +78,28 @@ /mob/living/carbon/human/petrify(statue_timer) if(!isturf(loc)) - return 0 + return FALSE var/obj/structure/statue/petrified/S = new(loc, src, statue_timer) S.name = "statue of [name]" bleedsuppress = 1 S.copy_overlays(src) var/newcolor = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) S.add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) - return 1 + return TRUE /mob/living/carbon/monkey/petrify(statue_timer) if(!isturf(loc)) - return 0 + return FALSE var/obj/structure/statue/petrified/S = new(loc, src, statue_timer) S.name = "statue of a monkey" S.icon_state = "monkey" - return 1 + return TRUE /mob/living/simple_animal/pet/dog/corgi/petrify(statue_timer) if(!isturf(loc)) - return 0 + return FALSE var/obj/structure/statue/petrified/S = new (loc, src, statue_timer) S.name = "statue of a corgi" S.icon_state = "corgi" S.desc = "If it takes forever, I will wait for you..." - return 1 + return TRUE diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index ff85f5b2eb7f..dad0091389f9 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -77,24 +77,24 @@ var/obj/structure/bed/B = A if(istype(A, /obj/structure/bed) && (B.has_buckled_mobs() || B.density))//if it's a bed/chair and is dense or someone is buckled, it will not pass - return 0 + return FALSE if(istype(A, /obj/structure/closet/cardboard)) var/obj/structure/closet/cardboard/C = A if(C.move_delay) - return 0 + return FALSE if(ismecha(A)) - return 0 + return FALSE else if(isliving(A)) // You Shall Not Pass! var/mob/living/M = A if(isbot(A)) //Bots understand the secrets - return 1 + return TRUE if(M.buckled && istype(M.buckled, /mob/living/simple_animal/bot/mulebot)) // mulebot passenger gets a free pass. - return 1 + return TRUE if(!M.lying && !(SEND_SIGNAL(M, COMSIG_CHECK_VENTCRAWL)) && M.mob_size != MOB_SIZE_TINY) //If your not laying down, or a ventcrawler or a small creature, no pass. - return 0 + return FALSE /obj/structure/plasticflaps/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index acf7e19f75e3..bdb30aff2b70 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -56,7 +56,7 @@ return ..(NORTH) /obj/structure/reflector/proc/dir_map_to_angle(dir) - return 0 + return FALSE /obj/structure/reflector/bullet_act(obj/item/projectile/P) var/pdir = P.dir diff --git a/code/game/objects/structures/spirit_board.dm b/code/game/objects/structures/spirit_board.dm index 1b3093e4e796..514128a8b54e 100644 --- a/code/game/objects/structures/spirit_board.dm +++ b/code/game/objects/structures/spirit_board.dm @@ -25,7 +25,7 @@ /obj/structure/spirit_board/proc/spirit_board_pick_letter(mob/M) if(!spirit_board_checks(M)) - return 0 + return FALSE if(virgin) virgin = 0 @@ -48,7 +48,7 @@ bonus = 10 //Give some other people a chance, hog. if(next_use - bonus > world.time ) - return 0 //No feedback here, hiding the cooldown a little makes it harder to tell who's really picking letters. + return FALSE //No feedback here, hiding the cooldown a little makes it harder to tell who's really picking letters. //lighting check var/light_amount = 0 @@ -58,7 +58,7 @@ if(light_amount > 0.2) to_chat(M, "It's too bright here to use [src.name]!") - return 0 + return FALSE //mobs in range check var/users_in_range = 0 @@ -71,6 +71,6 @@ if(users_in_range < 2) to_chat(M, "There aren't enough people to use the [src.name]!") - return 0 + return FALSE - return 1 + return TRUE diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 12799b437053..1f8007744727 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -741,11 +741,11 @@ /obj/structure/rack/CanPass(atom/movable/mover, turf/target) if(src.density == 0) //Because broken racks -Agouri |TODO: SPRITE!| - return 1 + return TRUE if(istype(mover) && (mover.pass_flags & PASSTABLE)) - return 1 + return TRUE else - return 0 + return FALSE /obj/structure/rack/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) . = !density @@ -769,7 +769,7 @@ if(user.a_intent == INTENT_HARM) return ..() if(user.transferItemToLoc(W, drop_location())) - return 1 + return TRUE /obj/structure/rack/attack_paw(mob/living/user) attack_hand(user) diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 376725b2623f..0819020d92e8 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -31,7 +31,7 @@ return ..() /obj/structure/transit_tube/station/should_stop_pod(pod, from_dir) - return 1 + return TRUE /obj/structure/transit_tube/station/Bumped(atom/movable/AM) if(!pod_moving && open_status == STATION_TUBE_OPEN && ismob(AM) && AM.dir == boarding_dir) @@ -132,8 +132,8 @@ if(open_status == STATION_TUBE_CLOSED && pod && pod.loc == loc) pod.follow_tube() pod_moving = 0 - return 1 - return 0 + return TRUE + return FALSE /obj/structure/transit_tube/station/process() if(!pod_moving) diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index c8341c883484..be87c97759e0 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -54,7 +54,7 @@ // Called to check if a pod should stop upon entering this tube. /obj/structure/transit_tube/proc/should_stop_pod(pod, from_dir) - return 0 + return FALSE // Called when a pod stops in this tube section. /obj/structure/transit_tube/proc/pod_stopped(pod, from_dir) @@ -66,18 +66,18 @@ for(var/direction in tube_dirs) if(direction == from_dir) - return 1 + return TRUE - return 0 + return FALSE /obj/structure/transit_tube/proc/has_exit(in_dir) for(var/direction in tube_dirs) if(direction == in_dir) - return 1 + return TRUE - return 0 + return FALSE diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index 0ae1aff68aab..bb0682f07881 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -83,7 +83,7 @@ /obj/structure/transit_tube_pod/Process_Spacemove() if(moving) //No drifting while moving in the tubes - return 1 + return TRUE else return ..() diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 40424d831ddf..d1207c9620b3 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -597,7 +597,7 @@ busy = TRUE if(!do_after(user, 4 SECONDS, src)) busy = FALSE - return 1 + return TRUE busy = FALSE SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) O.clean_blood() @@ -609,7 +609,7 @@ reagents.reaction(O, TOUCH) user.visible_message("[user] washes [O] using [src].", \ "You wash [O] using [src].") - return 1 + return TRUE else return ..() diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 4f1de6432a91..89ec6d12edbb 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -69,7 +69,7 @@ if(get_dir(loc, T) == dir) return !density else - return 1 + return TRUE /obj/structure/windoor_assembly/CheckExit(atom/movable/mover, turf/target) if(mover.pass_flags & pass_flags_self) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index cf5e34fd8b3f..b1b02212d56d 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -165,7 +165,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) if(.) return if(dir == FULLTILE_WINDOW_DIR) - return 0 //full tile window, you can't move into it! + return FALSE //full tile window, you can't move into it! var/attempted_dir = get_dir(loc, target) if(attempted_dir == dir) return @@ -184,10 +184,10 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) /obj/structure/window/CheckExit(atom/movable/O, turf/target) if(istype(O) && (O.pass_flags & PASSGLASS)) - return 1 + return TRUE if(get_dir(O.loc, target) == dir) - return 0 - return 1 + return FALSE + return TRUE /obj/structure/window/attack_tk(mob/user) user.DelayNextAction(CLICK_CD_MELEE) @@ -197,7 +197,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) /obj/structure/window/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) if(!can_be_reached(user)) - return 1 + return TRUE . = ..() /obj/structure/window/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) @@ -218,7 +218,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) /obj/structure/window/attackby(obj/item/I, mob/living/user, params) if(!can_be_reached(user)) - return 1 //skip the afterattack + return TRUE //skip the afterattack add_fingerprint(user) @@ -454,8 +454,8 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) if(get_dir(user,src) & dir) for(var/obj/O in loc) if(!O.CanPass(user, user.loc, 1)) - return 0 - return 1 + return FALSE + return TRUE /obj/structure/window/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) . = ..() diff --git a/code/game/say.dm b/code/game/say.dm index 44f020e7c483..a80171c865d9 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -45,7 +45,7 @@ GLOBAL_LIST_INIT(freqtospan, list( M.playsound_local(T, vol = volume, vary = TRUE, frequency = pitch, max_distance = distance, falloff_distance = 0, falloff_exponent = BARK_SOUND_FALLOFF_EXPONENT(distance), S = vocal_bark, distance_multiplier = 1) /atom/movable/proc/can_speak() - return 1 + return TRUE /atom/movable/proc/send_speech(message, range = 7, atom/movable/source = src, bubble_type, list/spans, datum/language/message_language = null, message_mode) var/rendered = compose_message(src, message_language, message, , spans, message_mode, source) @@ -202,7 +202,7 @@ GLOBAL_LIST_INIT(freqtospan, list( return "[src]" //Returns the atom's name, prepended with 'The' if it's not a proper noun /atom/movable/proc/IsVocal() - return 1 + return TRUE /atom/movable/proc/get_alt_name() diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index ef3c6a91d966..5bae49aa91c9 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -37,7 +37,7 @@ return /turf/closed/indestructible/acid_act(acidpwr, acid_volume, acid_id) - return 0 + return FALSE /turf/closed/indestructible/Melt() to_be_destroyed = FALSE diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 0e32c170d739..02f86ead1fc9 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -245,7 +245,7 @@ if(L.bodytemperature <= 50) L.apply_status_effect(/datum/status_effect/freon) MakeSlippery(TURF_WET_PERMAFROST, 50) - return 1 + return TRUE /turf/open/proc/water_vapor_gas_act() MakeSlippery(TURF_WET_WATER, min_wet_time = 100, wet_time_to_add = 50) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index da1cf68d405c..e728d1ee6072 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -157,7 +157,7 @@ /turf/open/floor/is_shielded() for(var/obj/structure/A in contents) if(A.level == 3) - return 1 + return TRUE /turf/open/floor/blob_act(obj/structure/blob/B) return @@ -212,12 +212,12 @@ /turf/open/floor/attackby(obj/item/C, mob/user, params) if(!C || !user) - return 1 + return TRUE if(..()) - return 1 + return TRUE if(intact && istype(C, /obj/item/stack/tile)) try_replace_tile(C, user, params) - return 0 + return FALSE /turf/open/floor/crowbar_act(mob/living/user, obj/item/I) return intact ? FORCE_BOOLEAN(pry_tile(I, user)) : FALSE diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index a7d3cda389de..fd3ba4bcce2c 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -258,7 +258,7 @@ /turf/open/floor/carpet/update_icon() if(!..()) - return 0 + return FALSE if(!broken && !burnt) if(smooth) queue_smooth(src) diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm index b7266bfb1639..498417e3f82b 100644 --- a/code/game/turfs/simulated/floor/mineral_floor.dm +++ b/code/game/turfs/simulated/floor/mineral_floor.dm @@ -25,7 +25,7 @@ /turf/open/floor/mineral/update_icon() if(!..()) - return 0 + return FALSE if(!broken && !burnt) if( !(icon_state in icons) ) icon_state = initial(icon_state) diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm index 614c63a14c37..11c0ba4f4dab 100644 --- a/code/game/turfs/simulated/floor/plasteel_floor.dm +++ b/code/game/turfs/simulated/floor/plasteel_floor.dm @@ -15,7 +15,7 @@ /turf/open/floor/plasteel/update_icon() if(!..()) - return 0 + return FALSE if(!broken && !burnt) icon_state = icon_regular_floor diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index 620c9adfc844..944934df75dd 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -75,25 +75,25 @@ d_state = SUPPORT_LINES update_icon() to_chat(user, "You cut the outer grille.") - return 1 + return TRUE if(SUPPORT_LINES) if(W.tool_behaviour == TOOL_SCREWDRIVER) to_chat(user, "You begin unsecuring the support lines...") if(W.use_tool(src, user, 40, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != SUPPORT_LINES) - return 1 + return TRUE d_state = COVER update_icon() to_chat(user, "You unsecure the support lines.") - return 1 + return TRUE else if(W.tool_behaviour == TOOL_WIRECUTTER) W.play_tool_sound(src, 100) d_state = INTACT update_icon() to_chat(user, "You repair the outer grille.") - return 1 + return TRUE if(COVER) if(W.tool_behaviour == TOOL_WELDER || istype(W, /obj/item/gun/energy/plasmacutter)) @@ -102,32 +102,32 @@ to_chat(user, "You begin slicing through the metal cover...") if(W.use_tool(src, user, 60, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != COVER) - return 1 + return TRUE d_state = CUT_COVER update_icon() to_chat(user, "You press firmly on the cover, dislodging it.") - return 1 + return TRUE if(W.tool_behaviour == TOOL_SCREWDRIVER) to_chat(user, "You begin securing the support lines...") if(W.use_tool(src, user, 40, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != COVER) - return 1 + return TRUE d_state = SUPPORT_LINES update_icon() to_chat(user, "The support lines have been secured.") - return 1 + return TRUE if(CUT_COVER) if(W.tool_behaviour == TOOL_CROWBAR) to_chat(user, "You struggle to pry off the cover...") if(W.use_tool(src, user, 100, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != CUT_COVER) - return 1 + return TRUE d_state = ANCHOR_BOLTS update_icon() to_chat(user, "You pry off the cover.") - return 1 + return TRUE if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) @@ -139,28 +139,28 @@ d_state = COVER update_icon() to_chat(user, "The metal cover has been welded securely to the frame.") - return 1 + return TRUE if(ANCHOR_BOLTS) if(W.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start loosening the anchoring bolts which secure the support rods to their frame...") if(W.use_tool(src, user, 40, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != ANCHOR_BOLTS) - return 1 + return TRUE d_state = SUPPORT_RODS update_icon() to_chat(user, "You remove the bolts anchoring the support rods.") - return 1 + return TRUE if(W.tool_behaviour == TOOL_CROWBAR) to_chat(user, "You start to pry the cover back into place...") if(W.use_tool(src, user, 20, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != ANCHOR_BOLTS) - return 1 + return TRUE d_state = CUT_COVER update_icon() to_chat(user, "The metal cover has been pried back into place.") - return 1 + return TRUE if(SUPPORT_RODS) if(W.tool_behaviour == TOOL_WELDER || istype(W, /obj/item/gun/energy/plasmacutter)) @@ -169,32 +169,32 @@ to_chat(user, "You begin slicing through the support rods...") if(W.use_tool(src, user, 100, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != SUPPORT_RODS) - return 1 + return TRUE d_state = SHEATH update_icon() to_chat(user, "You slice through the support rods.") - return 1 + return TRUE if(W.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start tightening the bolts which secure the support rods to their frame...") W.play_tool_sound(src, 100) if(W.use_tool(src, user, 40)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != SUPPORT_RODS) - return 1 + return TRUE d_state = ANCHOR_BOLTS update_icon() to_chat(user, "You tighten the bolts anchoring the support rods.") - return 1 + return TRUE if(SHEATH) if(W.tool_behaviour == TOOL_CROWBAR) to_chat(user, "You struggle to pry off the outer sheath...") if(W.use_tool(src, user, 100, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != SHEATH) - return 1 + return TRUE to_chat(user, "You pry off the outer sheath.") dismantle_wall() - return 1 + return TRUE if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) @@ -206,8 +206,8 @@ d_state = SUPPORT_RODS update_icon() to_chat(user, "You weld the support rods back together.") - return 1 - return 0 + return TRUE + return FALSE /turf/closed/wall/r_wall/update_icon() . = ..() diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 2df1606cb90d..e9911fb02ef3 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -228,16 +228,16 @@ /turf/open/space/can_have_cabling() if(locate(/obj/structure/lattice/catwalk, src)) - return 1 - return 0 + return TRUE + return FALSE /turf/open/space/is_transition_turf() if(destination_x || destination_y || destination_z) - return 1 + return TRUE /turf/open/space/acid_act(acidpwr, acid_volume) - return 0 + return FALSE /turf/open/space/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) underlay_appearance.icon = 'icons/turf/space.dmi' diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 85fbbc5c77f6..b9be8d2386fe 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -476,7 +476,7 @@ GLOBAL_LIST_EMPTY(station_turfs) var/atom/A for(var/i in contents) if(. <= 0) - return 0 + return FALSE A = i if(!QDELETED(A) && A.level >= affecting_level) . = A.wave_explode(., explosion, dir) diff --git a/code/modules/admin/DB_ban/functions.dm b/code/modules/admin/DB_ban/functions.dm index b8d245287415..429d1fef5d77 100644 --- a/code/modules/admin/DB_ban/functions.dm +++ b/code/modules/admin/DB_ban/functions.dm @@ -173,7 +173,7 @@ AH.Resolve() //with prejudice if(banned_client && banned_client.ckey == ckey) qdel(banned_client) - return 1 + return TRUE /datum/admins/proc/DB_ban_unban(ckey, bantype, job = "") diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 1a6f17efdf91..ca307fbbbdc1 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -7,7 +7,7 @@ GLOBAL_PROTECT(Banlist) if(!GLOB.Banlist) // if Banlist cannot be located for some reason LoadBans() // try to load the bans if(!GLOB.Banlist) // uh oh, can't find bans! - return 0 // ABORT ABORT ABORT + return FALSE // ABORT ABORT ABORT . = list() var/appeal @@ -20,7 +20,7 @@ GLOBAL_PROTECT(Banlist) if (GLOB.Banlist["temp"]) if (!GetExp(GLOB.Banlist["minutes"])) ClearTempbans() - return 0 + return FALSE else .["desc"] = "\nReason: [GLOB.Banlist["reason"]]\nExpires: [GetExp(GLOB.Banlist["minutes"])]\nBy: [GLOB.Banlist["bannedby"]] during round ID [GLOB.Banlist["roundid"]][appeal]" else @@ -47,18 +47,18 @@ GLOBAL_PROTECT(Banlist) if(GLOB.Banlist["temp"]) if (!GetExp(GLOB.Banlist["minutes"])) ClearTempbans() - return 0 + return FALSE else .["desc"] = "\nReason: [GLOB.Banlist["reason"]]\nExpires: [GetExp(GLOB.Banlist["minutes"])]\nBy: [GLOB.Banlist["bannedby"]] during round ID [GLOB.Banlist["roundid"]][appeal]" else .["desc"] = "\nReason: [GLOB.Banlist["reason"]]\nExpires: PERMENANT\nBy: [GLOB.Banlist["bannedby"]] during round ID [GLOB.Banlist["roundid"]][appeal]" .["reason"] = matches return . - return 0 + return FALSE /proc/UpdateTime() //No idea why i made this a proc. GLOB.CMinutes = (world.realtime / 10) / 60 - return 1 + return TRUE /proc/LoadBans() if(!CONFIG_GET(flag/ban_legacy_system)) @@ -78,7 +78,7 @@ GLOBAL_PROTECT(Banlist) GLOB.Banlist.cd = "/base" ClearTempbans() - return 1 + return TRUE /proc/ClearTempbans() UpdateTime() @@ -97,7 +97,7 @@ GLOBAL_PROTECT(Banlist) if (GLOB.CMinutes >= GLOB.Banlist["minutes"]) RemoveBan(A) - return 1 + return TRUE /proc/AddBan(key, computerid, reason, bannedby, temp, minutes, address) @@ -111,7 +111,7 @@ GLOBAL_PROTECT(Banlist) GLOB.Banlist.cd = "/base" if ( GLOB.Banlist.dir.Find("[ban_ckey][computerid]") ) to_chat(usr, text("Ban already exists.")) - return 0 + return FALSE else GLOB.Banlist.dir.Add("[ban_ckey][computerid]") GLOB.Banlist.cd = "/base/[ban_ckey][computerid]" @@ -128,7 +128,7 @@ GLOBAL_PROTECT(Banlist) create_message("note", key, bannedby, "Permanently banned - [reason]", null, null, 0, 0, null, 0, 0) else create_message("note", key, bannedby, "Banned for [minutes] minutes - [reason]", null, null, 0, 0, null, 0, 0) - return 1 + return TRUE /proc/RemoveBan(foldername) var/key @@ -140,7 +140,7 @@ GLOBAL_PROTECT(Banlist) GLOB.Banlist.cd = "/base" if (!GLOB.Banlist.dir.Remove(foldername)) - return 0 + return FALSE if(!usr) log_admin_private("Ban Expired: [key]") @@ -157,13 +157,13 @@ GLOBAL_PROTECT(Banlist) GLOB.Banlist.dir.Remove(A) continue - return 1 + return TRUE /proc/GetExp(minutes as num) UpdateTime() var/exp = minutes - GLOB.CMinutes if (exp <= 0) - return 0 + return FALSE else var/timeleftstring if (exp >= 1440) //1440 = 1 day in minutes diff --git a/code/modules/admin/create_poll.dm b/code/modules/admin/create_poll.dm index e5391f0f431e..6bd4fd040ed2 100644 --- a/code/modules/admin/create_poll.dm +++ b/code/modules/admin/create_poll.dm @@ -29,7 +29,7 @@ if ("Instant Runoff Voting") polltype = POLLTYPE_IRV else - return 0 + return FALSE var/starttime = SQLtime() var/endtime = input("Set end time for poll as format YYYY-MM-DD HH:MM:SS. All times in server time. HH:MM:SS is optional and 24-hour. Must be later than starting time for obvious reasons.", "Set end time", SQLtime()) as text if(!endtime) @@ -117,7 +117,7 @@ if("Finish") add_option = 0 else - return 0 + return FALSE var/m1 = "[key_name(usr)] has created a new server poll. Poll type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"] - Question: [question]" var/m2 = "[key_name_admin(usr)] has created a new server poll. Poll type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"]
Question: [question]" var/datum/db_query/query_polladd_question = SSdbcore.NewQuery({" diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 4e97c6fd595a..ea162830708e 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -140,21 +140,21 @@ GLOBAL_PROTECT(href_token) /datum/admins/proc/check_for_rights(rights_required) if(rights_required && !(rights_required & rank.rights)) - return 0 - return 1 + return FALSE + return TRUE /datum/admins/proc/check_if_greater_rights_than_holder(datum/admins/other) if(!other) - return 1 //they have no rights + return TRUE //they have no rights if(rank.rights == R_EVERYTHING) - return 1 //we have all the rights + return TRUE //we have all the rights if(src == other) - return 1 //you always have more rights than yourself + return TRUE //you always have more rights than yourself if(rank.rights != other.rank.rights) if( (rank.rights & other.rank.rights) == other.rank.rights ) - return 1 //we have all the rights they have and more - return 0 + return TRUE //we have all the rights they have and more + return FALSE /datum/admins/vv_edit_var(var_name, var_value) if(var_name == NAMEOF(src, fakekey)) @@ -164,7 +164,7 @@ GLOBAL_PROTECT(href_token) /* checks if usr is an admin with at least ONE of the flags in rights_required. (Note, they don't need all the flags) if rights_required == 0, then it simply checks if they are an admin. -if it doesn't return 1 and show_msg=1 it will prints a message explaining why the check has failed +if it doesn't return TRUE and show_msg=1 it will prints a message explaining why the check has failed generally it would be used like so: /proc/admin_proc() @@ -178,26 +178,26 @@ you will have to do something like if(client.rights & R_ADMIN) yourself. /proc/check_rights(rights_required, show_msg=1) if(usr && usr.client) if (check_rights_for(usr.client, rights_required)) - return 1 + return TRUE else if(show_msg) to_chat(usr, "Error: You do not have sufficient rights to do that. You require one of the following flags:[rights2text(rights_required," ")].") - return 0 + return FALSE //probably a bit iffy - will hopefully figure out a better solution /proc/check_if_greater_rights_than(client/other) if(usr && usr.client) if(usr.client.holder) if(!other || !other.holder) - return 1 + return TRUE return usr.client.holder.check_if_greater_rights_than_holder(other.holder) - return 0 + return FALSE //This proc checks whether subject has at least ONE of the rights specified in rights_required. /proc/check_rights_for(client/subject, rights_required) if(subject && subject.holder) return subject.holder.check_for_rights(rights_required) - return 0 + return FALSE /proc/GenerateToken() . = "" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 34afce6aa271..c1bf537dd889 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1026,7 +1026,7 @@ to_chat(M, "The reason is: [reason]") to_chat(M, "This jobban will be lifted in [mins] minutes.") href_list["jobban2"] = 1 // lets it fall through and refresh - return 1 + return TRUE if("No") var/reason = input(usr,"Please State Reason For Banning [M.key].","Reason") as message|null severity = input("Set the severity of the note/ban.", "Severity", null, null) as null|anything in list("High", "Medium", "Minor", "None") @@ -1052,7 +1052,7 @@ to_chat(M, "The reason is: [reason]") to_chat(M, "Jobban can be lifted only upon request.") href_list["jobban2"] = 1 // lets it fall through and refresh - return 1 + return TRUE if("Cancel") return @@ -1081,8 +1081,8 @@ message_admins("[key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg].") to_chat(M, "You have been un-jobbanned by [usr.client.key] from [msg].") href_list["jobban2"] = 1 // lets it fall through and refresh - return 1 - return 0 //we didn't do anything! + return TRUE + return FALSE //we didn't do anything! else if(href_list["boot2"]) if(!check_rights(R_ADMIN)) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 199ac646d9f4..e49847764ddf 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -89,11 +89,11 @@ available.Add(C) var/mob/choice = input("Choose a player to play the pAI", "Spawn pAI") in available if(!choice) - return 0 + return FALSE if(!isobserver(choice)) var/confirm = input("[choice.key] isn't ghosting right now. Are you sure you want to yank him out of them out of their body and place them in this pAI?", "Spawn pAI Confirmation", "No") in list("Yes", "No") if(confirm != "Yes") - return 0 + return FALSE var/obj/item/paicard/card = new(T) var/mob/living/silicon/pai/pai = new(card) pai.name = input(choice, "Enter your pAI name:", "pAI Name", "Personal AI") as text diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 532a361ba04a..89c0e0210e25 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -65,7 +65,7 @@ GLOBAL_PROTECT(admin_verbs_debug_mapping) icon_state = "yellow" /obj/effect/debugging/marker/Move() - return 0 + return FALSE /client/proc/camera_view() set category = "Mapping" @@ -111,7 +111,7 @@ GLOBAL_LIST_EMPTY(dirty_vars) if(!Master) alert(usr,"Master_controller not found.","Sec Camera Report") - return 0 + return FALSE var/list/obj/machinery/camera/CL = list() diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 6c43d61ccea2..ff9183f83472 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -70,10 +70,10 @@ H.mind.make_Traitor() candidates.Remove(H) - return 1 + return TRUE - return 0 + return FALSE /datum/admins/proc/makeChangelings() @@ -102,9 +102,9 @@ H.mind.make_Changeling() candidates.Remove(H) - return 1 + return TRUE - return 0 + return FALSE /datum/admins/proc/makeRevs() @@ -131,9 +131,9 @@ H = pick(candidates) H.mind.make_Rev() candidates.Remove(H) - return 1 + return TRUE - return 0 + return FALSE /datum/admins/proc/makeWizard() @@ -171,9 +171,9 @@ H.mind.make_Cultist() candidates.Remove(H) - return 1 + return TRUE - return 0 + return FALSE /datum/admins/proc/makeClockCult() @@ -206,9 +206,9 @@ SSticker.mode.equip_servant(H) candidates.Remove(H) - return 1 + return TRUE - return 0 + return FALSE @@ -236,7 +236,7 @@ break //Making sure we have atleast 3 Nuke agents, because less than that is kinda bad if(agentcount < 3) - return 0 + return FALSE //Let's find the spawn locations var/leader_chosen = FALSE @@ -249,9 +249,9 @@ nuke_team = N.nuke_team else new_character.mind.add_antag_datum(/datum/antagonist/nukeop,nuke_team) - return 1 + return TRUE else - return 0 + return FALSE @@ -451,8 +451,8 @@ //Abductors /datum/admins/proc/makeAbductorTeam() new /datum/round_event/ghost_role/abductor - return 1 + return TRUE /datum/admins/proc/makeRevenant() new /datum/round_event/ghost_role/revenant(TRUE, TRUE) - return 1 + return TRUE diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 2d7f1e8e9f3c..17ecab9b0860 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -300,7 +300,7 @@ else to_chat(usr, "Error: create_xeno(): no suitable candidates.") if(!istext(ckey)) - return 0 + return FALSE var/alien_caste = input(usr, "Please choose which caste to spawn.","Pick a caste",null) as null|anything in list("Queen","Praetorian","Hunter","Sentinel","Drone","Larva") var/obj/effect/landmark/spawn_here = GLOB.xeno_spawn.len ? pick(GLOB.xeno_spawn) : null @@ -319,7 +319,7 @@ if("Larva") new_xeno = new /mob/living/carbon/alien/larva(spawn_here) else - return 0 + return FALSE if(!spawn_here) SSjob.SendToLateJoin(new_xeno, FALSE) @@ -327,7 +327,7 @@ var/msg = "[key_name_admin(usr)] has spawned [ckey] as a filthy xeno [alien_caste]." message_admins(msg) admin_ticket_log(new_xeno, msg) - return 1 + return TRUE /* If a guy was gibbed and you want to revive him, this is a good way to do so. diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index ca392a044172..6648c6f94480 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -449,7 +449,7 @@ GLOBAL_LIST_EMPTY(antagonists) antag_memory = new_memo /** - * Gets how fast we can hijack the shuttle, return 0 for can not hijack. + * Gets how fast we can hijack the shuttle, return FALSE for can not hijack. * Defaults to hijack_speed var, override for custom stuff like buffing hijack speed for hijack objectives or something. */ /datum/antagonist/proc/hijack_speed() diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index bcba1e1e1e76..a12f0505966d 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -50,7 +50,7 @@ if(H.stat || H.restrained()) return if(!ishuman(H)) - return 1 + return TRUE if(loc == H || (in_range(src, H) && isturf(loc))) H.set_machine(src) diff --git a/code/modules/antagonists/blob/blob/blob_report.dm b/code/modules/antagonists/blob/blob/blob_report.dm index d532121e12cb..c417fa6574bc 100644 --- a/code/modules/antagonists/blob/blob/blob_report.dm +++ b/code/modules/antagonists/blob/blob/blob_report.dm @@ -61,7 +61,7 @@ /datum/station_state/proc/score(datum/station_state/result) if(!result) - return 0 + return FALSE var/output = 0 output += (result.floor / max(floor,1)) output += (result.r_wall/ max(r_wall,1)) diff --git a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm index 55a44b70de32..833a8ee95e04 100644 --- a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm +++ b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm @@ -53,7 +53,7 @@ /mob/living/simple_animal/hostile/blob/Process_Spacemove(movement_dir = 0) for(var/obj/structure/blob/B in range(1, src)) - return 1 + return TRUE return ..() /mob/living/simple_animal/hostile/blob/proc/blob_chat(msg) diff --git a/code/modules/antagonists/blob/blob/blobstrains/_blobstrain.dm b/code/modules/antagonists/blob/blob/blobstrains/_blobstrain.dm index 8b6f4bd687e8..2c55cc6915a9 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/_blobstrain.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/_blobstrain.dm @@ -65,7 +65,7 @@ GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/ return /datum/blobstrain/proc/tesla_reaction(obj/structure/blob/B, power, coefficient = 1) //when the blob is hit by a tesla bolt, do this - return 1 //return 0 to ignore damage + return TRUE //return FALSE to ignore damage /datum/blobstrain/proc/extinguish_reaction(obj/structure/blob/B, coefficient = 1) //when the blob is hit with water, do this return diff --git a/code/modules/antagonists/blob/blob/blobstrains/_reagent.dm b/code/modules/antagonists/blob/blob/blobstrains/_reagent.dm index f47c3b3378af..385fa1f7ae3c 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/_reagent.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/_reagent.dm @@ -29,5 +29,5 @@ /datum/reagent/blob/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O) if(M.stat == DEAD || istype(M, /mob/living/simple_animal/hostile/blob)) - return 0 //the dead, and blob mobs, don't cause reactions + return FALSE //the dead, and blob mobs, don't cause reactions return round(reac_volume * min(1.5 - touch_protection, 1), 0.1) //full touch protection means 50% volume, any prot below 0.5 means 100% volume. diff --git a/code/modules/antagonists/blob/blob/blobstrains/blazing_oil.dm b/code/modules/antagonists/blob/blob/blobstrains/blazing_oil.dm index be08266687cc..471d2d607d2c 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/blazing_oil.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/blazing_oil.dm @@ -23,7 +23,7 @@ if(!(C && C.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) && prob(80)) new /obj/effect/hotspot(T) if(damage_flag == FIRE) - return 0 + return FALSE return ..() /datum/reagent/blob/blazing_oil diff --git a/code/modules/antagonists/blob/blob/blobstrains/energized_jelly.dm b/code/modules/antagonists/blob/blob/blobstrains/energized_jelly.dm index c22b429e1b1b..a25a4d197492 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/energized_jelly.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/energized_jelly.dm @@ -15,7 +15,7 @@ return ..() /datum/blobstrain/reagent/energized_jelly/tesla_reaction(obj/structure/blob/B, power) - return 0 + return FALSE /datum/blobstrain/reagent/energized_jelly/emp_reaction(obj/structure/blob/B, severity) var/damage = rand(30, 50) - severity * rand(10, 15) diff --git a/code/modules/antagonists/blob/blob/blobstrains/explosive_lattice.dm b/code/modules/antagonists/blob/blob/blobstrains/explosive_lattice.dm index c805069a9c05..afc83f5a62d4 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/explosive_lattice.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/explosive_lattice.dm @@ -13,7 +13,7 @@ /datum/blobstrain/reagent/explosive_lattice/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) if(damage_flag == BOMB) - return 0 + return FALSE else if(damage_flag != MELEE && damage_flag != BULLET && damage_flag != LASER) return damage * 1.5 return ..() diff --git a/code/modules/antagonists/blob/blob/blobstrains/multiplex.dm b/code/modules/antagonists/blob/blob/blobstrains/multiplex.dm index 191da6c51f50..953608aa5ca0 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/multiplex.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/multiplex.dm @@ -29,7 +29,7 @@ for (var/datum/blobstrain/bt in blobstrains) . += bt.tesla_reaction(B, power, coefficient*typeshare) if (prob(. / length(blobstrains) * 100)) - return 1 + return TRUE /datum/blobstrain/multiplex/extinguish_reaction(obj/structure/blob/B, coefficient = 1) //when the blob is hit with water, do this for (var/datum/blobstrain/bt in blobstrains) diff --git a/code/modules/antagonists/blob/blob/blobstrains/reactive_spines.dm b/code/modules/antagonists/blob/blob/blobstrains/reactive_spines.dm index 84ff383dd177..104637aecc58 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/reactive_spines.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/reactive_spines.dm @@ -26,5 +26,5 @@ /datum/reagent/blob/reactive_spines/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O) if(M.stat == DEAD || istype(M, /mob/living/simple_animal/hostile/blob)) - return 0 //the dead, and blob mobs, don't cause reactions + return FALSE //the dead, and blob mobs, don't cause reactions M.adjustBruteLoss(0.8*reac_volume) diff --git a/code/modules/antagonists/blob/blob/overmind.dm b/code/modules/antagonists/blob/blob/overmind.dm index ec95d32fd4e6..7a3c2a3012f1 100644 --- a/code/modules/antagonists/blob/blob/overmind.dm +++ b/code/modules/antagonists/blob/blob/overmind.dm @@ -264,13 +264,13 @@ GLOBAL_LIST_EMPTY(blob_nodes) if(B) forceMove(NewLoc) else - return 0 + return FALSE else var/area/A = get_area(NewLoc) if(isspaceturf(NewLoc) || istype(A, /area/shuttle)) //if unplaced, can't go on shuttles or space tiles - return 0 + return FALSE forceMove(NewLoc) - return 1 + return TRUE /mob/camera/blob/mind_initialize() . = ..() diff --git a/code/modules/antagonists/blob/blob/powers.dm b/code/modules/antagonists/blob/blob/powers.dm index 9256d0d16b02..18886765deb2 100644 --- a/code/modules/antagonists/blob/blob/powers.dm +++ b/code/modules/antagonists/blob/blob/powers.dm @@ -1,15 +1,15 @@ /mob/camera/blob/proc/can_buy(cost = 15) if(blob_points < cost) to_chat(src, "You cannot afford this, you need at least [cost] resources!") - return 0 + return FALSE add_points(-cost) - return 1 + return TRUE // Power verbs /mob/camera/blob/proc/place_blob_core(placement_override, pop_override = FALSE) if(placed && placement_override != -1) - return 1 + return TRUE if(!placement_override) if(!pop_override) for(var/mob/living/M in range(7, src)) @@ -17,30 +17,30 @@ continue if(M.client) to_chat(src, "There is someone too close to place your blob core!") - return 0 + return FALSE for(var/mob/living/M in view(13, src)) if(ROLE_BLOB in M.faction) continue if(M.client) to_chat(src, "Someone could see your blob core from here!") - return 0 + return FALSE var/turf/T = get_turf(src) if(T.density) to_chat(src, "This spot is too dense to place a blob core on!") - return 0 + return FALSE for(var/obj/O in T) if(istype(O, /obj/structure/blob)) if(istype(O, /obj/structure/blob/normal)) qdel(O) else to_chat(src, "There is already a blob here!") - return 0 + return FALSE else if(O.density) to_chat(src, "This spot is too dense to place a blob core on!") - return 0 + return FALSE if(!pop_override && world.time <= manualplace_min_time && world.time <= autoplace_max_time) to_chat(src, "It is too early to place your blob core!") - return 0 + return FALSE else if(placement_override == 1) var/turf/T = pick(GLOB.blobstart) forceMove(T) //got overrided? you're somewhere random, motherfucker @@ -54,7 +54,7 @@ core.update_icon() update_health_hud() placed = 1 - return 1 + return TRUE /mob/camera/blob/verb/transport_core() set category = "Blob" diff --git a/code/modules/antagonists/blob/blob/theblob.dm b/code/modules/antagonists/blob/blob/theblob.dm index ff6eab264b9f..7945cf96870b 100644 --- a/code/modules/antagonists/blob/blob/theblob.dm +++ b/code/modules/antagonists/blob/blob/theblob.dm @@ -123,8 +123,8 @@ heal_timestamp = world.time + 20 update_icon() pulse_timestamp = world.time + 10 - return 1 //we did it, we were pulsed! - return 0 //oh no we failed + return TRUE //we did it, we were pulsed! + return FALSE //oh no we failed /obj/structure/blob/proc/ConsumeTile() for(var/atom/A in loc) @@ -157,7 +157,7 @@ else T = null if(!T) - return 0 + return FALSE var/make_blob = TRUE //can we make a blob? if(isspaceturf(T) && !(locate(/obj/structure/lattice) in T) && prob(80)) @@ -271,7 +271,7 @@ damage_amount *= fire_resist if(CLONE) else - return 0 + return FALSE var/armor_protection = 0 if(damage_flag) armor_protection = armor.getRating(damage_flag) diff --git a/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm b/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm index 25de64fe34cd..5f3a3dcc6f17 100644 --- a/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm +++ b/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm @@ -33,7 +33,7 @@ /obj/item/organ/heart/vampheart/Restart() beating = 0 // DONT run ..(). We don't want to start beating again. - return 0 + return FALSE /obj/item/organ/heart/vampheart/Stop() fakingit = 0 diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm index d58190cf66a7..df4a11b927c6 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm @@ -122,7 +122,7 @@ update_icon() //to_chat(user, "You flip a secret latch and unlock [src].") // Don't bother. We know it's unlocked. locked = FALSE - return 1 + return TRUE else playsound(get_turf(src), 'sound/machines/door_locked.ogg', 20, 1) to_chat(user, "[src] is locked tight from the inside.") diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index b92722eb8fe0..f73f45e433a7 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -229,10 +229,10 @@ playsound(get_turf(owner.current), 'sound/effects/lingreadapt.ogg', 75, TRUE, 5) can_respec = 0 SSblackbox.record_feedback("tally", "changeling_power_purchase", 1, "Readapt") - return 1 + return TRUE else to_chat(owner.current, "You lack the power to readapt your evolutions!") - return 0 + return FALSE //Called in life() /datum/antagonist/changeling/proc/regenerate()//grants the HuD in life.dm @@ -285,7 +285,7 @@ if(verbose) to_chat(user, "[target] is not compatible with our biology.") return - return 1 + return TRUE /datum/antagonist/changeling/proc/create_profile(mob/living/carbon/human/H, protect = 0) diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm index c784939c0fe0..8f481285620e 100644 --- a/code/modules/antagonists/changeling/changeling_power.dm +++ b/code/modules/antagonists/changeling/changeling_power.dm @@ -47,10 +47,10 @@ the same goes for Remove(). if you override Remove(), call parent or else your p /datum/action/changeling/proc/sting_action(mob/user, mob/target) SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) - return 0 + return FALSE /datum/action/changeling/proc/sting_feedback(mob/user, mob/target) - return 0 + return FALSE //Fairly important to remember to return TRUE on success >.< diff --git a/code/modules/antagonists/changeling/powers/hivemind.dm b/code/modules/antagonists/changeling/powers/hivemind.dm index 95ad09c318a7..f4ac9adca7ed 100644 --- a/code/modules/antagonists/changeling/powers/hivemind.dm +++ b/code/modules/antagonists/changeling/powers/hivemind.dm @@ -94,7 +94,7 @@ GLOBAL_LIST_EMPTY(hivemind_bank) if(first_prof.name == user.real_name)//If our current DNA is the stalest, we gotta ditch it. to_chat(user, "We have reached our capacity to store genetic information! We must transform before absorbing more.") return - return 1 + return TRUE /datum/action/changeling/hivemind_download/sting_action(mob/user) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) diff --git a/code/modules/antagonists/changeling/powers/humanform.dm b/code/modules/antagonists/changeling/powers/humanform.dm index 016ab5c6dd08..c141e0db2e4e 100644 --- a/code/modules/antagonists/changeling/powers/humanform.dm +++ b/code/modules/antagonists/changeling/powers/humanform.dm @@ -13,7 +13,7 @@ if(!chosen_prof) return if(!user || user.mob_transforming) - return 0 + return FALSE to_chat(user, "We transform our appearance.") changeling.purchasedpowers -= src diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 9fe612ac0776..0066af0cc8e5 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -40,7 +40,7 @@ var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) changeling.chem_recharge_slowdown -= recharge_slowdown user.update_inv_hands() - return 1 + return TRUE /datum/action/changeling/weapon/sting_action(mob/living/user) var/obj/item/held = user.get_active_held_item() @@ -597,7 +597,7 @@ /datum/action/changeling/gloves/proc/check_gloves(mob/user) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) if(!ishuman(user) || !changeling) - return 1 + return TRUE var/mob/living/carbon/human/H = user if(istype(H.gloves, glove_type)) H.visible_message("With a sickening crunch, [H] reforms [H.p_their()] [glove_name_simple] into hands!", "We assimilate our [glove_name_simple].", "You hear organic matter ripping and tearing!") @@ -609,7 +609,7 @@ playsound(H.loc, 'sound/effects/splat.ogg', 50, 1) //So real sounds changeling.chem_recharge_slowdown -= recharge_slowdown - return 1 + return TRUE /datum/action/changeling/gloves/Remove(mob/user) if(!ishuman(user)) diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index 351d8622c9b9..8969d904558f 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -53,7 +53,7 @@ if(target.mind && target.mind.has_antag_datum(/datum/antagonist/changeling)) sting_feedback(user, target) changeling.chem_charges -= chemical_cost - return 1 + return TRUE /datum/action/changeling/sting/sting_feedback(mob/user, mob/target) if(!target) @@ -61,7 +61,7 @@ to_chat(user, "We stealthily sting [target.name].") if(target.mind && target.mind.has_antag_datum(/datum/antagonist/changeling)) to_chat(target, "You feel a tiny prick.") - return 1 + return TRUE /datum/action/changeling/sting/transformation @@ -94,8 +94,8 @@ return if((HAS_TRAIT(target, TRAIT_HUSK)) || !iscarbon(target) || (NOTRANSSTING in target.dna.species.species_traits)) to_chat(user, "Our sting appears ineffective against its DNA.") - return 0 - return 1 + return FALSE + return TRUE /datum/action/changeling/sting/transformation/sting_action(mob/user, mob/target) if(ismonkey(target)) @@ -133,8 +133,8 @@ var/mob/living/L = target if((HAS_TRAIT(L, TRAIT_HUSK)) || !L.has_dna()) to_chat(user, "Our sting appears ineffective against its DNA.") - return 0 - return 1 + return FALSE + return TRUE /datum/action/changeling/sting/false_armblade/sting_action(mob/user, mob/target) log_combat(user, target, "stung", object="false armblade sting") diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index 18211d044755..f55d0a5c7564 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -21,7 +21,7 @@ return ..() user.visible_message("[user] scatters [src] with [I]!", "You scatter [src] with [I]!") qdel(src) - return 1 + return TRUE return ..() /obj/effect/clockwork/sigil/attack_tk(mob/user) diff --git a/code/modules/antagonists/clockcult/clock_helpers/clock_powerdrain.dm b/code/modules/antagonists/clockcult/clock_helpers/clock_powerdrain.dm index 8d0dff0ea88a..085eacca35e5 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/clock_powerdrain.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/clock_powerdrain.dm @@ -16,22 +16,22 @@ drain_amount: How much is drained by default; Influenced by a multiplier on most var/obj/item/stock_parts/cell/cell = get_cell() if(cell) return cell.power_drain(clockcult_user, drain_weapons, recursive, drain_amount) - return 0 //Returns 0 instead of FALSE to symbolise it returning the power amount in other cases, not TRUE aka 1 + return FALSE //Returns 0 instead of FALSE to symbolise it returning the power amount in other cases, not TRUE aka 1 /obj/item/melee/baton/power_drain(clockcult_user, drain_weapons = FALSE, recursive = FALSE, drain_amount = MIN_CLOCKCULT_POWER) //balance memes if(!drain_weapons) - return 0 + return FALSE var/obj/item/stock_parts/cell/cell = get_cell() if(cell) return cell.power_drain(clockcult_user, drain_weapons, recursive, drain_amount) - return 0 //No need to recurse further in batons + return FALSE //No need to recurse further in batons /obj/item/gun/power_drain(clockcult_user, drain_weapons = FALSE, recursive = FALSE, drain_amount = MIN_CLOCKCULT_POWER) //balance memes if(!drain_weapons) - return 0 + return FALSE var/obj/item/stock_parts/cell/cell = get_cell() if(!cell) - return 0 + return FALSE if(cell.charge) . = min(cell.charge, drain_amount*4) //Done snowflakey because guns have far smaller cells than batons / other equipment, also no need to recurse further in guns cell.use(.) diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_shield.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_shield.dm index 47105938e681..bc26aad15562 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_shield.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_shield.dm @@ -25,7 +25,7 @@ /obj/item/shield/riot/ratvarian/proc/calc_bash_mult() var/bash_mult = 0 if(!dam_absorbed) - return 1 + return TRUE else bash_mult += round(clamp(1 + (dam_absorbed / bash_mult_steps), 1, max_bash_mult), 0.1) //Multiplies the effect of bashes by up to [max_bash_mult], though never less than one return bash_mult diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm index 06fea9bd91b1..751e6f16caa9 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm @@ -55,7 +55,7 @@ /obj/item/clothing/head/helmet/clockwork/mob_can_equip(M, equipper, slot, disable_warning, bypass_equip_delay_self) if(equipper && !is_servant_of_ratvar(equipper)) - return 0 + return FALSE return ..() /obj/item/clothing/suit/armor/clockwork @@ -100,7 +100,7 @@ /obj/item/clothing/suit/armor/clockwork/mob_can_equip(M, equipper, slot, disable_warning, bypass_equip_delay_self) if(equipper && !is_servant_of_ratvar(equipper)) - return 0 + return FALSE return ..() /obj/item/clothing/suit/armor/clockwork/equipped(mob/living/user, slot) @@ -160,7 +160,7 @@ /obj/item/clothing/gloves/clockwork/mob_can_equip(M, equipper, slot, disable_warning, bypass_equip_delay_self) if(equipper && !is_servant_of_ratvar(equipper)) - return 0 + return FALSE return ..() /obj/item/clothing/gloves/clockwork/equipped(mob/living/user, slot) @@ -210,7 +210,7 @@ /obj/item/clothing/shoes/clockwork/mob_can_equip(M, equipper, slot, disable_warning, bypass_equip_delay_self) if(equipper && !is_servant_of_ratvar(equipper)) - return 0 + return FALSE return ..() /obj/item/clothing/shoes/clockwork/equipped(mob/living/user, slot) diff --git a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm index dc5321748642..fb99c67e0e6a 100644 --- a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm +++ b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm @@ -29,7 +29,7 @@ /obj/item/clothing/glasses/judicial_visor/item_action_slot_check(slot, mob/user, datum/action/A) if(slot != ITEM_SLOT_EYES) - return 0 + return FALSE return ..() /obj/item/clothing/glasses/judicial_visor/equipped(mob/living/user, slot) @@ -38,7 +38,7 @@ update_status(FALSE) if(blaster.ranged_ability_user) blaster.remove_ranged_ability() - return 0 + return FALSE if(is_servant_of_ratvar(user)) update_status(TRUE) else @@ -48,7 +48,7 @@ to_chat(user, "You suddenly catch fire!") user.adjust_fire_stacks(5) user.IgniteMob() - return 1 + return TRUE /obj/item/clothing/glasses/judicial_visor/dropped(mob/user) . = ..() @@ -67,27 +67,27 @@ /obj/item/clothing/glasses/judicial_visor/proc/update_status(change_to) if(recharging || !isliving(loc)) icon_state = "judicial_visor_0" - return 0 + return FALSE if(active == change_to) - return 0 + return FALSE var/mob/living/L = loc active = change_to icon_state = "judicial_visor_[active]" L.update_action_buttons_icon() L.update_inv_glasses() if(!is_servant_of_ratvar(L) || L.stat) - return 0 + return FALSE switch(active) if(TRUE) to_chat(L, "As you put on [src], its lens begins to glow, information flashing before your eyes.\n\ Judicial visor active. Use the action button to gain the ability to smite the unworthy.") if(FALSE) to_chat(L, "As you take off [src], its lens darkens once more.") - return 1 + return TRUE /obj/item/clothing/glasses/judicial_visor/proc/recharge_visor(mob/living/user) if(!src) - return 0 + return FALSE recharging = FALSE if(user && src == user.get_item_by_slot(ITEM_SLOT_EYES)) to_chat(user, "Your [name] hums. It is ready.") diff --git a/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm b/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm index 7be9ef039be1..6f2607941e39 100644 --- a/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm +++ b/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm @@ -23,7 +23,7 @@ /obj/item/clockwork/replica_fabricator/scarab/fabricate(atom/target, mob/living/user) if(!debug && !isdrone(user)) - return 0 + return FALSE return ..() /obj/item/clockwork/replica_fabricator/scarab/debug diff --git a/code/modules/antagonists/clockcult/clock_mobs.dm b/code/modules/antagonists/clockcult/clock_mobs.dm index a2263401aa74..9104146dc5b9 100644 --- a/code/modules/antagonists/clockcult/clock_mobs.dm +++ b/code/modules/antagonists/clockcult/clock_mobs.dm @@ -38,7 +38,7 @@ fully_heal(TRUE) /mob/living/simple_animal/hostile/clockwork/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) - return 0 //ouch, my metal-unlikely-to-be-damaged-by-electricity-body + return FALSE //ouch, my metal-unlikely-to-be-damaged-by-electricity-body /mob/living/simple_animal/hostile/clockwork/examine(mob/user) var/t_He = p_they(TRUE) diff --git a/code/modules/antagonists/clockcult/clock_mobs/clockwork_guardian.dm b/code/modules/antagonists/clockcult/clock_mobs/clockwork_guardian.dm index b3365e6e708f..3369e136c70c 100644 --- a/code/modules/antagonists/clockcult/clock_mobs/clockwork_guardian.dm +++ b/code/modules/antagonists/clockcult/clock_mobs/clockwork_guardian.dm @@ -121,7 +121,7 @@ stat(null, "You do [melee_damage_upper] damage on melee attacks.") /mob/living/simple_animal/hostile/clockwork/guardian/Process_Spacemove(movement_dir = 0) - return 1 + return TRUE /mob/living/simple_animal/hostile/clockwork/guardian/proc/bind_to_host(mob/living/new_host) if(!new_host) diff --git a/code/modules/antagonists/clockcult/clock_structure.dm b/code/modules/antagonists/clockcult/clock_structure.dm index 2884886e47c3..b24e8f88a703 100644 --- a/code/modules/antagonists/clockcult/clock_structure.dm +++ b/code/modules/antagonists/clockcult/clock_structure.dm @@ -93,7 +93,7 @@ if(is_servant_of_ratvar(user) && I.tool_behaviour == TOOL_WRENCH && unanchored_icon) if(default_unfasten_wrench(user, I, 50) == SUCCESSFUL_UNFASTEN) update_anchored(user) - return 1 + return TRUE return ..() /obj/structure/destructible/clockwork/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) diff --git a/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm b/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm index 40cadb53a24a..69bf30678281 100644 --- a/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm +++ b/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm @@ -37,7 +37,7 @@ if(user.canUseTopic(src, !issilicon(user), NO_DEXTERY) && is_servant_of_ratvar(user)) if(!can_access_clockwork_power(src, mania_cost)) to_chat(user, "[src] needs more power to function!") - return 0 + return FALSE toggle(0, user) /obj/structure/destructible/clockwork/powered/mania_motor/toggle(fast_process, mob/living/user) diff --git a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm index c81b05145e05..a8b318d6b87d 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm @@ -144,10 +144,10 @@ /obj/structure/destructible/clockwork/ocular_warden/proc/lose_target() if(!target) - return 0 + return FALSE target = null visible_message("[src] settles and seems almost disappointed.") - return 1 + return TRUE /obj/structure/destructible/clockwork/ocular_warden/get_efficiency_mod() if(GLOB.ratvar_awakens) diff --git a/code/modules/antagonists/clockcult/clock_structures/prolonging_prism.dm b/code/modules/antagonists/clockcult/clock_structures/prolonging_prism.dm index ededd0174ca0..774c76f3a16b 100644 --- a/code/modules/antagonists/clockcult/clock_structures/prolonging_prism.dm +++ b/code/modules/antagonists/clockcult/clock_structures/prolonging_prism.dm @@ -43,19 +43,19 @@ to_chat(user, "You break [src] apart, refunding some of the power used.") adjust_clockwork_power(power_refund) take_damage(max_integrity) - return 0 + return FALSE if(active) - return 0 + return FALSE var/turf/T = get_turf(src) if(!T || !is_station_level(T.z)) to_chat(user, "[src] must be on the station to function!") - return 0 + return FALSE if(SSshuttle.emergency.mode != SHUTTLE_CALL) to_chat(user, "No emergency shuttles are attempting to arrive at the station!") - return 0 + return FALSE if(!try_use_power(get_delay_cost())) to_chat(user, "[src] needs more power to function!") - return 0 + return FALSE delay_cost += delay_cost_increase delay_remaining += PRISM_DELAY_DURATION toggle(0, user) diff --git a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm index 20cf8711e015..7836e9012c99 100644 --- a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm +++ b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm @@ -25,7 +25,7 @@ /obj/structure/destructible/clockwork/wall_gear/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_WRENCH) default_unfasten_wrench(user, I, 10) - return 1 + return TRUE else if(I.tool_behaviour == TOOL_SCREWDRIVER) if(anchored) to_chat(user, "[src] needs to be unsecured to disassemble it!") @@ -34,7 +34,7 @@ if(I.use_tool(src, user, 30, volume=100) && !anchored) to_chat(user, "You disassemble [src].") deconstruct(TRUE) - return 1 + return TRUE else if(istype(I, /obj/item/stack/tile/brass)) var/obj/item/stack/tile/brass/W = I if(W.get_amount() < 1) @@ -64,7 +64,7 @@ qdel(src) else to_chat(user, "You need more brass to make a [anchored ? "false ":""]wall!") - return 1 + return TRUE return ..() /obj/structure/destructible/clockwork/wall_gear/deconstruct(disassembled = TRUE) diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 2850cb85cc69..1bda5048c568 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -108,7 +108,7 @@ var/where = mob.equip_in_one_of_slots(T, slots, critical = TRUE) if(!where) to_chat(mob, "Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).") - return 0 + return FALSE else to_chat(mob, "You have a [item_name] in your [where].") if(where == "backpack") diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index bbdf41ff48ba..e49dd8fa73be 100644 --- a/code/modules/antagonists/cult/cult_comms.dm +++ b/code/modules/antagonists/cult/cult_comms.dm @@ -142,7 +142,7 @@ /datum/action/innate/cult/master/IsAvailable(silent = FALSE) if(!owner.mind || !owner.mind.has_antag_datum(/datum/antagonist/cult/master) || GLOB.cult_narsie) - return 0 + return FALSE return ..() /datum/action/innate/cult/master/finalreck diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 809a69d393f8..93de7981f668 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -243,12 +243,12 @@ structure_check() searches for nearby cultist structures required for the invoca for(var/M in invokers) to_chat(M, "You need at least two invokers to convert [convertee]!") log_game("Offer rune failed - tried conversion with one invoker") - return 0 + return FALSE if(convertee.anti_magic_check(TRUE, TRUE, chargecost = 0)) //Not major because it can be spammed for(var/M in invokers) to_chat(M, "Something is shielding [convertee]'s mind!") log_game("Offer rune failed - convertee had anti-magic") - return 0 + return FALSE var/brutedamage = convertee.getBruteLoss() var/burndamage = convertee.getFireLoss() if(brutedamage || burndamage) diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm index 9f69f1088744..6ee76d009866 100644 --- a/code/modules/antagonists/devil/devil.dm +++ b/code/modules/antagonists/devil/devil.dm @@ -389,43 +389,43 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", if(iscarbon(body)) var/mob/living/carbon/H = body return H.reagents.has_reagent(/datum/reagent/water/holywater) - return 0 + return FALSE if(BANISH_COFFIN) return (body && istype(body.loc, /obj/structure/closet/crate/coffin)) if(BANISH_FORMALDYHIDE) if(iscarbon(body)) var/mob/living/carbon/H = body return H.reagents.has_reagent(/datum/reagent/toxin/formaldehyde) - return 0 + return FALSE if(BANISH_RUNES) if(body) for(var/obj/effect/decal/cleanable/crayon/R in range(0,body)) if (R.name == "rune") - return 1 - return 0 + return TRUE + return FALSE if(BANISH_CANDLES) if(body) var/count = 0 for(var/obj/item/candle/C in range(1,body)) count += C.lit if(count>=4) - return 1 - return 0 + return TRUE + return FALSE if(BANISH_DESTRUCTION) if(body) - return 0 - return 1 + return FALSE + return TRUE if(BANISH_FUNERAL_GARB) if(ishuman(body)) var/mob/living/carbon/human/H = body if(H.w_uniform && istype(H.w_uniform, /obj/item/clothing/under/misc/burial)) - return 1 - return 0 + return TRUE + return FALSE else for(var/obj/item/clothing/under/misc/burial/B in range(0,body)) if(B.loc == get_turf(B)) //Make sure it's not in someone's inventory or something. - return 1 - return 0 + return TRUE + return FALSE /datum/antagonist/devil/proc/hellish_resurrection(mob/living/body) message_admins("[owner.name] (true name is: [truename]) is resurrecting using hellish energy.
") diff --git a/code/modules/antagonists/devil/devil_helpers.dm b/code/modules/antagonists/devil/devil_helpers.dm index 1fcbbf91d05b..389aa43970f0 100644 --- a/code/modules/antagonists/devil/devil_helpers.dm +++ b/code/modules/antagonists/devil/devil_helpers.dm @@ -35,4 +35,4 @@ DefaultCombatKnockdown(40) qdel(weapon) return 2 - return 1 + return TRUE diff --git a/code/modules/antagonists/devil/sintouched/sintouched.dm b/code/modules/antagonists/devil/sintouched/sintouched.dm index c9bf474567d4..839d3cceeba9 100644 --- a/code/modules/antagonists/devil/sintouched/sintouched.dm +++ b/code/modules/antagonists/devil/sintouched/sintouched.dm @@ -17,9 +17,9 @@ /datum/antagonist/sintouched/threat() switch(sin) if(SIN_GLUTTONY,SIN_ENVY) - return 1 + return TRUE else - return 0 + return FALSE /datum/antagonist/sintouched/New() . = ..() diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm index d524a7edaee7..3b5d3cd4165a 100644 --- a/code/modules/antagonists/devil/true_devil/_true_devil.dm +++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm @@ -84,7 +84,7 @@ . += "" /mob/living/carbon/true_devil/IsAdvancedToolUser() - return 1 + return TRUE /mob/living/carbon/true_devil/resist_buckle() if(buckled) @@ -110,7 +110,7 @@ return ..() //flashes don't stop devils UNLESS it's their bane. /mob/living/carbon/true_devil/soundbang_act() - return 0 + return FALSE /mob/living/carbon/true_devil/get_ear_protection() return 2 @@ -124,7 +124,7 @@ /mob/living/carbon/true_devil/singularity_act() if(ascended) - return 0 + return FALSE return ..() //ATTACK GHOST IGNORING PARENT RETURN VALUE @@ -138,7 +138,7 @@ return ..() /mob/living/carbon/true_devil/can_be_revived() - return 1 + return TRUE /mob/living/carbon/true_devil/resist_fire() //They're immune to fire. @@ -177,7 +177,7 @@ // devils do not need to breathe /mob/living/carbon/true_devil/is_literate() - return 1 + return TRUE /mob/living/carbon/true_devil/ex_act(severity, target, origin) if(!ascended) diff --git a/code/modules/antagonists/devil/true_devil/inventory.dm b/code/modules/antagonists/devil/true_devil/inventory.dm index 8856838a3410..279a261cdba0 100644 --- a/code/modules/antagonists/devil/true_devil/inventory.dm +++ b/code/modules/antagonists/devil/true_devil/inventory.dm @@ -1,8 +1,8 @@ /mob/living/carbon/true_devil/doUnEquip(obj/item/I, force, invdrop, silent = FALSE) if(..()) update_inv_hands() - return 1 - return 0 + return TRUE + return FALSE /mob/living/carbon/true_devil/update_inv_hands() //TODO LORDPIDEY: Figure out how to make the hands line up properly. the l/r_hand_overlay should use the down sprite when facing down, left, or right, and the up sprite when facing up. diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index 41fc16c922f8..5d753fa079f9 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -175,7 +175,7 @@ //Immunities /mob/living/simple_animal/revenant/ex_act(severity, target, origin) - return 1 //Immune to the effects of explosions. + return TRUE //Immune to the effects of explosions. /mob/living/simple_animal/revenant/wave_ex_act(power, datum/wave_explosion/explosion, dir) return power @@ -225,7 +225,7 @@ /mob/living/simple_animal/revenant/death() if(!revealed || stasis) //Revenants cannot die if they aren't revealed //or are already dead - return 0 + return FALSE stasis = TRUE to_chat(src, "NO! No... it's too late, you can feel your essence [pick("breaking apart", "drifting away")]...") mob_transforming = TRUE @@ -333,7 +333,7 @@ to_chat(src, "Gained [essence_amt]E[source ? " from [source]":""].") else to_chat(src, "Lost [essence_amt]E[source ? " from [source]":""].") - return 1 + return TRUE /mob/living/simple_animal/revenant/proc/telekinesis_cooldown_end() if(!telekinesis_cooldown) diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index d2b698bce449..68c8cf4da381 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -210,7 +210,7 @@ return ..() /obj/item/organ/heart/demon/Stop() - return 0 // Always beating. + return FALSE // Always beating. /mob/living/simple_animal/slaughter/laughter // The laughter demon! It's everyone's best friend! It just wants to hug diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index 4c48ad81dd30..0eac4678d703 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -142,9 +142,9 @@ /mob/living/simple_animal/hostile/swarmer/CanAllowThrough(atom/movable/O) . = ..() if(istype(O, /obj/item/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other - return 1 + return TRUE if(isswarmer(O)) - return 1 + return TRUE ////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S//// /mob/living/simple_animal/hostile/swarmer/AttackingTarget() @@ -191,11 +191,11 @@ return S.Integrate(src) /atom/movable/proc/IntegrateAmount() - return 0 + return FALSE /obj/item/IntegrateAmount() //returns the amount of resources gained when eating this item if(custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)] || custom_materials[SSmaterials.GetMaterialRef(/datum/material/glass)]) - return 1 + return TRUE return ..() /obj/item/gun/swarmer_act()//Stops you from eating the entire armory @@ -217,7 +217,7 @@ return 2 /obj/item/clockwork/alloy_shards/small/IntegrateAmount() - return 1 + return TRUE /turf/open/floor/swarmer_act()//ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor return FALSE @@ -494,7 +494,7 @@ resources -= fabrication_cost else to_chat(src, "You do not have the necessary resources to fabricate this object.") - return 0 + return FALSE return new fabrication_object(loc) /mob/living/simple_animal/hostile/swarmer/proc/Integrate(atom/movable/target) diff --git a/code/modules/antagonists/swarmer/swarmer_event.dm b/code/modules/antagonists/swarmer/swarmer_event.dm index e70d76812dac..460ce687a649 100644 --- a/code/modules/antagonists/swarmer/swarmer_event.dm +++ b/code/modules/antagonists/swarmer/swarmer_event.dm @@ -13,9 +13,9 @@ /datum/round_event/spawn_swarmer/start() if(find_swarmer()) - return 0 + return FALSE if(!GLOB.the_gateway) - return 0 + return FALSE new /obj/effect/mob_spawn/swarmer(get_turf(GLOB.the_gateway)) if(prob(25)) //25% chance to announce it to the crew var/swarmer_report = "[command_name()] High-Priority Update" @@ -26,5 +26,5 @@ for(var/i in GLOB.mob_living_list) var/mob/living/L = i if(istype(L, /mob/living/simple_animal/hostile/swarmer) && L.client) //If there is a swarmer with an active client, we've found our swarmer - return 1 - return 0 + return TRUE + return FALSE diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index 0701ade73cf3..3240b5cc1110 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -21,18 +21,18 @@ if(istype(SSticker.mode,/datum/game_mode/dynamic)) var/datum/game_mode/dynamic/mode = SSticker.mode if(dynamic_requirement > 0 && mode.threat_level < dynamic_requirement) - return 0 - return 1 + return FALSE + return TRUE /datum/spellbook_entry/proc/CanBuy(mob/living/carbon/human/user,obj/item/spellbook/book) // Specific circumstances if(book.uses= aspell.level_max) to_chat(user, "This spell cannot be improved further.") - return 0 + return FALSE else aspell.name = initial(aspell.name) aspell.spell_level++ @@ -63,22 +63,22 @@ if(aspell.spell_level >= aspell.level_max) to_chat(user, "This spell cannot be strengthened any further.") SSblackbox.record_feedback("nested tally", "wizard_spell_improved", 1, list("[name]", "[aspell.spell_level]")) - return 1 + return TRUE //No same spell found - just learn it SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) user.mind.AddSpell(S) to_chat(user, "You have learned [S.name].") - return 1 + return TRUE /datum/spellbook_entry/proc/CanRefund(mob/living/carbon/human/user,obj/item/spellbook/book) if(!refundable) - return 0 + return FALSE if(!S) S = new spell_type() for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list) if(initial(S.name) == initial(aspell.name)) - return 1 - return 0 + return TRUE + return FALSE /datum/spellbook_entry/proc/Refund(mob/living/carbon/human/user,obj/item/spellbook/book) //return point value or -1 for failure var/area/wizard_station/A = GLOB.areas_by_type[/area/wizard_station] @@ -228,7 +228,7 @@ spell_type = /obj/effect/proc_holder/spell/aimed/lightningbolt cost = 3 -/datum/spellbook_entry/lightningbolt/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) //return 1 on success +/datum/spellbook_entry/lightningbolt/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) //return TRUE on success . = ..() ADD_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "lightning_bolt_spell") @@ -291,7 +291,7 @@ /datum/spellbook_entry/item/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) new item_path(get_turf(user)) SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) - return 1 + return TRUE /datum/spellbook_entry/item/GetInfo() var/dat ="" @@ -520,7 +520,7 @@ /datum/spellbook_entry/summon/guns/IsAvailible() if(!SSticker.mode) // In case spellbook is placed on map - return 0 + return FALSE return (!CONFIG_GET(flag/no_summon_guns) && ..()) /datum/spellbook_entry/summon/guns/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) @@ -529,7 +529,7 @@ active = 1 playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1) to_chat(user, "You have cast summon guns!") - return 1 + return TRUE /datum/spellbook_entry/summon/magic name = "Summon Magic" @@ -539,7 +539,7 @@ /datum/spellbook_entry/summon/magic/IsAvailible() if(!SSticker.mode) // In case spellbook is placed on map - return 0 + return FALSE return (!CONFIG_GET(flag/no_summon_guns) && ..()) /datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) @@ -548,7 +548,7 @@ active = 1 playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1) to_chat(user, "You have cast summon magic!") - return 1 + return TRUE /datum/spellbook_entry/summon/events name = "Summon Events" @@ -558,7 +558,7 @@ /datum/spellbook_entry/summon/events/IsAvailible() if(!SSticker.mode) // In case spellbook is placed on map - return 0 + return FALSE return (!CONFIG_GET(flag/no_summon_events) && ..()) /datum/spellbook_entry/summon/events/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) @@ -567,7 +567,7 @@ times++ playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1) to_chat(user, "You have cast summon events.") - return 1 + return TRUE /datum/spellbook_entry/summon/events/GetInfo() . = ..() @@ -755,7 +755,7 @@ if(H.stat || H.restrained()) return if(!ishuman(H)) - return 1 + return TRUE if(H.mind.special_role == "apprentice") temp = "If you got caught sneaking a peek from your teacher's spellbook, you'd likely be expelled from the Wizard Academy. Better not." diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 67844d50bf22..cd603baf559b 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -30,7 +30,7 @@ var/activate_cooldown = 3 SECONDS /obj/item/assembly/get_part_rating() - return 1 + return TRUE /obj/item/assembly/proc/on_attach() diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm index 0af6c85fb6b5..db79bb78c7b1 100644 --- a/code/modules/assembly/health.dm +++ b/code/modules/assembly/health.dm @@ -61,7 +61,7 @@ /obj/item/assembly/health/proc/toggle_scan() if(!secured) - return 0 + return FALSE scanning = !scanning if(scanning) START_PROCESSING(SSobj, src) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index fe7a8fdfaf3d..8b00fc49d01a 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -278,7 +278,7 @@ we use a hook instead /datum/gas_mixture/copy_from_turf(turf/model) set_temperature(initial(model.initial_temperature)) parse_gas_string(model.initial_gas_mix) - return 1 + return TRUE /datum/gas_mixture/proc/__auxtools_parse_gas_string(gas_string) @@ -297,7 +297,7 @@ we use a hook instead for(var/id in gas) set_moles(id, text2num(gas[id])) archive() - return 1 + return TRUE */ /* /datum/gas_mixture/react(datum/holder) diff --git a/code/modules/atmospherics/gasmixtures/zextools_broke.dm b/code/modules/atmospherics/gasmixtures/zextools_broke.dm index fe7b1c462b4e..3b133b77ac9b 100644 --- a/code/modules/atmospherics/gasmixtures/zextools_broke.dm +++ b/code/modules/atmospherics/gasmixtures/zextools_broke.dm @@ -41,7 +41,7 @@ TOTAL_MOLES(cached_gases, .) . *= R_IDEAL_GAS_EQUATION * temperature / volume return - return 0 + return FALSE /datum/gas_mixture/return_temperature() //kelvins return temperature @@ -91,11 +91,11 @@ /datum/gas_mixture/archive() temperature_archived = temperature gas_archive = gases.Copy() - return 1 + return TRUE /datum/gas_mixture/merge(datum/gas_mixture/giver) if(!giver) - return 0 + return FALSE //heat transfer if(abs(temperature - giver.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) @@ -111,7 +111,7 @@ for(var/giver_id in giver_gases) cached_gases[giver_id] += giver_gases[giver_id] - return 1 + return TRUE /datum/gas_mixture/remove(amount) var/sum @@ -172,7 +172,7 @@ //remove all gases not in the sample cached_gases &= sample_gases - return 1 + return TRUE /datum/gas_mixture/copy_from_turf(turf/model) parse_gas_string(model.initial_gas_mix) @@ -182,7 +182,7 @@ if(model.temperature != initial(model.temperature) || model.temperature != initial(model_parent.temperature)) temperature = model.temperature - return 1 + return TRUE /datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 19b94eb64e24..60b487c97c39 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -16,10 +16,10 @@ if(min2 != -1 && val <= min2) return 2 if(max1 != -1 && val >= max1) - return 1 + return TRUE if(min1 != -1 && val <= min1) - return 1 - return 0 + return TRUE + return FALSE /datum/tlv/no_checks min2 = -1 @@ -488,16 +488,16 @@ /obj/machinery/airalarm/proc/shock(mob/user, prb) if((stat & (NOPOWER))) // unpowered, no shock - return 0 + return FALSE if(!prob(prb)) - return 0 //you lucked out, no shock for you + return FALSE //you lucked out, no shock for you var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(5, 1, src) s.start() //sparks always. if (electrocute_mob(user, get_area(src), src, 1, TRUE)) - return 1 + return TRUE else - return 0 + return FALSE /obj/machinery/airalarm/proc/refresh_all() var/area/A = get_base_area(src) @@ -519,7 +519,7 @@ /obj/machinery/airalarm/proc/send_signal(target, list/command, mob/user)//sends signal 'command' to 'target'. Returns 0 if no radio connection, 1 otherwise if(!radio_connection) - return 0 + return FALSE var/datum/signal/signal = new(command) signal.data["tag"] = target @@ -527,7 +527,7 @@ signal.data["user"] = user radio_connection.post_signal(src, signal, RADIO_FROM_AIRALARM) - return 1 + return TRUE /obj/machinery/airalarm/proc/get_mode_name(mode_value) switch(mode_value) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index f5c10b365f39..e017b9186c0d 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -214,7 +214,7 @@ if(++reagent_transfer >= 10 * efficiency) // Throttle reagent transfer (higher efficiency will transfer the same amount but consume less from the beaker). reagent_transfer = 0 - return 1 + return TRUE /obj/machinery/atmospherics/components/unary/cryo_cell/process_atmos() ..() @@ -445,7 +445,7 @@ return // can't ventcrawl in or out of cryo. /obj/machinery/atmospherics/components/unary/cryo_cell/can_see_pipes() - return 0 // you can't see the pipe network when inside a cryo cell. + return FALSE // you can't see the pipe network when inside a cryo cell. /obj/machinery/atmospherics/components/unary/cryo_cell/return_temperature() var/datum/gas_mixture/G = airs[1] diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index b60cc7bb9085..c8f25d6f6a1c 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -84,7 +84,7 @@ update_parents() else active_power_usage = idle_power_usage - return 1 + return TRUE /obj/machinery/atmospherics/components/unary/thermomachine/power_change() ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 072babdf3efc..919c283808c5 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -194,7 +194,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/receive_signal(datum/signal/signal) if(!is_operational() || !signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) - return 0 + return FALSE var/mob/signal_sender = signal.data["user"] diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index 1d0c59f7896c..dbf155b9814a 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -186,7 +186,7 @@ self_temperature_delta = -heat/total_heat_capacity sharer_temperature_delta = heat/sharer_heat_capacity else - return 1 + return TRUE air.set_temperature(air.return_temperature() + self_temperature_delta) modeled_location.TakeTemperature(sharer_temperature_delta) diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index e7ea86851bc4..48d69567af4f 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -57,18 +57,18 @@ /obj/machinery/meter/process_atmos() if(!(target?.flags_1 & INITIALIZED_1)) icon_state = "meterX" - return 0 + return FALSE if(stat & (BROKEN|NOPOWER)) icon_state = "meter0" - return 0 + return FALSE use_power(5) var/datum/gas_mixture/environment = target.return_air() if(!environment) icon_state = "meterX" - return 0 + return FALSE var/env_pressure = environment.return_pressure() if(env_pressure <= 0.15*ONE_ATMOSPHERE) diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index a514606e4d89..beb0988f8dc3 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -76,7 +76,7 @@ parent = P /obj/machinery/atmospherics/pipe/zap_act(power, zap_flags) - return 0 // they're not really machines in the normal sense, probably shouldn't explode + return FALSE // they're not really machines in the normal sense, probably shouldn't explode /obj/machinery/atmospherics/pipe/Destroy() QDEL_NULL(parent) @@ -110,7 +110,7 @@ /obj/machinery/atmospherics/pipe/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(damage_flag == MELEE && damage_amount < 12) - return 0 + return FALSE . = ..() /obj/machinery/atmospherics/pipe/proc/paint(paint_color) diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index fcfdd54aa9a0..3613a59e0a3a 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -21,7 +21,7 @@ air_contents = new(volume) air_contents.set_temperature(T20C) - return 1 + return TRUE /obj/machinery/portable_atmospherics/Destroy() SSair.atmos_machinery -= src diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm index b5ff23d75b70..51c2c130c862 100644 --- a/code/modules/awaymissions/mission_code/Cabin.dm +++ b/code/modules/awaymissions/mission_code/Cabin.dm @@ -123,7 +123,7 @@ /datum/mapGeneratorModule/snow/checkPlaceAtom(turf/T) if(istype(T, /turf/open/floor/plating/asteroid/snow)) return ..(T) - return 0 + return FALSE /datum/mapGeneratorModule/bottomlayer/snow spawnableTurfs = list(/turf/open/floor/plating/asteroid/snow/atmosphere = 100) diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index bc7e2cbd081d..95b3163256d9 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -168,4 +168,4 @@ to_chat(C, "You're already resurrecting!") return C.apply_status_effect(STATUS_EFFECT_WISH_GRANTERS_GIFT) - return 1 + return TRUE diff --git a/code/modules/buildmode/buildmode.dm b/code/modules/buildmode/buildmode.dm index e0703201a137..09a93f57f88f 100644 --- a/code/modules/buildmode/buildmode.dm +++ b/code/modules/buildmode/buildmode.dm @@ -136,7 +136,7 @@ build_dir = newdir close_dirswitch() dirbutton.update_icon() - return 1 + return TRUE /datum/buildmode/proc/InterceptClickOn(mob/user, params, atom/object) mode.handle_click(user.client, params, object) diff --git a/code/modules/buildmode/buttons.dm b/code/modules/buildmode/buttons.dm index 5c5c0000d1b3..e29739f5adaa 100644 --- a/code/modules/buildmode/buttons.dm +++ b/code/modules/buildmode/buttons.dm @@ -25,7 +25,7 @@ else if(pa.Find("right")) bd.mode.change_settings(usr.client) update_icon() - return 1 + return TRUE /atom/movable/screen/buildmode/mode/update_icon_state() icon_state = bd.mode.get_button_iconstate() @@ -37,7 +37,7 @@ /atom/movable/screen/buildmode/help/Click(location, control, params) bd.mode.show_help(usr.client) - return 1 + return TRUE /atom/movable/screen/buildmode/bdir icon_state = "build" @@ -50,7 +50,7 @@ /atom/movable/screen/buildmode/bdir/Click() bd.toggle_dirswitch() update_icon() - return 1 + return TRUE // used to switch between modes /atom/movable/screen/buildmode/modeswitch @@ -64,7 +64,7 @@ /atom/movable/screen/buildmode/modeswitch/Click() bd.change_mode(modetype) - return 1 + return TRUE // used to switch between dirs /atom/movable/screen/buildmode/dirswitch @@ -77,7 +77,7 @@ /atom/movable/screen/buildmode/dirswitch/Click() bd.change_dir(dir) - return 1 + return TRUE /atom/movable/screen/buildmode/quit icon_state = "buildquit" @@ -86,4 +86,4 @@ /atom/movable/screen/buildmode/quit/Click() bd.quit() - return 1 + return TRUE diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index 66713a30539c..6ab72f2eb342 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -117,7 +117,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they // Checks the amount of exportable in object. Credits in the bill, sheets in the stack, etc. // Usually acts as a multiplier for a cost, so item that has 0 amount will be skipped in export. /datum/export/proc/get_amount(obj/O) - return 1 + return TRUE // Checks if the item is fit for export datum. /datum/export/proc/applies_to(obj/O, allowed_categories = NONE, apply_elastic = TRUE) diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm index e84d36d5dca9..f6976d7f448e 100644 --- a/code/modules/cargo/exports/materials.dm +++ b/code/modules/cargo/exports/materials.dm @@ -11,12 +11,12 @@ /datum/export/material/get_amount(obj/O) if(!material_id) - return 0 + return FALSE if(!isitem(O)) - return 0 + return FALSE var/obj/item/I = O if(!(SSmaterials.GetMaterialRef(material_id) in I.custom_materials)) - return 0 + return FALSE var/amount = I.custom_materials[SSmaterials.GetMaterialRef(material_id)] diff --git a/code/modules/cargo/exports/seeds.dm b/code/modules/cargo/exports/seeds.dm index 1a2a18c46be8..3d3c38fbf3c0 100644 --- a/code/modules/cargo/exports/seeds.dm +++ b/code/modules/cargo/exports/seeds.dm @@ -9,9 +9,9 @@ /datum/export/seed/get_cost(obj/O) var/obj/item/seeds/S = O if(!needs_discovery && (S.type in discoveredPlants)) - return 0 + return FALSE if(needs_discovery && !(S.type in discoveredPlants)) - return 0 + return FALSE return ..() * S.rarity // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later. /datum/export/seed/sell_object(obj/O) @@ -31,7 +31,7 @@ var/obj/item/seeds/S = O var/cost = ..() if(!cost) - return 0 + return FALSE var/potDiff = (S.potency - discoveredPlants[S.type]) diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm index 058e0cc892f1..79b22aba8d89 100644 --- a/code/modules/cargo/exports/sheets.dm +++ b/code/modules/cargo/exports/sheets.dm @@ -6,7 +6,7 @@ var/obj/item/stack/S = O if(istype(S)) return S.amount - return 0 + return FALSE // Hides diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 6036ab6ff108..5caea781a40b 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -167,8 +167,8 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( /client/proc/is_content_unlocked() if(!prefs.unlock_content) to_chat(src, "Become a BYOND member to access member-perks and features, as well as support the engine that makes this game possible. Only 10 bucks for 3 months! Click Here to find out more.") - return 0 - return 1 + return FALSE + return TRUE /* * Call back proc that should be checked in all paths where a client can send messages * @@ -199,11 +199,11 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( total_message_count = 0 total_count_reset = 0 cmd_admin_mute(src, mute_type, 1) - return 1 + return TRUE //Otherwise just supress the message else if(cache >= SPAM_TRIGGER_AUTOMUTE) - return 1 + return TRUE if(CONFIG_GET(flag/automute_on) && !holder && last_message == message) @@ -211,21 +211,21 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(src.last_message_count >= SPAM_TRIGGER_AUTOMUTE) to_chat(src, "You have exceeded the spam filter limit for identical messages. An auto-mute was applied.") cmd_admin_mute(src, mute_type, 1) - return 1 + return TRUE if(src.last_message_count >= SPAM_TRIGGER_WARNING) to_chat(src, "You are nearing the spam filter limit for identical messages.") - return 0 + return FALSE else last_message = message src.last_message_count = 0 - return 0 + return FALSE //This stops files larger than UPLOAD_LIMIT being sent from client to server via input(), client.Import() etc. /client/AllowUpload(filename, filelength) if(filelength > UPLOAD_LIMIT) to_chat(src, "Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB.") - return 0 - return 1 + return FALSE + return TRUE /////////// @@ -393,7 +393,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( to_chat(src, "Because you are an admin, you are being allowed to walk past this limitation, But it is still STRONGLY suggested you upgrade") else qdel(src) - return 0 + return FALSE else if (byond_version < cwv) //We have words for this client. if(CONFIG_GET(flag/client_warn_popup)) var/msg = "Your version of byond may be getting out of date:
" @@ -413,11 +413,11 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if (!CONFIG_GET(flag/allow_webclient)) to_chat(src, "Web client is disabled") qdel(src) - return 0 + return FALSE if (CONFIG_GET(flag/webclient_only_byond_members) && !IsByondMember()) to_chat(src, "Sorry, but the web client is restricted to byond members only.") qdel(src) - return 0 + return FALSE if( (world.address == address || !address) && !GLOB.host ) GLOB.host = key diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 14d1183d2539..f9d4ec151311 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1578,7 +1578,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) SetJobPreferenceLevel(job, jpval) SetChoices(user) - return 1 + return TRUE /datum/preferences/proc/ResetJobs() @@ -1724,7 +1724,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) UpdateJobPreference(user, href_list["text"], text2num(href_list["level"])) else SetChoices(user) - return 1 + return TRUE else if(href_list["preference"] == "trait") switch(href_list["task"]) @@ -3333,7 +3333,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) user_gear[LOADOUT_CUSTOM_DESCRIPTION] = new_description ShowChoices(user) - return 1 + return TRUE /datum/preferences/proc/copy_to(mob/living/carbon/human/character, icon_updates = 1, roundstart_checks = TRUE, initial_spawn = FALSE) if(be_random_name) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index c01921a46a07..b9d5d19d4ddc 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -595,18 +595,18 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car /datum/preferences/proc/save_preferences(bypass_cooldown = FALSE, silent = FALSE) if(!path) - return 0 + return FALSE if(!bypass_cooldown) if(world.time < saveprefcooldown) if(istype(parent)) queue_save_pref(PREF_SAVE_COOLDOWN, silent) - return 0 + return FALSE COOLDOWN_START(src, saveprefcooldown, PREF_SAVE_COOLDOWN) if(pref_queue != -1) deltimer(pref_queue) var/savefile/S = new /savefile(path) if(!S) - return 0 + return FALSE S.cd = "/" WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX) //updates (or failing that the sanity checks) will ensure data is not invalid at load. Assume up-to-date @@ -1093,22 +1093,22 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car cit_character_pref_load(S) - return 1 + return TRUE /datum/preferences/proc/save_character(bypass_cooldown = FALSE, silent = FALSE) if(!path) - return 0 + return FALSE if(!bypass_cooldown) if(world.time < savecharcooldown) if(istype(parent)) queue_save_char(PREF_SAVE_COOLDOWN, silent) - return 0 + return FALSE COOLDOWN_START(src, savecharcooldown, PREF_SAVE_COOLDOWN) if(char_queue != -1) deltimer(char_queue) var/savefile/S = new /savefile(path) if(!S) - return 0 + return FALSE S.cd = "/character[default_slot]" WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX) //load_character will sanitize any bad data, so assume up-to-date.) @@ -1295,7 +1295,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(parent && !silent) to_chat(parent, span_notice("Saved character slot!")) - return 1 + return TRUE /datum/preferences/proc/queue_save_char(save_in, silent) if(parent && !silent) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 6d569fb4e088..c9d8bb563a00 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -17,7 +17,7 @@ var/obj/item/clothing/mask/chameleon/drone/Z = target Z.chameleon_action.random_look(owner) - return 1 + return TRUE /datum/action/item_action/chameleon/drone/togglehatmask @@ -65,7 +65,7 @@ qdel(old_headgear) // where is `ITEM_SLOT_HEAD` defined? WHO KNOWS D.equip_to_slot(new_headgear, ITEM_SLOT_HEAD) - return 1 + return TRUE /datum/action/chameleon_outfit @@ -245,7 +245,7 @@ return select_look(owner) - return 1 + return TRUE /datum/action/item_action/chameleon/change/proc/emp_randomise(var/amount = EMP_RANDOMISE_TIME) START_PROCESSING(SSprocessing, src) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 52bf7c4ccbe8..dd7a5802c245 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -113,7 +113,7 @@ if(do_after(user, 6 SECONDS, src)) if(S.use(3)) repair(user, params) - return 1 + return TRUE return ..() // Set the clothing's integrity back to 100%, remove all damage to bodyparts, and generally fix it up @@ -420,8 +420,8 @@ BLIND // can't see anything /obj/item/clothing/proc/can_use(mob/user) if(user && ismob(user)) if(!user.incapacitated()) - return 1 - return 0 + return TRUE + return FALSE /obj/item/clothing/obj_destruction(damage_flag) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index b2a7f91e9608..e323b1b00004 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -121,7 +121,7 @@ /obj/item/clothing/glasses/science/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == ITEM_SLOT_EYES) - return 1 + return TRUE /obj/item/clothing/glasses/night name = "night vision goggles" diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 0a626a055821..4ef8d8caa1a4 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -203,7 +203,7 @@ /obj/item/clothing/head/fedora/suicide_act(mob/user) if(user.gender == FEMALE) - return 0 + return FALSE var/mob/living/carbon/human/H = user user.visible_message("[user] is donning [src]! It looks like [user.p_theyre()] trying to be nice to girls.") user.say("M'lady.", forced = "fedora suicide") diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 8aead31d2f1a..9f837654a022 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -111,7 +111,7 @@ var/datum/action/A = X A.UpdateButtons() to_chat(user, "Your Joy mask now has a [choice] Emotion!") - return 1 + return TRUE /obj/item/clothing/mask/kitsuneblk name = "Black Kitsune Mask" @@ -477,4 +477,4 @@ var/datum/action/A = X A.UpdateButtons() to_chat(user, "Your paper mask now has a [choice] symbol!") - return 1 + return TRUE diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index a1fa2bf42b01..275f674a238f 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -51,7 +51,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == ITEM_SLOT_HEAD) - return 1 + return TRUE /obj/item/clothing/head/helmet/space/hardsuit/equipped(mob/user, slot) ..() @@ -159,7 +159,7 @@ /obj/item/clothing/suit/space/hardsuit/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == ITEM_SLOT_OCLOTHING) //we only give the mob the ability to toggle the helmet if he's wearing the hardsuit. - return 1 + return TRUE //Engineering /obj/item/clothing/head/helmet/space/hardsuit/engine diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index 2f2c861b6b0b..3804cc5ae736 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -213,7 +213,7 @@ if(prob(hit_reaction_chance)) if(world.time < reactivearmor_cooldown) owner.visible_message("The repulse generator is still recharging!") - return 0 + return FALSE playsound(get_turf(owner),'sound/magic/repulse.ogg', 100, 1) owner.visible_message("[src] blocks [attack_text], converting the attack into a wave of force!") var/turf/T = get_turf(owner) diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index bb2b1bde5a2b..9fc51b82871c 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -32,7 +32,7 @@ /obj/item/clothing/suit/hooded/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == ITEM_SLOT_OCLOTHING || slot == ITEM_SLOT_NECK) - return 1 + return TRUE /obj/item/clothing/suit/hooded/equipped(mob/user, slot) if(slot != ITEM_SLOT_OCLOTHING && slot != ITEM_SLOT_NECK) @@ -127,7 +127,7 @@ set src in usr if(!can_use(usr)) - return 0 + return FALSE on_toggle(usr) if(src.suittoggled) diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index fc4cee1bedd2..776d2c4a531a 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -37,14 +37,14 @@ if((sensordamage || (has_sensor < HAS_SENSORS && has_sensor != NO_SENSORS)) && istype(I, /obj/item/stack/cable_coil)) if(damaged_clothes == CLOTHING_SHREDDED) to_chat(user,"[src] is too damaged to have its suit sensors repaired! Repair it first.") - return 0 + return FALSE var/obj/item/stack/cable_coil/C = I I.use_tool(src, user, 0, 1) has_sensor = HAS_SENSORS sensordamage = 0 sensor_mode = sensor_mode_intended to_chat(user,"You repair the suit sensors on [src] with [C].") - return 1 + return TRUE if(!attach_accessory(I, user)) return ..() @@ -233,13 +233,13 @@ return if(src.has_sensor == BROKEN_SENSORS) to_chat(usr, "The sensors have shorted out!") - return 0 + return FALSE if(src.sensor_flags & SENSOR_LOCKED) to_chat(usr, "The controls are locked.") - return 0 + return FALSE if(src.has_sensor <= NO_SENSORS) to_chat(usr, "This suit does not have any sensors.") - return 0 + return FALSE var/list/modes = list("Off", "Binary vitals", "Exact vitals", "Tracking beacon") var/switchMode = input("Select a sensor mode:", "Suit Sensor Mode", modes[sensor_mode + 1]) in modes @@ -292,10 +292,10 @@ if(src.has_sensor == BROKEN_SENSORS) to_chat(usr, "The sensors have shorted out!") - return 0 + return FALSE if(src.sensor_flags & SENSOR_LOCKED) to_chat(usr, "The controls are locked.") - return 0 + return FALSE if(has_sensor <= NO_SENSORS) to_chat(user, "This suit does not have any sensors.") return diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 2071dd69302a..1f9c8fd2bd74 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -141,7 +141,7 @@ H.visible_message("[H]'s suit automatically extinguishes [H.p_them()]!","Your suit automatically extinguishes you.") H.ExtinguishMob() new /obj/effect/particle_effect/water(get_turf(H)) - return 0 + return FALSE /obj/item/clothing/under/plasmaman/attackby(obj/item/E, mob/user, params) ..() diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index a9bedb3c573f..bfc291c97017 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -29,7 +29,7 @@ other_half.icon_state = "cracker2" target.put_in_active_hand(other_half) playsound(user, 'sound/effects/snap.ogg', 50, 1) - return 1 + return TRUE return ..() /obj/item/clothing/head/festive diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index a48191e8a1ad..525b49ba6a78 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -101,7 +101,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 walk_towards(src, destination, 1) /obj/effect/immovablerod/ex_act(severity, target, origin) - return 0 + return FALSE /obj/effect/immovablerod/singularity_act() return diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 1b1fdee58476..2f81b2d67173 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -458,9 +458,9 @@ /datum/export/pirate/ransom/get_cost(atom/movable/AM) var/mob/living/carbon/human/H = AM if(H.stat != CONSCIOUS || !H.mind || !H.mind.assigned_role) //mint condition only - return 0 + return FALSE else if("pirate" in H.faction) //can't ransom your fellow pirates to CentCom! - return 0 + return FALSE else if(H.mind.assigned_role in GLOB.command_positions) return 3000 diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index b1b68fb5853a..49e60893f3f4 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -108,16 +108,16 @@ /datum/round_event/portal_storm/proc/spawn_hostile() if(!hostile_types || !hostile_types.len) - return 0 + return FALSE return ISMULTIPLE(activeFor, 2) /datum/round_event/portal_storm/proc/spawn_boss() if(!boss_types || !boss_types.len) - return 0 + return FALSE if(activeFor == next_boss_spawn) next_boss_spawn += CEILING(number_of_hostiles / number_of_bosses, 1) - return 1 + return TRUE /datum/round_event/portal_storm/proc/time_to_end() if(!hostile_types.len && !boss_types.len) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 1bbcb0dd9211..44703a3b24ee 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -124,7 +124,7 @@ quality = MINOR_NEGATIVE /datum/spacevine_mutation/fire_proof/process_temperature(obj/structure/spacevine/holder, temp, volume) - return 1 + return TRUE /datum/spacevine_mutation/fire_proof/on_hit(obj/structure/spacevine/holder, mob/hitter, obj/item/I, expected_damage) if(I && I.damtype == "fire") diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm index 1864ad6d200d..50b133e0d355 100644 --- a/code/modules/events/wizard/greentext.dm +++ b/code/modules/events/wizard/greentext.dm @@ -13,7 +13,7 @@ if(!ishuman(M)) holder_canadates -= M if(!holder_canadates) //Very unlikely, but just in case - return 0 + return FALSE var/mob/living/carbon/human/H = pick(holder_canadates) new /obj/item/greentext(H.loc) diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index f4185ccf77d4..9a62b2a82231 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -22,14 +22,14 @@ /obj/item/reagent_containers/food/drinks/attack(mob/living/M, mob/user, def_zone) if(!reagents || !reagents.total_volume) to_chat(user, "[src] is empty!") - return 0 + return FALSE if(!canconsume(M, user)) - return 0 + return FALSE if (!is_drainable()) to_chat(user, "[src]'s lid hasn't been opened!") - return 0 + return FALSE if(M == user) user.visible_message("[user] swallows a gulp of [src].", "You swallow a gulp of [src].") @@ -47,7 +47,7 @@ reagents.reaction(M, INGEST, fraction) reagents.trans_to(M, gulp_size, log = TRUE) playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) - return 1 + return TRUE /obj/item/reagent_containers/food/drinks/CheckAttackCooldown(mob/user, atom/target) var/fast = HAS_TRAIT(user, TRAIT_VORACIOUS) && (user == target) diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index dca12aa4f874..0b55d856f681 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -37,10 +37,10 @@ if(!reagents || !reagents.total_volume) to_chat(user, "None of [src] left, oh no!") - return 0 + return FALSE if(!canconsume(M, user)) - return 0 + return FALSE if(M == user) user.visible_message("[user] swallows some of contents of \the [src].", "You swallow some of contents of \the [src].") @@ -57,7 +57,7 @@ reagents.reaction(M, INGEST, fraction) reagents.trans_to(M, 10, log = TRUE) playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) - return 1 + return TRUE /obj/item/reagent_containers/food/condiment/afterattack(obj/target, mob/user , proximity) . = ..() diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index cb1ed628c4fc..8f8f48412f9c 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -108,10 +108,10 @@ All foods are distributed among various categories. Use common sense. if(!reagents.total_volume) //Shouldn't be needed but it checks to see if it has anything left in it. to_chat(user, "None of [src] left, oh no!") qdel(src) - return 0 + return FALSE if(iscarbon(M)) if(!canconsume(M, user)) - return 0 + return FALSE var/fullness = M.nutrition + 10 for(var/datum/reagent/consumable/C in M.reagents.reagent_list) //we add the nutrition value of what we're currently digesting @@ -120,7 +120,7 @@ All foods are distributed among various categories. Use common sense. if(M == user) //If you're eating it yourself. if(junkiness && M.satiety < -150 && M.nutrition > NUTRITION_LEVEL_STARVING + 50 ) to_chat(M, "You don't feel like eating any more junk food at the moment.") - return 0 + return FALSE else if(fullness <= 50) user.visible_message("[user] hungrily takes a [eatverb] from \the [src], gobbling it down!", "You hungrily take a [eatverb] from \the [src], gobbling it down!") else if(fullness > 50 && fullness < 150) @@ -131,7 +131,7 @@ All foods are distributed among various categories. Use common sense. user.visible_message("[user] unwillingly takes a [eatverb] of a bit of \the [src].", "You unwillingly take a [eatverb] of a bit of \the [src].") else if(fullness > (600 * (1 + M.overeatduration / 2000))) // The more you eat - the more you can eat user.visible_message("[user] cannot force any more of \the [src] to go down [user.p_their()] throat!", "You cannot force any more of \the [src] to go down your throat!") - return 0 + return FALSE else if(!isbrain(M)) //If you're feeding it to someone else. if(fullness <= (600 * (1 + M.overeatduration / 1000))) @@ -140,7 +140,7 @@ All foods are distributed among various categories. Use common sense. else M.visible_message("[user] cannot force any more of [src] down [M]'s throat!", \ "[user] cannot force any more of [src] down [M]'s throat!") - return 0 + return FALSE if(!do_mob(user, M)) return @@ -164,9 +164,9 @@ All foods are distributed among various categories. Use common sense. bitecount++ On_Consume(M) checkLiked(fraction, M) - return 1 + return TRUE - return 0 + return FALSE /obj/item/reagent_containers/food/snacks/CheckAttackCooldown(mob/user, atom/target) var/fast = HAS_TRAIT(user, TRAIT_VORACIOUS) && (user == target) @@ -193,26 +193,26 @@ All foods are distributed among various categories. Use common sense. /obj/item/reagent_containers/food/snacks/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/storage)) ..() // -> item/attackby() - return 0 + return FALSE if(istype(W, /obj/item/reagent_containers/food/snacks)) var/obj/item/reagent_containers/food/snacks/S = W if(custom_food_type && ispath(custom_food_type)) if(S.w_class > WEIGHT_CLASS_SMALL) to_chat(user, "[S] is too big for [src]!") - return 0 + return FALSE if(!S.customfoodfilling || istype(W, /obj/item/reagent_containers/food/snacks/customizable) || istype(W, /obj/item/reagent_containers/food/snacks/pizzaslice/custom) || istype(W, /obj/item/reagent_containers/food/snacks/cakeslice/custom)) to_chat(user, "[src] can't be filled with [S]!") - return 0 + return FALSE if(contents.len >= 20) to_chat(user, "You can't add more ingredients to [src]!") - return 0 + return FALSE var/obj/item/reagent_containers/food/snacks/customizable/C = new custom_food_type(get_turf(src)) C.initialize_custom_food(src, S, user) - return 0 + return FALSE var/sharp = W.get_sharpness() if(sharp) if(slice(sharp, W, user)) - return 1 + return TRUE else ..() @@ -377,20 +377,20 @@ All foods are distributed among various categories. Use common sense. ..() if(W.w_class <= WEIGHT_CLASS_SMALL & !istype(W, /obj/item/reagent_containers/food/snacks)) //can't slip snacks inside, they're used for custom foods. if(W.get_sharpness()) - return 0 + return FALSE if(stored_item) - return 0 + return FALSE if(!iscarbon(user)) - return 0 + return FALSE if(contents.len >= 20) to_chat(user, "[src] is full.") - return 0 + return FALSE to_chat(user, "You slip [W] inside [src].") user.transferItemToLoc(W, src) add_fingerprint(user) contents += W stored_item = 1 - return 1 // no afterattack here + return TRUE // no afterattack here /obj/item/reagent_containers/food/snacks/MouseDrop(atom/over) var/turf/T = get_turf(src) diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index 9f36fc058f40..964b93245332 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -141,7 +141,7 @@ to_chat(user, "There is not enough ice cream left!") else to_chat(user, "[O] already has ice cream in it.") - return 1 + return TRUE if(istype(O, /obj/item/reagent_containers) && !(O.item_flags & ABSTRACT) && O.is_open_container()) . = TRUE //no afterattack var/obj/item/reagent_containers/B = O diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index ef2676fe83b4..6cd3a5d16157 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -82,11 +82,11 @@ user.visible_message("[user] put [O] into [src].", \ "You put [O] into [src].") user.transferItemToLoc(O, src, TRUE) - return 1 + return TRUE else if(user.a_intent != INTENT_HARM) to_chat(user, "That probably won't blend!") - return 1 + return TRUE else return ..() diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 4c199a9901d5..e7f33b9ad52f 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -26,7 +26,7 @@ var/i = findtext(name," ") return copytext(name, 1, i) -// Return 1 if this holiday should be celebrated today +// return TRUE if this holiday should be celebrated today /datum/holiday/proc/shouldCelebrate(dd, mm, yy, ww, ddd) if(always_celebrate) return TRUE @@ -319,11 +319,11 @@ if(mm == 9) if(yy/4 == round(yy/4)) //Note: Won't work right on September 12th, 2200 (at least it's a Friday!) if(dd == 12) - return 1 + return TRUE else if(dd == 13) - return 1 - return 0 + return TRUE + return FALSE /datum/holiday/programmers/getStationPrefix() return pick("span>","DEBUG: ","null","/list","EVENT PREFIX NOT FOUND") //Portability diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index d69b9da7687a..167974a1935f 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -56,7 +56,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars_by_type, typecacheof_assoc_list(list( // into the new area will not be moved. if(!A || !src) - return 0 + return FALSE var/list/turfs_src = get_area_turfs(src.type) var/list/turfs_trg = get_area_turfs(A.type) diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index 28e537acbc91..564c7e44a4ba 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -8,22 +8,22 @@ /mob/proc/bee_friendly() - return 0 + return FALSE /mob/living/simple_animal/hostile/poison/bees/bee_friendly() - return 1 + return TRUE /mob/living/carbon/human/bee_friendly() if(dna && dna.species && dna.species.id == "pod") //bees pollinate plants, duh. - return 1 + return TRUE if (wear_suit && head && istype(wear_suit, /obj/item/clothing) && istype(head, /obj/item/clothing)) var/obj/item/clothing/CS = wear_suit var/obj/item/clothing/CH = head if (CS.clothing_flags & CH.clothing_flags & THICKMATERIAL) - return 1 - return 0 + return TRUE + return FALSE /obj/structure/beebox diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 65d942ca2b6f..a338dd8db73e 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -53,8 +53,8 @@ if(reagents) if(bitesize_mod) bitesize = 1 + round(reagents.total_volume / bitesize_mod) - return 1 - return 0 + return TRUE + return FALSE /obj/item/reagent_containers/food/snacks/grown/examine(user) . = ..() diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm index 9bfdb2979c16..06c1aaf2eb81 100644 --- a/code/modules/hydroponics/grown/cereals.dm +++ b/code/modules/hydroponics/grown/cereals.dm @@ -105,4 +105,4 @@ var/obj/item/reagent_containers/food/snacks/meat/slab/meatwheat/M = new qdel(src) user.put_in_hands(M) - return 1 + return TRUE diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index 3c59deafdcd1..60e18a289455 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -45,8 +45,8 @@ /obj/item/grown/proc/add_juice() if(reagents) - return 1 - return 0 + return TRUE + return FALSE /obj/item/grown/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) //was it caught by a mob? diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 839e90c2df06..fe688426dc4f 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -475,7 +475,7 @@ if(!reagent_source.reagents.total_volume) to_chat(user, "[reagent_source] is empty.") - return 1 + return TRUE if(reagents.total_volume >= reagents.maximum_volume && !reagent_source.reagents.has_reagent(/datum/reagent/water, 1)) to_chat(user, "[src] is full.") @@ -520,11 +520,11 @@ qdel(reagent_source) lastuser = user H.update_icon() - return 1 + return TRUE H.update_icon() if(reagent_source) // If the source wasn't composted and destroyed reagent_source.update_icon() - return 1 + return TRUE else if(istype(O, /obj/item/seeds) && !istype(O, /obj/item/seeds/sample)) if(!myseed) diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index e0e15ac111ae..ecdc466a0c97 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -49,9 +49,9 @@ t_prod.forceMove(seedloc) t_amount++ qdel(O) - return 1 + return TRUE - return 0 + return FALSE /obj/machinery/seed_extractor diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 4b6f76574f30..174194a425be 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -202,7 +202,7 @@ /obj/item/electronic_assembly/Topic(href, href_list) if(..()) - return 1 + return TRUE if(href_list["ghostscan"]) if((isobserver(usr) && ckeys_allowed_to_scan[usr.ckey]) || IsAdminGhost(usr)) diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 547036f08a13..ad8ef4ab2157 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -697,11 +697,11 @@ if(isnum(new_code)) code = new_code if(!signal) - return 0 + return FALSE if(signal.data["code"] != code) - return 0 + return FALSE if(signal.source == src) // Don't trigger ourselves. - return 0 + return FALSE activate_pin(3) audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*", null, hearing_range) diff --git a/code/modules/integrated_electronics/subtypes/weaponized.dm b/code/modules/integrated_electronics/subtypes/weaponized.dm index 0458700f4407..a576ae123eb7 100644 --- a/code/modules/integrated_electronics/subtypes/weaponized.dm +++ b/code/modules/integrated_electronics/subtypes/weaponized.dm @@ -339,7 +339,7 @@ /obj/item/integrated_circuit/weaponized/proc/attempt_stun(var/mob/living/L,var/stunforce = 70) //Copied from stunbaton code. if(!L || !isliving(L)) - return 0 + return FALSE L.DefaultCombatKnockdown(stunforce) SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) @@ -352,4 +352,4 @@ var/mob/living/carbon/human/H = L H.forcesay(GLOB.hit_appends) - return 1 + return TRUE diff --git a/code/modules/jobs/job_exp.dm b/code/modules/jobs/job_exp.dm index d9b98eea0a21..8245563b7f79 100644 --- a/code/modules/jobs/job_exp.dm +++ b/code/modules/jobs/job_exp.dm @@ -4,24 +4,24 @@ GLOBAL_PROTECT(exp_to_update) // Procs /datum/job/proc/required_playtime_remaining(client/C) if(!C) - return 0 + return FALSE if(!CONFIG_GET(flag/use_exp_tracking)) - return 0 + return FALSE if(!SSdbcore.Connect()) - return 0 + return FALSE if(!exp_requirements || !exp_type) - return 0 + return FALSE if(!job_is_xp_locked(src.title)) - return 0 + return FALSE if(CONFIG_GET(flag/use_exp_restrictions_admin_bypass) && check_rights_for(C,R_ADMIN)) - return 0 + return FALSE var/isexempt = C.prefs.db_flags & DB_FLAG_EXEMPT if(isexempt) - return 0 + return FALSE var/my_exp = C.calc_exp_type(get_exp_req_type()) var/job_requirement = get_exp_req_amount() if(my_exp >= job_requirement) - return 0 + return FALSE else return (job_requirement - my_exp) diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 9a05f97cc745..a2752d33f0ea 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -210,15 +210,15 @@ /datum/job/proc/available_in_days(client/C) if(!C) - return 0 + return FALSE if(!CONFIG_GET(flag/use_age_restriction_for_jobs)) - return 0 + return FALSE if(!SSdbcore.Connect()) - return 0 //Without a database connection we can't get a player's age so we'll assume they're old enough for all jobs + return FALSE //Without a database connection we can't get a player's age so we'll assume they're old enough for all jobs if(C.prefs.db_flags & DB_FLAG_EXEMPT) - return 0 + return FALSE if(!isnum(minimal_player_age)) - return 0 + return FALSE return max(0, minimal_player_age - C.player_age) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 4f73b037c861..bd488230c486 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -574,7 +574,7 @@ if(istype(O, /obj/item/paper)) bind_book(user, O) else if(default_unfasten_wrench(user, O)) - return 1 + return TRUE else return ..() diff --git a/code/modules/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm index bd6bfdd177d2..8c1fbfcd5672 100644 --- a/code/modules/lighting/lighting_object.dm +++ b/code/modules/lighting/lighting_object.dm @@ -125,7 +125,7 @@ // Variety of overrides so the overlays don't get affected by weird things. /atom/movable/lighting_object/ex_act(severity, target, origin) - return 0 + return FALSE /atom/movable/lighting_object/singularity_act() return diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index fc9cd0336d93..f148fc441e18 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -62,7 +62,7 @@ // Used to get a scaled lumcount. /turf/proc/get_lumcount(var/minlum = 0, var/maxlum = 1) if(!lighting_object) - return 1 + return TRUE var/totallums = (lc_topright? (lc_topright.lum_r + lc_topright.lum_g + lc_topright.lum_b) : 0) \ + (lc_bottomright? (lc_bottomright.lum_r + lc_bottomright.lum_g + lc_bottomright.lum_b) : 0) \ diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index 18f816699cac..13744aa100dd 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -179,13 +179,13 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) if(isliving(A)) var/mob/living/L = A if(L.stat != DEAD) - return 1 + return TRUE for(var/thing in A.GetAllContents()) if(isliving(A)) var/mob/living/L = A if(L.stat != DEAD) - return 1 - return 0 + return TRUE + return FALSE /obj/effect/extraction_holder/singularity_pull() return diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index b9ab6463c7d4..398e070bb294 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -27,7 +27,7 @@ /obj/structure/flora/ash/proc/harvest(user) if(harvested) - return 0 + return FALSE var/rand_harvested = rand(harvest_amount_low, harvest_amount_high) if(rand_harvested) @@ -46,7 +46,7 @@ desc = harvested_desc harvested = TRUE addtimer(CALLBACK(src, .proc/regrow), rand(regrowth_time_low, regrowth_time_high)) - return 1 + return TRUE /obj/structure/flora/ash/proc/regrow() icon_state = base_icon diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index b627d4cb6988..514dab55f317 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -169,10 +169,10 @@ /mob/dead/new_player/Topic(href, href_list[]) if(src != usr) - return 0 + return FALSE if(!client) - return 0 + return FALSE //don't let people get to this unless they are specifically not verified if(href_list["Month"] && (CONFIG_GET(flag/age_verification) && !check_rights_for(client, R_ADMIN) && !(client.ckey in GLOB.bunker_passthrough))) @@ -727,7 +727,7 @@ src << browse(dat, "window=manifest;size=387x420;can_close=1") /mob/dead/new_player/Move() - return 0 + return FALSE /mob/dead/new_player/proc/close_spawn_windows() diff --git a/code/modules/mob/dead/new_player/poll.dm b/code/modules/mob/dead/new_player/poll.dm index 9b6e22bc23f0..6e26b0eb2cd0 100644 --- a/code/modules/mob/dead/new_player/poll.dm +++ b/code/modules/mob/dead/new_player/poll.dm @@ -461,7 +461,7 @@ return pollid = text2num(pollid) if (!pollid || pollid < 0) - return 0 + return FALSE //validate the poll is actually the right type of poll and its still active var/datum/db_query/query_validate_poll = SSdbcore.NewQuery({" SELECT id @@ -473,12 +473,12 @@ )) if(!query_validate_poll.warn_execute()) qdel(query_validate_poll) - return 0 + return FALSE if (!query_validate_poll.NextRow()) qdel(query_validate_poll) - return 0 + return FALSE qdel(query_validate_poll) - return 1 + return TRUE /** * Processes vote form data and saves results to the database for an IRV type poll. @@ -501,7 +501,7 @@ if(!QDELETED(client) && client.holder) admin_rank = client.holder.rank.name if (!vote_valid_check(pollid, client?.holder, POLLTYPE_IRV)) - return 0 + return FALSE var/list/special_columns = list( "datetime" = "NOW()", @@ -544,7 +544,7 @@ return //validate the poll if (!vote_valid_check(pollid, client.holder, POLLTYPE_OPTION)) - return 0 + return FALSE var/voted = poll_check_voted(pollid) if(isnull(voted) || voted) //Failed or already voted. return @@ -567,7 +567,7 @@ qdel(query_option_vote) if(!QDELETED(usr)) usr << browse(null,"window=playerpoll") - return 1 + return TRUE /mob/dead/new_player/proc/log_text_poll_reply(pollid, replytext) if(!SSdbcore.Connect()) @@ -581,7 +581,7 @@ return //validate the poll if (!vote_valid_check(pollid, client.holder, POLLTYPE_TEXT)) - return 0 + return FALSE if(!replytext) to_chat(usr, "The text you entered was blank. Please correct the text and submit again.") return @@ -611,7 +611,7 @@ qdel(query_text_vote) if(!QDELETED(usr)) usr << browse(null,"window=playerpoll") - return 1 + return TRUE /mob/dead/new_player/proc/vote_on_numval_poll(pollid, optionid, rating) if(!SSdbcore.Connect()) @@ -625,7 +625,7 @@ return //validate the poll if (!vote_valid_check(pollid, client.holder, POLLTYPE_RATING)) - return 0 + return FALSE var/datum/db_query/query_numval_hasvoted = SSdbcore.NewQuery({" SELECT id FROM [format_table_name("poll_vote")] @@ -655,7 +655,7 @@ qdel(query_numval_vote) if(!QDELETED(usr)) usr << browse(null,"window=playerpoll") - return 1 + return TRUE /** * Processes vote form data and saves results to the database for a multiple choice type poll. diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index ec6657a9568c..4ca574cc1b23 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -233,7 +233,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) var/g_val var/color_format = length(input_color) if(color_format != length_char(input_color)) - return 0 + return FALSE if(color_format == 3) r_val = hex2num(copytext(input_color, 1, 2)) * 16 g_val = hex2num(copytext(input_color, 2, 3)) * 16 @@ -243,7 +243,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) g_val = hex2num(copytext(input_color, 3, 5)) b_val = hex2num(copytext(input_color, 5, 7)) else - return 0 //If the color format is not 3 or 6, you're using an unexpected way to represent a color. + return FALSE //If the color format is not 3 or 6, you're using an unexpected way to represent a color. r_val += (255 - r_val) * 0.4 if(r_val > 255) @@ -693,32 +693,32 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/mob/living/target = input("Your new life begins today!", "Possess Mob", null, null) as null|anything in possessible if(!target) - return 0 + return FALSE if(ismegafauna(target)) to_chat(src, "This creature is too powerful for you to possess!") - return 0 + return FALSE if(can_reenter_corpse && mind && mind.current) if(alert(src, "Your soul is still tied to your former life as [mind.current.name], if you go forward there is no going back to that life. Are you sure you wish to continue?", "Move On", "Yes", "No") == "No") - return 0 + return FALSE if(target.key) to_chat(src, "Someone has taken this body while you were choosing!") - return 0 + return FALSE transfer_ckey(target, FALSE) target.AddElement(/datum/element/ghost_role_eligibility, penalize_on_ghost = FALSE, free_ghosting = TRUE) target.faction = list("neutral") - return 1 + return TRUE //this is a mob verb instead of atom for performance reasons //see /mob/verb/examinate() in mob.dm for more info //overridden here and in /mob/living for different point span classes and sanity checks /mob/dead/observer/pointed(atom/A as mob|obj|turf in fov_view()) if(!..()) - return 0 + return FALSE usr.visible_message("[src] points to [A].") - return 1 + return TRUE /mob/dead/observer/verb/view_manifest() set name = "View Crew Manifest" @@ -839,7 +839,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return IsAdminGhost(usr) /mob/dead/observer/is_literate() - return 1 + return TRUE /mob/dead/observer/vv_edit_var(var_name, var_value) . = ..() @@ -947,7 +947,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp // Ghosts have no momentum, being massless ectoplasm /mob/dead/observer/Process_Spacemove(movement_dir) - return 1 + return TRUE /mob/dead/observer/vv_edit_var(var_name, var_value) . = ..() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 79a0ccda77f2..0f90e27cecbf 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -379,7 +379,7 @@ //returns 0 if it cannot, 1 if successful /mob/proc/equip_to_appropriate_slot(obj/item/W, clothing_check = FALSE) if(!istype(W)) - return 0 + return FALSE var/slot_priority = W.slot_equipment_priority if(!slot_priority) @@ -396,9 +396,9 @@ for(var/slot in slot_priority) if(equip_to_slot_if_possible(W, slot, FALSE, TRUE, TRUE, FALSE, clothing_check)) //qdel_on_fail = 0; disable_warning = 1; redraw_mob = 1 - return 1 + return TRUE - return 0 + return FALSE /** * Used to return a list of equipped items on a mob; does not include held items (use get_all_gear) diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index 6f2f7094e65d..f13219cc2516 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -33,7 +33,7 @@ //entry when holding them // literally only an option for carbons though to_chat(C, "You may not hold items while blood crawling!") - return 0 + return FALSE var/obj/item/bloodcrawl/B1 = new(C) var/obj/item/bloodcrawl/B2 = new(C) B1.icon_state = "bloodhand_left" @@ -45,7 +45,7 @@ spawn(0) bloodpool_sink(B) src.mob_transforming = FALSE - return 1 + return TRUE /mob/living/proc/bloodpool_sink(obj/effect/decal/cleanable/B) var/turf/mobloc = get_turf(src.loc) @@ -89,7 +89,7 @@ var/success = bloodcrawl_consume(victim) if(!success) to_chat(src, "You happily devour... nothing? Your meal vanished at some point!") - return 1 + return TRUE /mob/living/proc/bloodcrawl_consume(mob/living/victim) to_chat(src, "You begin to feast on [victim]. You can not move while you are doing this.") @@ -161,7 +161,7 @@ /mob/living/proc/phasein(obj/effect/decal/cleanable/B) if(src.mob_transforming) to_chat(src, "Finish eating first!") - return 0 + return FALSE B.visible_message("[B] starts to bubble...") if(!do_after(src, 20, target = B)) return @@ -178,4 +178,4 @@ qdel(BC) qdel(src.holder) src.holder = null - return 1 + return TRUE diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index ca9edead4855..a6a74fe4de42 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -64,7 +64,7 @@ /mob/living/brain/can_be_revived() . = 1 if(!container || health <= HEALTH_THRESHOLD_DEAD) - return 0 + return FALSE /mob/living/brain/fully_replace_character_name(oldname,newname) ..() diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 1b7207d7eba8..df9876d7a1dc 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -93,7 +93,7 @@ clear_alert("alien_fire") /mob/living/carbon/alien/reagent_check(datum/reagent/R) //can metabolize all reagents - return 0 + return FALSE /mob/living/carbon/alien/IsAdvancedToolUser() return has_fine_manipulation @@ -136,7 +136,7 @@ Des: Removes all infected images from the alien. return /mob/living/carbon/alien/canBeHandcuffed() - return 1 + return TRUE /mob/living/carbon/alien/get_standard_pixel_y_offset(lying = 0) return initial(pixel_y) diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index 5081fd8a1498..7e38c26c8c3c 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -123,7 +123,7 @@ In all, this is a lot like the monkey code. /N adjustEarDamage(15,60) /mob/living/carbon/alien/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15) - return 0 + return FALSE /mob/living/carbon/alien/acid_act(acidpwr, acid_volume) return 0//aliens are immune to acid. diff --git a/code/modules/mob/living/carbon/alien/damage_procs.dm b/code/modules/mob/living/carbon/alien/damage_procs.dm index 1b165378161a..8f223e88c4cb 100644 --- a/code/modules/mob/living/carbon/alien/damage_procs.dm +++ b/code/modules/mob/living/carbon/alien/damage_procs.dm @@ -1,6 +1,6 @@ /mob/living/carbon/alien/getToxLoss(toxins_type = TOX_OMNI) - return 0 + return FALSE /mob/living/carbon/alien/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, toxins_type = TOX_DEFAULT) //alien immune to tox damage return FALSE diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 181850d541ec..ee8c27d1da50 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -32,7 +32,7 @@ Doesn't work on other aliens/AI.*/ return /obj/effect/proc_holder/alien/fire(mob/living/carbon/user) - return 1 + return TRUE /obj/effect/proc_holder/alien/get_panel_text() . = ..() @@ -72,10 +72,10 @@ Doesn't work on other aliens/AI.*/ /obj/effect/proc_holder/alien/plant/fire(mob/living/carbon/user) if(locate(/obj/structure/alien/weeds/node) in get_turf(user)) to_chat(user, "There's already a weed node here.") - return 0 + return FALSE user.visible_message("[user] has planted some alien weeds!") new/obj/structure/alien/weeds/node(user.loc) - return 1 + return TRUE /obj/effect/proc_holder/alien/whisper name = "Whisper" @@ -89,7 +89,7 @@ Doesn't work on other aliens/AI.*/ options += Ms var/mob/living/M = input("Select who to whisper to:","Whisper to?",null) as null|mob in options if(!M) - return 0 + return FALSE if(M.anti_magic_check(FALSE, FALSE, TRUE, 0)) to_chat(user, "As you try to communicate with [M], you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.") return FALSE @@ -108,8 +108,8 @@ Doesn't work on other aliens/AI.*/ var/follow_link_whispee = FOLLOW_LINK(ded, M) to_chat(ded, "[follow_link_user] [user] Alien Whisper --> [follow_link_whispee] [M] [msg]") else - return 0 - return 1 + return FALSE + return TRUE /obj/effect/proc_holder/alien/transfer name = "Transfer Plasma" @@ -124,7 +124,7 @@ Doesn't work on other aliens/AI.*/ aliens_around.Add(A) var/mob/living/carbon/M = input("Select who to transfer to:","Transfer plasma to?",null) as mob in aliens_around if(!M) - return 0 + return FALSE var/amount = input("Amount:", "Transfer Plasma to [M]") as num if (amount) amount = min(abs(round(amount)), user.getPlasma()) @@ -153,21 +153,21 @@ Doesn't work on other aliens/AI.*/ if(target in oview(1,user)) if(target.acid_act(200, 100)) user.visible_message("[user] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!") - return 1 + return TRUE else to_chat(user, "You cannot dissolve this object.") - return 0 + return FALSE else to_chat(src, "[target] is too far away.") - return 0 + return FALSE /obj/effect/proc_holder/alien/acid/fire(mob/living/carbon/alien/user) var/O = input("Select what to dissolve:","Dissolve",null) as obj|turf in oview(1,user) if(!O || user.incapacitated()) - return 0 + return FALSE else return corrode(O,user) @@ -320,21 +320,21 @@ Doesn't work on other aliens/AI.*/ /mob/living/carbon/proc/getPlasma() var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel) if(!vessel) - return 0 + return FALSE return vessel.storedPlasma /mob/living/carbon/proc/adjustPlasma(amount) var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel) if(!vessel) - return 0 + return FALSE vessel.storedPlasma = max(vessel.storedPlasma + amount,0) vessel.storedPlasma = min(vessel.storedPlasma, vessel.max_plasma) //upper limit of max_plasma, lower limit of 0 for(var/X in abilities) var/obj/effect/proc_holder/alien/APH = X if(APH.has_action) APH.action.UpdateButtons() - return 1 + return TRUE /mob/living/carbon/alien/adjustPlasma(amount) . = ..() @@ -343,6 +343,6 @@ Doesn't work on other aliens/AI.*/ /mob/living/carbon/proc/usePlasma(amount) if(getPlasma() >= amount) adjustPlasma(-amount) - return 1 + return TRUE - return 0 + return FALSE diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm index 3e8a5d8bdb72..ff8fae2b6286 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -27,18 +27,18 @@ var/obj/item/organ/alien/hivenode/node = user.getorgan(/obj/item/organ/alien/hivenode) if(!node) //Players are Murphy's Law. We may not expect there to ever be a living xeno with no hivenode, but they _WILL_ make it happen. to_chat(user, "Without the hivemind, you can't possibly hold the responsibility of leadership!") - return 0 + return FALSE if(node.recent_queen_death) to_chat(user, "Your thoughts are still too scattered to take up the position of leadership.") - return 0 + return FALSE if(!isturf(user.loc)) to_chat(user, "You can't evolve here!") - return 0 + return FALSE if(!get_alien_type(/mob/living/carbon/alien/humanoid/royal)) var/mob/living/carbon/alien/humanoid/royal/praetorian/new_xeno = new (user.loc) user.alien_evolve(new_xeno) - return 1 + return TRUE else to_chat(user, "We already have a living royal!") - return 0 + return FALSE diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm index 3e0faf44f0e7..183c17fa3ecb 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm @@ -29,14 +29,14 @@ var/obj/item/organ/alien/hivenode/node = user.getorgan(/obj/item/organ/alien/hivenode) if(!node) //Just in case this particular Praetorian gets violated and kept by the RD as a replacement for Lamarr. to_chat(user, "Without the hivemind, you would be unfit to rule as queen!") - return 0 + return FALSE if(node.recent_queen_death) to_chat(user, "You are still too burdened with guilt to evolve into a queen.") - return 0 + return FALSE if(!get_alien_type(/mob/living/carbon/alien/humanoid/royal/queen)) var/mob/living/carbon/alien/humanoid/royal/queen/new_xeno = new (user.loc) user.alien_evolve(new_xeno) - return 1 + return TRUE else to_chat(user, "We already have an alive queen.") - return 0 + return FALSE diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm index 8177360d4a14..c74527a1ab56 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm @@ -19,7 +19,7 @@ playsound(loc, "punch", 25, 1, -1) visible_message("[user] has [hitverb] [src]!", \ "[user] has [hitverb] [src]!", null, COMBAT_MESSAGE_RANGE) - return 1 + return TRUE /mob/living/carbon/alien/humanoid/on_attack_hand(mob/living/carbon/human/M) . = ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 7e1c669e49b1..a5ef90f28336 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -20,7 +20,7 @@ var/alt_inhands_file = 'icons/mob/alienqueen.dmi' /mob/living/carbon/alien/humanoid/royal/can_inject(mob/user, error_msg, target_zone, penetrate_thick = FALSE, bypass_immunity = FALSE) - return 0 + return FALSE /mob/living/carbon/alien/humanoid/royal/queen name = "alien queen" @@ -90,20 +90,20 @@ var/obj/item/queenpromote/prom if(get_alien_type(/mob/living/carbon/alien/humanoid/royal/praetorian/)) to_chat(user, "You already have a Praetorian!") - return 0 + return FALSE else for(prom in user) to_chat(user, "You discard [prom].") qdel(prom) - return 0 + return FALSE prom = new (user.loc) if(!user.put_in_active_hand(prom, 1)) to_chat(user, "You must empty your hands before preparing the parasite.") - return 0 + return FALSE else //Just in case telling the player only once is not enough! to_chat(user, "Use the royal parasite on one of your children to promote her to Praetorian!") - return 0 + return FALSE /obj/item/queenpromote name = "\improper royal parasite" diff --git a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm index 5832996a2cc6..e40bb96b6299 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm @@ -30,7 +30,7 @@ "[user] has pummeled [src]!", null, COMBAT_MESSAGE_RANGE) adjustBruteLoss(5 + rand(1,9)) new /datum/forced_movement(src, get_step_away(user,src, 30), 1) - return 1 + return TRUE /mob/living/carbon/alien/larva/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) if(!no_effect && !visual_effect_icon) diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index 7204759db567..567f52de546a 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -17,7 +17,7 @@ user.layer = MOB_LAYER user.visible_message("[user] slowly peeks up from the ground...", \ "You stop hiding.") - return 1 + return TRUE /obj/effect/proc_holder/alien/larva_evolve @@ -57,7 +57,7 @@ new_xeno = new /mob/living/carbon/alien/humanoid/drone(L.loc) L.alien_evolve(new_xeno) - return 0 + return FALSE else to_chat(user, "You are not fully grown.") - return 0 + return FALSE diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index b56c897b037b..f0abf405e982 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -9,7 +9,7 @@ if(!breath || (breath.total_moles() == 0)) //Aliens breathe in vaccuum - return 0 + return FALSE var/toxins_used = 0 var/tox_detect_threshold = 0.02 diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 7dedf5a739cc..56c1df68d8c9 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -97,12 +97,12 @@ /obj/item/clothing/mask/facehugger/on_found(mob/finder) if(stat == CONSCIOUS) return HasProximity(finder) - return 0 + return FALSE /obj/item/clothing/mask/facehugger/HasProximity(atom/movable/AM as mob|obj) if(CanHug(AM) && Adjacent(AM)) return Leap(AM) - return 0 + return FALSE /obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) if(!..()) @@ -256,7 +256,7 @@ return FALSE if(ismonkey(M)) - return 1 + return TRUE var/mob/living/carbon/C = M if(ishuman(C) && !(ITEM_SLOT_MASK in C.dna.species.no_equip)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 13481655dfa2..fba96230b167 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -227,7 +227,7 @@ . = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE)) /mob/living/carbon/proc/canBeHandcuffed() - return 0 + return FALSE /mob/living/carbon/Topic(href, href_list) ..() @@ -450,7 +450,7 @@ /mob/living/carbon/attack_ui(slot) if(!has_hand_for_held_index(active_hand_index)) - return 0 + return FALSE return ..() /mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, vomit_type = VOMIT_TOXIC, harm = TRUE, force = FALSE, purge_ratio = 0.1) @@ -891,7 +891,7 @@ /mob/living/carbon/can_be_revived() . = ..() if(!getorgan(/obj/item/organ/brain) && (!mind || !mind.has_antag_datum(/datum/antagonist/changeling))) - return 0 + return FALSE /mob/living/carbon/harvest(mob/living/user) if(QDELETED(src)) diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index e70b1bcc922b..a1ce8d2095b4 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -7,24 +7,24 @@ /mob/living/carbon/Process_Spacemove(movement_dir = 0) if(..()) - return 1 + return TRUE if(!isturf(loc)) - return 0 + return FALSE // Do we have a jetpack implant (and is it on)? var/obj/item/organ/cyberimp/chest/thrusters/T = getorganslot(ORGAN_SLOT_THRUSTERS) if(istype(T) && movement_dir && T.allow_thrust(0.01)) - return 1 + return TRUE var/obj/item/I = get_jetpack() if(istype(I, /obj/item/tank/jetpack)) var/obj/item/tank/jetpack/J = I if((movement_dir || J.stabilizers) && J.allow_thrust(0.01, src)) - return 1 + return TRUE else if(istype(I, /obj/item/mod/module/jetpack)) var/obj/item/mod/module/jetpack/J = I if((movement_dir || J.stabilizers) && J.allow_thrust()) - return 1 + return TRUE /mob/living/carbon/Moved() . = ..() diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index cd9cd5db4ce3..6b1b6e222e3d 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -13,7 +13,7 @@ /mob/living/carbon/regenerate_icons() if(mob_transforming) - return 1 + return TRUE update_inv_hands() update_inv_handcuffed() update_inv_legcuffed() diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 85c188d2ab6e..df0515196eaa 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -4,7 +4,7 @@ SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMAGE, damage, damagetype, def_zone) var/hit_percent = (100-blocked)/100 if(!forced && hit_percent <= 0) - return 0 + return FALSE var/obj/item/bodypart/BP = null if(!spread_damage) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b8d102a2f1bf..410fbea27966 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -478,17 +478,17 @@ return if(is_mouth_covered()) to_chat(src, "Remove your mask first!") - return 0 + return FALSE if(C.is_mouth_covered()) to_chat(src, "Remove [p_their()] mask first!") - return 0 + return FALSE if(C.cpr_time < world.time + 30) visible_message("[src] is trying to perform CPR on [C.name]!", \ "You try to perform CPR on [C.name]... Hold still!") if(!do_mob(src, C)) to_chat(src, "You fail to perform CPR on [C]!") - return 0 + return FALSE var/they_breathe = !HAS_TRAIT(C, TRAIT_NOBREATH) var/they_lung = C.getorganslot(ORGAN_SLOT_LUNGS) @@ -671,7 +671,7 @@ "You try to throw up, but there's nothing in your stomach!") if(stun) DefaultCombatKnockdown(200) - return 1 + return TRUE ..() /mob/living/carbon/human/vv_get_dropdown() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 7525cfd2169e..7c0e6f4db862 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -1,6 +1,6 @@ /mob/living/carbon/human/getarmor(def_zone, type) if(HAS_TRAIT(src, TRAIT_ARMOR_BROKEN)) //trait that makes it act as if you have no armor at all, you take natural damage from all sources - return 0 + return FALSE var/armorval = 0 var/organnum = 0 @@ -22,7 +22,7 @@ /mob/living/carbon/human/proc/checkarmor(obj/item/bodypart/def_zone, d_type) if(!d_type || !def_zone) - return 0 + return FALSE var/protection = 0 var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id, wear_neck) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor) for(var/bp in body_parts) @@ -93,7 +93,7 @@ /mob/living/carbon/human/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) if(!I || !user) - return 0 + return FALSE var/obj/item/bodypart/affecting if(user == src) @@ -125,7 +125,7 @@ "[user] [hulk_verb_continous] you!", null, COMBAT_MESSAGE_RANGE, null, user, "You [hulk_verb_simple] [src]!") apply_damage(15, BRUTE, wound_bonus=10) - return 1 + return TRUE /mob/living/carbon/human/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) . = ..() @@ -168,7 +168,7 @@ if(..()) //successful monkey bite, this handles disease contraction. var/damage = rand(1, 3) apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, MELEE)) - return 1 + return TRUE /mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M) . = ..() @@ -183,7 +183,7 @@ visible_message("[M] has lunged at [src]!", \ "[M] has lunged at you!", target = M, \ target_message = "You have lunged at [src]!") - return 0 + return FALSE var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) if(!affecting) affecting = get_bodypart(BODY_ZONE_CHEST) @@ -195,7 +195,7 @@ target_message = "You have slashed at [src]!") log_combat(M, src, "attacked") if(!dismembering_strike(M, M.zone_selected)) //Dismemberment successful - return 1 + return TRUE apply_damage(damage, BRUTE, affecting, armor_block) if(M.a_intent == INTENT_DISARM) //Always drop item in hand, if no item, get stun instead. @@ -252,7 +252,7 @@ var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) if(!dam_zone) //Dismemberment successful - return 1 + return TRUE var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) if(!affecting) @@ -529,7 +529,7 @@ for(var/obj/item/I in inventory_items_to_kill) I.acid_act(acidpwr, acid_volume) - return 1 + return TRUE /mob/living/carbon/human/singularity_act() var/gain = 20 diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 2c58da29c98f..8029ebdeab44 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -103,11 +103,11 @@ /mob/living/carbon/human/can_track(mob/living/user) if(wear_id && istype(wear_id.GetID(), /obj/item/card/id/syndicate)) - return 0 + return FALSE if(istype(head, /obj/item/clothing/head)) var/obj/item/clothing/head/hat = head if(hat.blockTracking) - return 0 + return FALSE return ..() diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 141fbb89d70f..4e9c58e1a467 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -11,14 +11,14 @@ /mob/living/carbon/human/slip(knockdown_amount, obj/O, lube) if(HAS_TRAIT(src, TRAIT_NOSLIPALL)) - return 0 + return FALSE if (!(lube & GALOSHES_DONT_HELP)) if(HAS_TRAIT(src, TRAIT_NOSLIPWATER)) - return 0 + return FALSE if(shoes && istype(shoes, /obj/item/clothing)) var/obj/item/clothing/CS = shoes if (CS.clothing_flags & NOSLIP) - return 0 + return FALSE if (lube & SLIDE_ICE) if(shoes && istype(shoes, /obj/item/clothing)) var/obj/item/clothing/CS = shoes @@ -32,7 +32,7 @@ if(shoes && istype(shoes, /obj/item/clothing)) var/obj/item/clothing/S = shoes if (S.clothing_flags & NOSLIP) - return 0 + return FALSE return ..() /mob/living/carbon/human/mob_has_gravity() diff --git a/code/modules/mob/living/carbon/human/innate_abilities/limb_regeneration.dm b/code/modules/mob/living/carbon/human/innate_abilities/limb_regeneration.dm index 6f3809c2328d..71b15bda2d5e 100644 --- a/code/modules/mob/living/carbon/human/innate_abilities/limb_regeneration.dm +++ b/code/modules/mob/living/carbon/human/innate_abilities/limb_regeneration.dm @@ -12,7 +12,7 @@ var/mob/living/carbon/human/H = owner var/list/limbs_to_heal = H.get_missing_limbs() if(limbs_to_heal.len < 1) - return 0 + return FALSE var/mode = H.get_ability_property(INNATE_ABILITY_LIMB_REGROWTH, PROPERTY_LIMB_REGROWTH_USAGE_TYPE) switch(mode) if(REGROWTH_USES_BLOOD) @@ -20,7 +20,7 @@ return TRUE else return FALSE - return 0 + return FALSE /datum/action/innate/ability/limb_regrowth/Activate() var/mob/living/carbon/human/H = owner diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 2dce987449bf..ace5cbaa6f15 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -282,9 +282,9 @@ else O = outfit if(!istype(O)) - return 0 + return FALSE if(!O) - return 0 + return FALSE return O.equip(src, visualsOnly, preference_source) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 4221df31f6b8..bd32a08d9aee 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -223,7 +223,7 @@ if(cold) //CITADEL EDIT Mandatory for vore code. if(istype(loc, /obj/item/dogborg/sleeper) || isbelly(loc) || ismob(loc)) - return 1 //freezing to death in sleepers ruins fun. + return TRUE //freezing to death in sleepers ruins fun. //END EDIT temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K. var/thermal_protection_flags = cold ? get_cold_protection_flags(temperature) : get_heat_protection_flags(temperature) @@ -254,7 +254,7 @@ if(missing_body_parts_flags & HAND_RIGHT) max_protection -= THERMAL_PROTECTION_HAND_RIGHT if(max_protection == 0) //Is it even a man if it doesn't have a body at all? Early return to avoid division by zero. - return 1 + return TRUE var/thermal_protection = 0 if(thermal_protection_flags) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 22cb10026b3d..7c4ba5e71987 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -84,7 +84,7 @@ ears.talk_into(src, message, message_mode, spans, language) return ITALICS | REDUCE_RANGE - return 0 + return FALSE /mob/living/carbon/human/get_alt_name() if(name != GetVoice()) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index bed766519fc5..ca9d5c3e9ee6 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -321,8 +321,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) //Please override this locally if you want to define when what species qualifies for what rank if human authority is enforced. /datum/species/proc/qualifies_for_rank(rank, list/features) //SPECIES JOB RESTRICTIONS //if(rank in GLOB.command_positions) Left as an example: The format qualifies for rank takes. - // return 0 //It returns false when it runs the proc so they don't get jobs from the global list. - return 1 //It returns 1 to say they are a-okay to continue. + // return FALSE //It returns false when it runs the proc so they don't get jobs from the global list. + return TRUE //It returns 1 to say they are a-okay to continue. /** * Corrects organs in a carbon, removing ones it doesn't need and adding ones it does. @@ -1589,7 +1589,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.throw_alert("nutrition", /atom/movable/screen/alert/starving) /datum/species/proc/update_health_hud(mob/living/carbon/human/H) - return 0 + return FALSE /datum/species/proc/handle_mutations_and_radiation(mob/living/carbon/human/H) . = FALSE @@ -1645,7 +1645,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) target.help_shake_act(user) if(target != user) log_combat(user, target, "shaked") - return 1 + return TRUE else var/we_breathe = !HAS_TRAIT(user, TRAIT_NOBREATH) var/we_lung = user.getorganslot(ORGAN_SLOT_LUNGS) @@ -1661,12 +1661,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(target.check_martial_melee_block()) target.visible_message("[target] blocks [user]'s grab attempt!", target = user, \ target_message = "[target] blocks your grab attempt!") - return 0 + return FALSE if(attacker_style && attacker_style.grab_act(user,target)) - return 1 + return TRUE else target.grabbedby(user) - return 1 + return TRUE /datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style, attackchain_flags = NONE) if(!attacker_style && HAS_TRAIT(user, TRAIT_PACIFISM)) @@ -1929,11 +1929,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(user != H) var/list/block_return = list() if(H.mob_run_block(I, totitemdamage, "the [I.name]", ((attackchain_flags & ATTACK_IS_PARRY_COUNTERATTACK)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, affecting.body_zone, block_return) & BLOCK_SUCCESS) - return 0 + return FALSE totitemdamage = block_calculate_resultant_damage(totitemdamage, block_return) if(H.check_martial_melee_block()) H.visible_message("[H] blocks [I]!") - return 0 + return FALSE var/hit_area @@ -1958,7 +1958,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) I.do_stagger_action(H, user, totitemdamage) if(!totitemdamage) - return 0 //item force is zero + return FALSE //item force is zero var/bloody = 0 if(((I.damtype == BRUTE) && I.force && prob(25 + (I.force * 2)))) @@ -2167,7 +2167,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/hit_percent = (100-(blocked+armor))/100 hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100 if(!forced && hit_percent <= 0) - return 0 + return FALSE var/obj/item/bodypart/BP = null if(!spread_damage) @@ -2224,7 +2224,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(BRAIN) var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.brain_mod H.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount) - return 1 + return TRUE /datum/species/proc/on_hit(obj/item/projectile/P, mob/living/carbon/human/H) // called when hit by a projectile diff --git a/code/modules/mob/living/carbon/human/species_types/arachnid.dm b/code/modules/mob/living/carbon/human/species_types/arachnid.dm index 819f3473537f..e2b32b5010be 100644 --- a/code/modules/mob/living/carbon/human/species_types/arachnid.dm +++ b/code/modules/mob/living/carbon/human/species_types/arachnid.dm @@ -43,7 +43,7 @@ /datum/species/arachnid/check_weakness(obj/item/weapon, mob/living/attacker) if(istype(weapon, /obj/item/melee/flyswatter)) return 9 //flyswatters deal 10x damage to arachnids - return 0 + return FALSE /datum/species/arachnid/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index 86720289fe16..fdd8434acc1a 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -37,4 +37,4 @@ /datum/species/fly/check_weakness(obj/item/weapon, mob/living/attacker) if(istype(weapon, /obj/item/melee/flyswatter)) return 29 //Flyswatters deal 30x damage to flypeople. - return 0 + return FALSE diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 60a7e945a323..b68199878ea1 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -421,7 +421,7 @@ I = AM var/mob/thrown_by = I.thrownby?.resolve() if(thrown_by == H) //No throwing stuff at yourself to trigger the teleport - return 0 + return FALSE else reactive_teleport(H) @@ -463,8 +463,8 @@ /datum/action/innate/unstable_teleport/IsAvailable(silent = FALSE) if(..()) if(world.time > last_teleport + cooldown) - return 1 - return 0 + return TRUE + return FALSE /datum/action/innate/unstable_teleport/Activate() var/mob/living/carbon/human/H = owner @@ -546,7 +546,7 @@ if(istype(AM, /obj/item)) I = AM if(I.thrownby == H) //No throwing stuff at yourself to make bananas - return 0 + return FALSE else new/obj/item/grown/bananapeel/specialpeel(get_turf(H)) last_banana = world.time diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index f88de43a3b23..a8fdd5e5742e 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -183,8 +183,8 @@ if(..()) var/mob/living/carbon/human/H = owner if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT) - return 1 - return 0 + return TRUE + return FALSE /datum/action/innate/split_body/Activate() var/mob/living/carbon/human/H = owner diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index 3b7ca3fa0a65..0235be3268f7 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -70,7 +70,7 @@ H.equipOutfit(O, visualsOnly) H.internal = H.get_item_for_held_index(2) H.update_internals_hud_icon(1) - return 0 + return FALSE /datum/species/plasmaman/random_name(gender,unique,lastname) if(unique) diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 812ae12955b7..5a29818ed406 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -129,7 +129,7 @@ return ..() /obj/item/organ/heart/nightmare/Stop() - return 0 + return FALSE /obj/item/organ/heart/nightmare/on_death() if(!owner) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 69423bcffe0f..9b2db8b106dd 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -156,7 +156,7 @@ failed_last_breath = 1 throw_alert("not_enough_oxy", /atom/movable/screen/alert/not_enough_oxy) - return 0 + return FALSE var/safe_oxy_min = 16 var/safe_oxy_max = 50 @@ -312,7 +312,7 @@ //BREATH TEMPERATURE handle_breath_temperature(breath) - return 1 + return TRUE //Fourth and final link in a breath chain /mob/living/carbon/proc/handle_breath_temperature(datum/gas_mixture/breath) @@ -660,7 +660,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put //used in human and monkey handle_environment() /mob/living/carbon/proc/natural_bodytemperature_stabilization() if(HAS_TRAIT(src, TRAIT_COLDBLOODED) || HAS_TRAIT(src, TRAIT_ROBOTIC_ORGANISM)) - return 0 //Return 0 as your natural temperature. Species proc handle_environment() will adjust your temperature based on this. + return FALSE //return FALSE as your natural temperature. Species proc handle_environment() will adjust your temperature based on this. var/body_temperature_difference = BODYTEMP_NORMAL - bodytemperature switch(bodytemperature) @@ -675,7 +675,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put /mob/living/carbon/proc/get_cooling_efficiency() if(!HAS_TRAIT(src, TRAIT_ROBOTIC_ORGANISM)) - return 1 + return TRUE var/integration_bonus = min(blood_volume * SYNTH_INTEGRATION_COOLANT_CAP, integrating_blood * SYNTH_INTEGRATION_COOLANT_PENALTY) //Integration blood somewhat helps, though only at 40% impact and to a cap of 25% of current blood level. var/blood_effective_volume = blood_volume + integration_bonus @@ -691,7 +691,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put return suitlink //If you are wearing full EVA or lavaland hazard gear (on lavaland), assume it has been made to accomodate your cooling needs. var/datum/gas_mixture/environment = loc.return_air() if(!environment) - return 0 + return FALSE var/pressure = environment.return_pressure() var/heat = environment.return_temperature() @@ -711,18 +711,18 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put var/turf/T = get_turf(src) if(istype(head_item, /obj/item/clothing/head/helmet/space) && istype(suit_item, /obj/item/clothing/suit/space)) - return 1 + return TRUE if(istype(head_item, /obj/item/clothing/head/mod) && istype(suit_item, /obj/item/clothing/suit/mod)) var/obj/item/clothing/suit/mod/modsuit = suit_item var/obj/item/mod/control/mod_control = modsuit.mod if(mod_control && mod_control.active) - return 1 + return TRUE if(T && is_mining_level(T.z) && istype(head_item, /obj/item/clothing/head/hooded/explorer) && istype(suit_item, /obj/item/clothing/suit/hooded/explorer)) - return 1 + return TRUE - return 0 + return FALSE ///////// //LIVER// diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index 2640c642ddeb..700d7a5315cc 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -27,7 +27,7 @@ // taken from /mob/living/carbon/human/interactive/ /mob/living/carbon/monkey/proc/walk2derpless(target) if(!target || IsStandingStill()) - return 0 + return FALSE if(myPath.len <= 0) myPath = get_path_to(src, target, 250, 1) @@ -39,14 +39,14 @@ if(myPath.len >= 1) walk_to(src,myPath[1],0,5) myPath -= myPath[1] - return 1 + return TRUE // failed to path correctly so just try to head straight for a bit walk_to(src,get_turf(target),0,5) sleep(1) walk_to(src,0) - return 0 + return FALSE // taken from /mob/living/carbon/human/interactive/ /mob/living/carbon/monkey/proc/IsDeadOrIncap(checkDead = TRUE) diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index a7bc0c11d544..e9afb6eef910 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -137,7 +137,7 @@ /mob/living/carbon/monkey/has_smoke_protection() if(wear_mask) if(wear_mask.clothing_flags & BLOCK_GAS_SMOKE_EFFECT) - return 1 + return TRUE /mob/living/carbon/monkey/handle_fire() . = ..() diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index bb35ff082bf5..4cdf1f1aebb7 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -171,8 +171,8 @@ GLOBAL_LIST_INIT(strippable_monkey_items, create_strippable_list(list( /mob/living/carbon/monkey/IsVocal() if(!getorganslot(ORGAN_SLOT_LUNGS)) - return 0 - return 1 + return FALSE + return TRUE /mob/living/carbon/monkey/can_use_guns(obj/item/G) return TRUE diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm index 80d968b229d0..f0796e2c54dc 100644 --- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm +++ b/code/modules/mob/living/carbon/monkey/monkey_defense.dm @@ -114,7 +114,7 @@ if(!affecting) affecting = get_bodypart(BODY_ZONE_CHEST) if(!dismembering_strike(M, affecting.body_zone)) //Dismemberment successful - return 1 + return TRUE apply_damage(damage, BRUTE, affecting) else @@ -159,7 +159,7 @@ damage = rand(20, 40) var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) if(!dam_zone) //Dismemberment successful - return 1 + return TRUE var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) if(!affecting) affecting = get_bodypart(BODY_ZONE_CHEST) diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index 67c29b421108..9838d6f9b938 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -9,9 +9,9 @@ /mob/living/carbon/can_speak_vocal(message) if(silent) - return 0 + return FALSE if(get_selected_language() == /datum/language/signlanguage && handcuffed) - return 0 + return FALSE return ..() /mob/living/carbon/could_speak_language(datum/language/language) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index fcb0ffcefa1b..76e620b20498 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -17,7 +17,7 @@ /mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE) var/hit_percent = (100-blocked)/100 if(!damage || (hit_percent <= 0)) - return 0 + return FALSE var/damage_amount = forced ? damage : damage * hit_percent switch(damagetype) if(BRUTE) @@ -32,7 +32,7 @@ adjustCloneLoss(damage_amount, forced = forced) if(STAMINA) adjustStaminaLoss(damage_amount, forced = forced) - return 1 + return TRUE /mob/living/proc/apply_damage_type(damage = 0, damagetype = BRUTE) //like apply damage except it always uses the damage procs switch(damagetype) @@ -67,7 +67,7 @@ /mob/living/proc/apply_damages(brute = 0, burn = 0, tox = 0, oxy = 0, clone = 0, def_zone = null, blocked = FALSE, stamina = 0, brain = 0) if(blocked >= 100) - return 0 + return FALSE if(brute) apply_damage(brute, BRUTE, def_zone, blocked) if(burn) @@ -82,12 +82,12 @@ apply_damage(stamina, STAMINA, def_zone, blocked) if(brain) apply_damage(brain, BRAIN, def_zone, blocked) - return 1 + return TRUE /mob/living/proc/apply_effect(effect = 0,effecttype = EFFECT_STUN, blocked = FALSE, knockdown_stamoverride, knockdown_stammax) var/hit_percent = (100-blocked)/100 if(!effect || (hit_percent <= 0)) - return 0 + return FALSE switch(effecttype) if(EFFECT_STUN) Stun(effect * hit_percent) @@ -109,7 +109,7 @@ if(EFFECT_JITTER) if((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) jitteriness = max(jitteriness,(effect * hit_percent)) - return 1 + return TRUE /mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = 0, stamina = 0, jitter = 0, kd_stamoverride, kd_stammax) @@ -163,7 +163,7 @@ /mob/living/proc/setOxyLoss(amount, updating_health = TRUE, forced = FALSE) if(status_flags & GODMODE) - return 0 + return FALSE oxyloss = amount if(updating_health) updatehealth() @@ -179,7 +179,7 @@ affected_by = TOX_SYSCORRUPT if(toxins_type != affected_by) - return 0 + return FALSE else return toxloss diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index f4f8060fb396..af911bd2a4e3 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -133,7 +133,7 @@ if(fire_stacks < 0) //If we've doused ourselves in water to avoid fire, dry off slowly fire_stacks = min(0, fire_stacks + 1)//So we dry ourselves back to default, nonflammable. if(!on_fire) - return 1 + return TRUE if(fire_stacks > 0) adjust_fire_stacks(-0.1) //the fire is slowly consumed else diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index d8a8d5c47110..cd2bc3b38bf3 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -243,7 +243,7 @@ // If there's no dir_to_target then the player is on the same turf as the atom they're trying to push. // This can happen when a player is stood on the same turf as a directional window. All attempts to push - // the window will fail as get_dir will return 0 and the player will be unable to move the window when + // the window will fail as get_dir will return FALSE and the player will be unable to move the window when // it should be pushable. // In this scenario, we will use the facing direction of the /mob/living attempting to push the atom as // a fallback. @@ -683,7 +683,7 @@ /mob/living/proc/can_be_revived() . = 1 if(health <= HEALTH_THRESHOLD_DEAD) - return 0 + return FALSE /mob/living/proc/update_damage_overlays() return @@ -1051,27 +1051,27 @@ //basic fast checks go first. When overriding this proc, I recommend calling ..() at the end. var/turf/T = get_turf(src) if(!T) - return 0 + return FALSE if(is_centcom_level(T.z)) //dont detect mobs on centcom - return 0 + return FALSE if(is_away_level(T.z)) - return 0 + return FALSE if(user != null && src == user) - return 0 + return FALSE if(invisibility || alpha == 0)//cloaked - return 0 + return FALSE if(digitalcamo || digitalinvis) - return 0 + return FALSE // Now, are they viewable by a camera? (This is last because it's the most intensive check) if(!near_camera(src)) - return 0 + return FALSE - return 1 + return TRUE //used in datum/reagents/reaction() proc /mob/living/proc/get_permeability_protection(list/target_zones) - return 0 + return FALSE /mob/living/proc/harvest(mob/living/user) //used for extra objects etc. in butchering return @@ -1120,7 +1120,7 @@ /mob/living/proc/check_weakness(obj/item/weapon, mob/living/attacker) if(mind && mind.has_antag_datum(/datum/antagonist/devil)) return check_devil_bane_multiplier(weapon, attacker) - return 1 + return TRUE /mob/living/proc/check_acedia() if(mind && mind.has_objective(/datum/objective/sintouched/acedia)) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index cd46072921a3..e984367d8bb4 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -20,15 +20,15 @@ /mob/living/proc/getarmor(def_zone, type) - return 0 + return FALSE //this returns the mob's protection against eye damage (number between -1 and 2) from bright lights /mob/living/proc/get_eye_protection() - return 0 + return FALSE //this returns the mob's protection against ear damage (0:no protection; 1: some ear protection; 2: has no ears) /mob/living/proc/get_ear_protection() - return 0 + return FALSE /mob/living/proc/is_mouth_covered(head_only = 0, mask_only = 0) return FALSE @@ -96,7 +96,7 @@ return P.on_hit(src, final_percent, def_zone) ? BULLET_ACT_HIT : BULLET_ACT_BLOCK /mob/living/proc/check_projectile_dismemberment(obj/item/projectile/P, def_zone) - return 0 + return FALSE /obj/item/proc/get_volume_by_throwforce_and_or_w_class() if(throwforce && w_class) @@ -104,7 +104,7 @@ else if(w_class) return clamp(w_class * 8, 20, 100) // Multiply the item's weight class by 8, then clamp the value between 20 and 100 else - return 0 + return FALSE /mob/living/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) if(!isitem(AM)) @@ -202,11 +202,11 @@ if(GRAB_NECK) log_combat(user, src, "attempted to strangle", addition="kill grab") if(!do_mob(user, src, grab_upgrade_time)) - return 0 + return FALSE if(!user.pulling || user.pulling != src || user.grab_state != old_grab_state || user.a_intent != INTENT_GRAB) - return 0 + return FALSE if(user.voremode && user.grab_state == GRAB_AGGRESSIVE) - return 0 + return FALSE user.setGrabState(user.grab_state + 1) switch(user.grab_state) if(GRAB_AGGRESSIVE) @@ -240,7 +240,7 @@ if(!buckled && !density) Move(user.loc) user.set_pull_offsets(src, grab_state) - return 1 + return TRUE /mob/living/on_attack_hand(mob/user, act_intent = user.a_intent, attackchain_flags) ..() //Ignoring parent return value here. @@ -302,7 +302,7 @@ M.visible_message("\The [M] [M.friendly_verb_continuous] [src]!", "You [M.friendly_verb_simple] [src]!", target = src, target_message = "\The [M] [M.friendly_verb_continuous] you!") - return 0 + return FALSE else if(HAS_TRAIT(M, TRAIT_PACIFISM)) to_chat(M, "You don't want to hurt anyone!") @@ -310,7 +310,7 @@ var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) var/list/return_list = list() if(mob_run_block(M, damage, "the [M.name]", ATTACK_TYPE_MELEE, M.armour_penetration, M, check_zone(M.zone_selected), return_list) & BLOCK_SUCCESS) - return 0 + return FALSE damage = block_calculate_resultant_damage(damage, return_list) if(M.attack_sound) playsound(src, M.attack_sound, 50, 1, 1) @@ -418,7 +418,7 @@ /mob/living/acid_act(acidpwr, acid_volume) take_bodypart_damage(acidpwr * min(1, acid_volume * 0.1)) - return 1 + return TRUE ///As the name suggests, this should be called to apply electric shocks. /mob/living/proc/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) @@ -518,7 +518,7 @@ //called when the mob receives a loud bang /mob/living/proc/soundbang_act() - return 0 + return FALSE //to damage the clothes worn by a mob /mob/living/proc/damage_clothes(damage_amount, damage_type = BRUTE, damage_flag = 0, def_zone) diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index fcab9344d992..a09ecb0b54c0 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -81,7 +81,7 @@ if (!buckled.anchored) return buckled.Move(newloc, direct) else - return 0 + return FALSE var/old_direction = dir var/turf/T = loc diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 02a3e3684edf..439bd377f653 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -208,7 +208,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(radio_return & REDUCE_RANGE) message_range = 1 if(radio_return & NOPASS) - return 1 + return TRUE //No screams in space, unless you're next to someone. var/turf/T = get_turf(src) @@ -226,7 +226,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( succumb() to_chat(src, compose_message(src, language, message, null, spans, message_mode)) - return 1 + return TRUE /mob/living/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, face_name = FALSE, atom/movable/source) . = ..() @@ -358,23 +358,23 @@ GLOBAL_LIST_INIT(department_radio_keys, list( /mob/living/can_speak(message) //For use outside of Say() if(can_speak_basic(message) && can_speak_vocal(message)) - return 1 + return TRUE /mob/living/proc/can_speak_basic(message, ignore_spam = FALSE) //Check BEFORE handling of xeno and ling channels if(client) if(client.prefs.muted & MUTE_IC) to_chat(src, "You cannot speak in IC (muted).") - return 0 + return FALSE if(!ignore_spam && client.handle_spam_prevention(message,MUTE_IC)) - return 0 + return FALSE - return 1 + return TRUE /mob/living/proc/can_speak_vocal(message) //Check AFTER handling of xeno and ling channels var/obj/item/bodypart/leftarm = get_bodypart(BODY_ZONE_L_ARM) var/obj/item/bodypart/rightarm = get_bodypart(BODY_ZONE_R_ARM) if(HAS_TRAIT(src, TRAIT_MUTE) && get_selected_language() != /datum/language/signlanguage) - return 0 + return FALSE if (get_selected_language() == /datum/language/signlanguage) var/left_disabled = FALSE @@ -390,15 +390,15 @@ GLOBAL_LIST_INIT(department_radio_keys, list( else right_disabled = TRUE if (left_disabled && right_disabled) // We want this to only return false if both arms are either missing or disabled since you could technically sign one-handed. - return 0 + return FALSE if(is_muzzled()) - return 0 + return FALSE if(!IsVocal()) - return 0 + return FALSE - return 1 + return TRUE /mob/living/proc/get_key(message) var/key = message[1] @@ -468,9 +468,9 @@ GLOBAL_LIST_INIT(department_radio_keys, list( return ITALICS | REDUCE_RANGE if(MODE_BINARY) - return ITALICS | REDUCE_RANGE //Does not return 0 since this is only reached by humans, not borgs or AIs. + return ITALICS | REDUCE_RANGE //Does not return FALSE since this is only reached by humans, not borgs or AIs. - return 0 + return FALSE /mob/living/say_mod(input, message_mode) . = ..() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 0db472bb9d1f..64b17b26225b 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -618,7 +618,7 @@ queueAlarm(text("--- [] alarm detected in []! (No Camera)", class, home.name), class) if (viewalerts) ai_alerts() - return 1 + return TRUE /mob/living/silicon/ai/freeCamera(area/home, obj/machinery/camera/cam) for(var/class in alarms) @@ -906,7 +906,7 @@ to_chat(user, "Transfer successful: [name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory.") /mob/living/silicon/ai/can_buckle() - return 0 + return FALSE /mob/living/silicon/ai/incapacitated(ignore_restraints, ignore_grab) if(aiRestorePowerRoutine) diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index 17d4e9d129b4..6cf3d5a68ae3 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -12,8 +12,8 @@ if (stat != DEAD) adjustBruteLoss(60) updatehealth() - return 1 - return 0 + return TRUE + return FALSE /mob/living/silicon/ai/emp_act(severity) . = ..() diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index a3ffd460dd67..4a60c9396086 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -177,8 +177,8 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) if(chunk.changed) chunk.hasChanged(1) // Update now, no matter if it's visible or not. if(chunk.visibleTurfs[position]) - return 1 - return 0 + return TRUE + return FALSE /datum/cameranet/proc/stat_entry() if(!statclick) diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index bce18462b2ae..be1ac47abdf1 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -115,7 +115,7 @@ return TRUE /mob/camera/aiEye/Move() - return 0 + return FALSE /mob/camera/aiEye/proc/GetViewerClient() if(ai) diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index 76eaa6ad0d54..e23eb842ea92 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -187,8 +187,8 @@ SEND_SOUND(M, voice) else SEND_SOUND(only_listener, voice) - return 1 - return 0 + return TRUE + return FALSE #undef VOX_DELAY #endif diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm index b50aeb5f488b..bff842cd0415 100644 --- a/code/modules/mob/living/silicon/damage_procs.dm +++ b/code/modules/mob/living/silicon/damage_procs.dm @@ -2,14 +2,14 @@ /mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE) var/hit_percent = (100-blocked)/100 if(!damage || (!forced && hit_percent <= 0)) - return 0 + return FALSE var/damage_amount = forced ? damage : damage * hit_percent switch(damagetype) if(BRUTE) adjustBruteLoss(damage_amount, forced = forced) if(BURN) adjustFireLoss(damage_amount, forced = forced) - return 1 + return TRUE /mob/living/silicon/apply_effect(effect = 0,effecttype = EFFECT_STUN, blocked = FALSE) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 435d1853f68e..fb5b3ecb4caa 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -230,7 +230,7 @@ /datum/action/innate/pai/Trigger() if(!ispAI(owner)) - return 0 + return FALSE P = owner /datum/action/innate/pai/software diff --git a/code/modules/mob/living/silicon/pai/personality.dm b/code/modules/mob/living/silicon/pai/personality.dm index 62f2ed70471b..2225485da0b9 100644 --- a/code/modules/mob/living/silicon/pai/personality.dm +++ b/code/modules/mob/living/silicon/pai/personality.dm @@ -12,7 +12,7 @@ /datum/paiCandidate/proc/savefile_save(mob/user) if(IsGuestKey(user.key)) - return 0 + return FALSE var/savefile/F = new /savefile(src.savefile_path(user)) @@ -24,7 +24,7 @@ WRITE_FILE(F["version"], 1) - return 1 + return TRUE // loads the savefile corresponding to the mob's ckey // if silent=true, report incompatible savefiles @@ -33,12 +33,12 @@ /datum/paiCandidate/proc/savefile_load(mob/user, silent = TRUE) if (IsGuestKey(user.key)) - return 0 + return FALSE var/path = savefile_path(user) if (!fexists(path)) - return 0 + return FALSE var/savefile/F = new /savefile(path) @@ -52,10 +52,10 @@ fdel(path) if (!silent) alert(user, "Your savefile was incompatible with this version and was deleted.") - return 0 + return FALSE F["name"] >> src.name F["description"] >> src.description F["role"] >> src.role F["comments"] >> src.comments - return 1 + return TRUE diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 04665401c5e9..ad7bc79278cb 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -206,12 +206,12 @@ var/count = 0 while(!isliving(M)) if(!M || !M.loc) - return 0 //For a runtime where M ends up in nullspace (similar to bluespace but less colourful) + return FALSE //For a runtime where M ends up in nullspace (similar to bluespace but less colourful) M = M.loc count++ if(count >= 6) to_chat(src, "You are not being carried by anyone!") - return 0 + return FALSE spawn CheckDNA(M, src) if("pdamessage") diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 559ffbbc08fa..146088f6e2f4 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -351,7 +351,7 @@ if(module_active) return held_items.Find(module_active) - return 0 + return FALSE /** * Selects the module in the slot module_num. diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 264bcc4404e4..5c2d3d2c3368 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -271,7 +271,7 @@ if(source.z != z) return if(stat == DEAD) - return 1 + return TRUE var/list/our_sort = alarms[class] for(var/areaname in our_sort) if (areaname == home.name) @@ -279,7 +279,7 @@ var/list/sources = alarm[3] if (!(source in sources)) sources += source - return 1 + return TRUE var/obj/machinery/camera/cam = null var/list/our_cams = null @@ -979,7 +979,7 @@ ionpulse = FALSE revert_shell() - return 1 + return TRUE /mob/living/silicon/robot/proc/has_module() if(!module || module.type == /obj/item/robot_module) @@ -1302,7 +1302,7 @@ switch(choice) if("Resting") update_icons() - return 0 + return FALSE if("Sitting") sitting = 1 if("Belly up") diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 4459bd44130f..7d3427a91629 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -1128,10 +1128,10 @@ if (energy >= amount) energy -= amount if (energy == 0) - return 1 + return TRUE return 2 else - return 0 + return FALSE /datum/robot_energy_storage/proc/add_charge(amount) energy = min(energy + amount, max_energy) diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index 23500688aeaf..538f3c513f38 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -1,6 +1,6 @@ /mob/living/silicon/robot/Process_Spacemove(movement_dir = 0) if(ionpulse()) - return 1 + return TRUE return ..() /mob/living/silicon/robot/mob_negates_gravity() diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index fbc1eb4eb969..298f5d5e00ff 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -24,10 +24,10 @@ to_chat(M, "[link] [rendered]") /mob/living/silicon/binarycheck() - return 1 + return TRUE /mob/living/silicon/lingcheck() - return 0 //Borged or AI'd lings can't speak on the ling channel. + return FALSE //Borged or AI'd lings can't speak on the ling channel. /mob/living/silicon/radio(message, message_mode, list/spans, language) . = ..() @@ -44,7 +44,7 @@ radio.talk_into(src, message, message_mode, spans, language) return ITALICS | REDUCE_RANGE - return 0 + return FALSE /mob/living/silicon/get_message_mode(message) . = ..() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 347c71673e39..f58b27a5370f 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -364,12 +364,12 @@ to_chat(src, "Automatic announcements [Autochan == "None" ? "will not use the radio." : "set to [Autochan]."]") /mob/living/silicon/put_in_hand_check() // This check is for borgs being able to receive items, not put them in others' hands. - return 0 + return FALSE // The src mob is trying to place an item on someone // But the src mob is a silicon!! Disable. /mob/living/silicon/stripPanelEquip(obj/item/what, mob/who, slot) - return 0 + return FALSE /mob/living/silicon/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //Secbots won't hunt silicon units @@ -434,7 +434,7 @@ return ..() /mob/living/silicon/is_literate() - return 1 + return TRUE /mob/living/silicon/get_inactive_held_item() return FALSE diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index e1a179ea525e..771eeca2ce58 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -95,7 +95,7 @@ for(var/mob/living/M in buckled_mobs) unbuckle_mob(M) M.electrocute_act(shock_damage/100, source, siemens_coeff, flags) //Hard metal shell conducts! - return 0 //So borgs they don't die trying to fix wiring + return FALSE //So borgs they don't die trying to fix wiring /mob/living/silicon/emp_act(severity) . = ..() diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index e605ffde31b8..05ee1554db2f 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -57,7 +57,7 @@ if(.) //successful larva bite var/damage = rand(1, 3) attack_threshold_check(damage) - return 1 + return TRUE if (M.a_intent == INTENT_HELP) if (health > 0) visible_message("[M.name] [response_help_continuous] [src].", \ diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index c3ae3898ddc8..864e42d1e141 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -349,8 +349,8 @@ /mob/living/simple_animal/bot/ed209/proc/check_for_weapons(var/obj/item/slot_item) if(slot_item && (slot_item.item_flags & NEEDS_PERMIT)) - return 1 - return 0 + return TRUE + return FALSE /mob/living/simple_animal/bot/ed209/explode() walk_to(src,0) diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index 8cd1cd519d28..683a06fab0c4 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -284,9 +284,9 @@ /mob/living/simple_animal/bot/floorbot/proc/is_hull_breach(turf/t) //Ignore space tiles not considered part of a structure, also ignores shuttle docking areas. var/area/t_area = get_area(t) if(t_area && (t_area.name == "Space" || findtext(t_area.name, "huttle"))) - return 0 + return FALSE else - return 1 + return TRUE //Floorbots, having several functions, need sort out special conditions here. /mob/living/simple_animal/bot/floorbot/process_scan(scan_target) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 5f6c7a8bb2bf..4539c594a151 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -279,17 +279,17 @@ if(isconstruct(A)) //is it a construct? var/mob/living/simple_animal/hostile/construct/C = A if(C.health < C.maxHealth) //is it hurt? let's go heal it if it is - return 1 + return TRUE else - return 0 + return FALSE else - return 0 + return FALSE /mob/living/simple_animal/hostile/construct/builder/CanAttack(atom/the_target) if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it - return 0 + return FALSE if(Found(the_target) || ..()) //If we Found it or Can_Attack it normally, we Can_Attack it as long as it wasn't invisible - return 1 //as a note this shouldn't be added to base hostile mobs because it'll mess up retaliate hostile mobs + return TRUE //as a note this shouldn't be added to base hostile mobs because it'll mess up retaliate hostile mobs /mob/living/simple_animal/hostile/construct/builder/MoveToTarget(var/list/possible_targets) ..() @@ -297,7 +297,7 @@ var/mob/living/L = target if(isconstruct(L) && L.health >= L.maxHealth) //is this target an unhurt construct? stop trying to heal it LoseTarget() - return 0 + return FALSE if(L.health <= melee_damage_lower+melee_damage_upper) //ey bucko you're hurt as fuck let's go hit you retreat_distance = null minimum_distance = 1 diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index e4d042a4cc26..08612ccc7f1b 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -670,7 +670,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list( vocal_pitch = 0.6 /mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0) - return 1 //Void puppies can navigate space. + return TRUE //Void puppies can navigate space. //LISA! SQUEEEEEEEEE~ diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 6b524f61146b..bb638ea1047f 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -276,7 +276,7 @@ return ..() /mob/living/simple_animal/drone/mob_negates_gravity() - return 1 + return TRUE /mob/living/simple_animal/drone/mob_has_gravity() return ..() || mob_negates_gravity() @@ -286,10 +286,10 @@ /mob/living/simple_animal/drone/bee_friendly() // Why would bees pay attention to drones? - return 1 + return TRUE /mob/living/simple_animal/drone/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) - return 0 //So they don't die trying to fix wiring + return FALSE //So they don't die trying to fix wiring /mob/living/simple_animal/drone/can_see_reagents() . = ..() diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index 4acbd41977f8..e983335a22a0 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -176,7 +176,7 @@ /mob/living/simple_animal/drone/cogscarab/get_armor_effectiveness() if(GLOB.ratvar_awakens) - return 1 + return TRUE return ..() /mob/living/simple_animal/drone/cogscarab/triggerAlarm(class, area/A, O, obj/alarmsource) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index b7545de5172e..7cd3919490b1 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -85,7 +85,7 @@ return (armorval * get_armor_effectiveness()) //armor is reduced for tiny fragile drones /mob/living/simple_animal/drone/proc/get_armor_effectiveness() - return 0 //multiplier for whatever head armor you wear as a drone + return FALSE //multiplier for whatever head armor you wear as a drone /mob/living/simple_animal/drone/proc/update_drone_hack(hack, clockwork) if(!istype(src) || !mind) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm index 4c112858daa6..c956e19a857a 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm @@ -15,22 +15,22 @@ if(I == internal_storage) internal_storage = null update_inv_internal_storage() - return 1 - return 0 + return TRUE + return FALSE /mob/living/simple_animal/drone/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, clothing_check = FALSE, list/return_warning) switch(slot) if(ITEM_SLOT_HEAD) if(head) - return 0 + return FALSE if(!((I.slot_flags & ITEM_SLOT_HEAD) || (I.slot_flags & ITEM_SLOT_MASK))) - return 0 - return 1 + return FALSE + return TRUE if(ITEM_SLOT_DEX_STORAGE) if(internal_storage) - return 0 - return 1 + return FALSE + return TRUE ..() diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 7893f7b26b3a..d53d596505de 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -95,7 +95,7 @@ /mob/living/simple_animal/hostile/retaliate/goat/attackby(obj/item/O, mob/user, params) if(stat == CONSCIOUS && istype(O, /obj/item/reagent_containers/glass)) udder.milkAnimal(O, user) - return 1 + return TRUE else return ..() @@ -159,7 +159,7 @@ /mob/living/simple_animal/cow/attackby(obj/item/O, mob/user, params) if(stat == CONSCIOUS && istype(O, /obj/item/reagent_containers/glass)) udder.milkAnimal(O, user) - return 1 + return TRUE else return ..() diff --git a/code/modules/mob/living/simple_animal/gremlin/gremlin.dm b/code/modules/mob/living/simple_animal/gremlin/gremlin.dm index da6fed405147..7901dbfd3ea1 100644 --- a/code/modules/mob/living/simple_animal/gremlin/gremlin.dm +++ b/code/modules/mob/living/simple_animal/gremlin/gremlin.dm @@ -228,7 +228,7 @@ GLOBAL_LIST(bad_gremlin_items) return ..() /mob/living/simple_animal/hostile/gremlin/IsAdvancedToolUser() - return 1 + return TRUE /mob/living/simple_animal/hostile/gremlin/proc/divide() //Health is halved and then reduced by 2. A new gremlin is spawned with the same health as the parent diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm index 4e57aa15622c..7bc2121e781d 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm @@ -47,15 +47,15 @@ if(I == internal_storage) internal_storage = null update_inv_internal_storage() - return 1 - return 0 + return TRUE + return FALSE /mob/living/simple_animal/hostile/guardian/dextrous/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, clothing_check = FALSE, list/return_warning) switch(slot) if(ITEM_SLOT_DEX_STORAGE) if(internal_storage) - return 0 - return 1 + return FALSE + return TRUE ..() /mob/living/simple_animal/hostile/guardian/dextrous/equip_to_slot(obj/item/I, slot) diff --git a/code/modules/mob/living/simple_animal/guardian/types/protector.dm b/code/modules/mob/living/simple_animal/guardian/types/protector.dm index 00d56edd558e..605c23227e7c 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/protector.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/protector.dm @@ -29,7 +29,7 @@ /mob/living/simple_animal/hostile/guardian/protector/ToggleMode() if(cooldown > world.time) - return 0 + return FALSE cooldown = world.time + 10 if(toggle) cut_overlays() diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 385d37f5a4ae..f2e64ddf958f 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -246,7 +246,7 @@ /mob/living/simple_animal/hostile/poison/giant_spider/handle_automated_action() if(!..()) //AIStatus is off - return 0 + return FALSE if(AIStatus == AI_IDLE) //1% chance to skitter madly away if(!busy && prob(1)) @@ -255,7 +255,7 @@ spawn(50) stop_automated_movement = 0 walk(src,0) - return 1 + return TRUE /mob/living/simple_animal/hostile/poison/giant_spider/nurse/proc/GiveUp(C) spawn(100) @@ -418,7 +418,7 @@ else message = "You prepare to wrap something in a cocoon. Left-click your target to start wrapping!" add_ranged_ability(user, message, TRUE) - return 1 + return TRUE /obj/effect/proc_holder/wrap/InterceptClickOn(mob/living/caller, params, atom/target) if(..()) @@ -450,11 +450,11 @@ /datum/action/innate/spider/lay_eggs/IsAvailable(silent = FALSE) if(..()) if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse)) - return 0 + return FALSE var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/S = owner if(S.fed) - return 1 - return 0 + return TRUE + return FALSE /datum/action/innate/spider/lay_eggs/Activate() if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse)) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 89f27f067e3b..8ac583231fa8 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -86,7 +86,7 @@ /mob/living/simple_animal/hostile/handle_automated_action() if(AIStatus == AI_OFF) - return 0 + return FALSE var/list/possible_targets = ListTargets() //we look around for potential targets and make it a list for later use. if(environment_smash) @@ -98,7 +98,7 @@ if(!MoveToTarget(possible_targets)) //if we lose our target if(AIShouldSleep(possible_targets)) // we try to acquire a new one toggle_ai(AI_IDLE) // otherwise we go idle - return 1 + return TRUE /mob/living/simple_animal/hostile/handle_automated_movement() . = ..() @@ -273,7 +273,7 @@ if(target != null) GainPatience() Aggro() - return 1 + return TRUE //What we do after closing in /mob/living/simple_animal/hostile/proc/MeleeAction(patience = TRUE) @@ -295,12 +295,12 @@ stop_automated_movement = 1 if(!target || !CanAttack(target)) LoseTarget() - return 0 + return FALSE if(target in possible_targets) var/turf/T = get_turf(src) if(target.z != T.z) LoseTarget() - return 0 + return FALSE var/target_distance = get_dist(targets_from,target) if(ranged) //We ranged? Shoot at em if(!target.Adjacent(targets_from) && ranged_cooldown <= world.time) //But make sure they're not in range for a melee attack and our range attack is off cooldown @@ -310,7 +310,7 @@ return TRUE if(!Process_Spacemove()) //Drifting walk(src,0) - return 1 + return TRUE if(retreat_distance != null) //If we have a retreat distance, check if we need to run from our target if(target_distance <= retreat_distance) //If target's closer than our retreat distance, run walk_away(src,target,retreat_distance,move_to_delay) @@ -325,8 +325,8 @@ if(rapid_melee > 1 && target_distance <= melee_queue_distance) MeleeAction(FALSE) in_melee = FALSE //If we're just preparing to strike do not enter sidestep mode - return 1 - return 0 + return TRUE + return FALSE if(environment_smash) if(target.loc != null && get_dist(targets_from, target.loc) <= vision_range) //We can't see our target, but he's in our vision range still if(ranged_ignores_vision && ranged_cooldown <= world.time) //we can't see our target... but we can fire at them! @@ -334,12 +334,12 @@ if((environment_smash & ENVIRONMENT_SMASH_WALLS) || (environment_smash & ENVIRONMENT_SMASH_RWALLS)) //If we're capable of smashing through walls, forget about vision completely after finding our target Goto(target,move_to_delay,minimum_distance) FindHidden() - return 1 + return TRUE else if(FindHidden()) - return 1 + return TRUE LoseTarget() - return 0 + return FALSE /mob/living/simple_animal/hostile/proc/Goto(target, delay, minimum_distance) if(target == src.target) @@ -530,7 +530,7 @@ Goto(A,move_to_delay,minimum_distance) if(A.Adjacent(targets_from)) A.attack_animal(src) - return 1 + return TRUE /mob/living/simple_animal/hostile/RangedAttack(atom/A, params) //Player firing if(ranged && ranged_cooldown <= world.time) diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm index 0f6c10d8178e..8463e252ad3a 100644 --- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm +++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm @@ -70,7 +70,7 @@ /mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/enter_mecha(obj/vehicle/sealed/mecha/M) if(!M) - return 0 + return FALSE target = null //Target was our mecha, so null it out M.aimob_enter_mech(src) targets_from = M @@ -95,7 +95,7 @@ /mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/exit_mecha(obj/vehicle/sealed/mecha/M) if(!M) - return 0 + return FALSE mecha.aimob_exit_mech(src) allow_movement_on_non_turfs = FALSE @@ -280,7 +280,7 @@ /mob/living/simple_animal/hostile/syndicate/mecha_pilot/EscapeConfinement() if(mecha && loc == mecha) - return 0 + return FALSE ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index def5dc8c76e1..dfdc8a1bbc06 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -153,7 +153,7 @@ Difficulty: Hard if(is_enraged()) visible_message("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons while enraged!", "You deflect the projectile!") playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 300, 1) - return 0 + return FALSE return ..() /mob/living/simple_animal/hostile/megafauna/bubblegum/ex_act(severity, target, origin) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 49db73823330..9f13b980b65e 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -203,7 +203,7 @@ Difficulty: Medium if(!any_attack) for(var/obj/effect/temp_visual/drakewall/D in drakewalls) qdel(D) - return 0 // nothing to attack in the arena time for enraged attack if we still have a target + return FALSE // nothing to attack in the arena time for enraged attack if we still have a target for(var/turf/T in turfs) if(!(T in empty)) new /obj/effect/temp_visual/lava_warning(T) @@ -211,7 +211,7 @@ Difficulty: Medium new /obj/effect/temp_visual/lava_safe(T) amount-- sleep(24) - return 1 // attack finished completely + return TRUE // attack finished completely /mob/living/simple_animal/hostile/megafauna/dragon/proc/arena_escape_enrage() // you ran somehow / teleported away from my arena attack now i'm mad fucker SetRecoveryTime(80) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 6370fae0e321..28be4c486597 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -143,8 +143,8 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca /mob/living/simple_animal/hostile/mimic/copy/proc/CheckObject(obj/O) if((isitem(O) || isstructure(O)) && !is_type_in_list(O, GLOB.protected_objects)) - return 1 - return 0 + return TRUE + return FALSE /mob/living/simple_animal/hostile/mimic/copy/proc/CopyObject(obj/O, mob/living/user, destroy_original = 0) if(destroy_original || CheckObject(O)) @@ -176,7 +176,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca faction += "[REF(creator)]" // very unique if(destroy_original) qdel(O) - return 1 + return TRUE /mob/living/simple_animal/hostile/mimic/copy/DestroySurroundings() if(destroy_objects) @@ -197,11 +197,11 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca /mob/living/simple_animal/hostile/mimic/copy/machine/CanAttack(atom/the_target) if(the_target == creator) // Don't attack our creator AI. - return 0 + return FALSE if(iscyborg(the_target)) var/mob/living/silicon/robot/R = the_target if(R.connected_ai == creator) // Only attack robots that aren't synced to our creator AI. - return 0 + return FALSE return ..() /mob/living/simple_animal/hostile/mimic/copy/ranged diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm index 92eb310595e9..1db137c0f970 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm @@ -39,7 +39,7 @@ for(var/mob/living/simple_animal/hostile/retaliate/H in around) if(faction_check_mob(H) && !attack_same && !H.attack_same) H.enemies |= enemies - return 0 + return FALSE /mob/living/simple_animal/hostile/retaliate/adjustHealth(amount, updating_health = TRUE, forced = FALSE) . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/sharks.dm b/code/modules/mob/living/simple_animal/hostile/sharks.dm index af6114913079..a101680cc1db 100644 --- a/code/modules/mob/living/simple_animal/hostile/sharks.dm +++ b/code/modules/mob/living/simple_animal/hostile/sharks.dm @@ -36,7 +36,7 @@ faction = list("shark") /mob/living/simple_animal/hostile/shark/Process_Spacemove(var/movement_dir = 0) - return 1 //No drifting in space for space sharks....either! + return TRUE //No drifting in space for space sharks....either! /mob/living/simple_animal/hostile/shark/FindTarget() . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 9356c962fd4a..c32c06bbcbd9 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -78,7 +78,7 @@ if(can_be_seen(NewLoc)) if(client) to_chat(src, "You cannot move, there are eyes on you!") - return 0 + return FALSE return ..() /mob/living/simple_animal/hostile/statue/BiologicalLife(delta_time, times_fired) @@ -136,7 +136,7 @@ // Cannot talk /mob/living/simple_animal/hostile/statue/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) - return 0 + return FALSE // Turn to dust when gibbed @@ -150,7 +150,7 @@ if(isliving(the_target)) var/mob/living/L = the_target if(!L.client && !L.ckey) - return 0 + return FALSE return ..() // Don't attack your creator if there is one @@ -228,4 +228,4 @@ /mob/living/simple_animal/hostile/statue/restrained(ignore_grab) . = ..() if(can_be_seen(loc)) - return 1 + return TRUE diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 0c24dd36faf3..8bf897b0cf6e 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -188,7 +188,7 @@ ears.talk_into(src, message, message_mode, spans, language) return ITALICS | REDUCE_RANGE - return 0 + return FALSE GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( /datum/strippable_item/parrot_headset, @@ -627,12 +627,12 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( parrot_state = PARROT_WANDER parrot_stuck = 0 parrot_lastmove = null - return 1 + return TRUE else parrot_lastmove = null else parrot_lastmove = src.loc - return 0 + return FALSE /mob/living/simple_animal/parrot/proc/attempt_item_theft() //Search for item to steal @@ -710,7 +710,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( if(held_item) to_chat(src, "You are already holding [held_item]!") - return 1 + return TRUE for(var/obj/item/I in view(1,src)) //Make sure we're not already holding it and it's small enough @@ -726,7 +726,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( return held_item to_chat(src, "There is nothing of interest to take!") - return 0 + return FALSE /mob/living/simple_animal/parrot/proc/steal_from_mob() set name = "Steal from mob" @@ -738,7 +738,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( if(held_item) to_chat(src, "You are already holding [held_item]!") - return 1 + return TRUE var/obj/item/stolen_item = null @@ -755,7 +755,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( return held_item to_chat(src, "There is nothing of interest to take!") - return 0 + return FALSE /mob/living/simple_animal/parrot/verb/drop_held_item_player() set name = "Drop held item" @@ -780,7 +780,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( if(!held_item) if(src == usr) //So that other mobs wont make this message appear when they're bludgeoning you. to_chat(src, "You have nothing to drop!") - return 0 + return FALSE //parrots will eat crackers instead of dropping them @@ -790,7 +790,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( if(health < maxHealth) adjustBruteLoss(-10) emote("me", EMOTE_VISIBLE, "[src] eagerly downs the cracker.") - return 1 + return TRUE if(!drop_gently) @@ -800,13 +800,13 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( G.prime() to_chat(src, "You let go of [held_item]!") held_item = null - return 1 + return TRUE to_chat(src, "You drop [held_item].") held_item.forceMove(drop_location()) held_item = null - return 1 + return TRUE /mob/living/simple_animal/parrot/proc/perch_player() set name = "Sit" diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 151cc70a27f7..3eb2f8bb0f53 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -215,7 +215,7 @@ if(Process_Spacemove(anydir)) Move(get_step(src, anydir), anydir) turns_since_move = 0 - return 1 + return TRUE /mob/living/simple_animal/proc/handle_automated_speech(var/override) set waitfor = FALSE diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 274af333fc2d..42a419db239a 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -620,11 +620,11 @@ /mob/living/simple_animal/slime/proc/will_hunt(hunger = -1) // Check for being stopped from feeding and chasing if (docile) - return 0 + return FALSE if (hunger == 2 || rabid || attacked) - return 1 + return TRUE if (Leader) - return 0 + return FALSE if (holding_still) - return 0 - return 1 + return FALSE + return TRUE diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index d93993bf1fab..3624c00e6dbf 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -16,16 +16,16 @@ var/mob/living/simple_animal/slime/S = owner if(needs_growth == GROWTH_NEEDED) if(S.amount_grown >= SLIME_EVOLUTION_THRESHOLD) - return 1 - return 0 - return 1 + return TRUE + return FALSE + return TRUE /mob/living/simple_animal/slime/verb/Feed() set category = "Slime" set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process." if(stat) - return 0 + return FALSE var/list/choices = list() for(var/mob/living/C in fov_view(1,src)) @@ -34,10 +34,10 @@ var/mob/living/M = input(src,"Who do you wish to feed on?") in null|choices if(!M) - return 0 + return FALSE if(CanFeedon(M)) Feedon(M) - return 1 + return TRUE /datum/action/innate/slime/feed name = "Feed" diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 2b267c4d01b9..f37ecfe7e67f 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -326,7 +326,7 @@ if(M.a_intent == INTENT_HELP || M.a_intent == INTENT_DISARM) for(var/datum/surgery/S in surgeries) if(S.next_step(M,M.a_intent)) - return 1 + return TRUE if(..()) //successful attack attacked += 10 @@ -343,7 +343,7 @@ if(user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM) for(var/datum/surgery/S in surgeries) if(S.next_step(user,user.a_intent)) - return 1 + return TRUE if(istype(W, /obj/item/stack/sheet/mineral/plasma) && !stat) //Let's you feed slimes plasma. if (user in Friends) ++Friends[user] @@ -478,10 +478,10 @@ docile = 1 /mob/living/simple_animal/slime/can_unbuckle() - return 0 + return FALSE /mob/living/simple_animal/slime/can_buckle() - return 0 + return FALSE /mob/living/simple_animal/slime/get_mob_buckling_height(mob/seat) if(..()) diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 498ca19a39a6..831e8f317b41 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -29,7 +29,7 @@ var/datum/status_effect/incapacitating/stun/S = IsStun() if(S) return S.duration - world.time - return 0 + return FALSE /mob/living/proc/Stun(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) @@ -86,7 +86,7 @@ var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() if(K) return K.duration - world.time - return 0 + return FALSE /mob/living/proc/Knockdown(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) @@ -142,7 +142,7 @@ var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() if(I) return I.duration - world.time - return 0 + return FALSE /mob/living/proc/Immobilize(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) @@ -198,7 +198,7 @@ var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE) if(P) return P.duration - world.time - return 0 + return FALSE /mob/living/proc/Paralyze(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) @@ -254,7 +254,7 @@ var/datum/status_effect/incapacitating/dazed/I = IsDazed() if(I) return I.duration - world.time - return 0 + return FALSE /mob/living/proc/Daze(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_DAZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) @@ -310,7 +310,7 @@ var/datum/status_effect/staggered/I = IsStaggered() if(I) return I.duration - world.time - return 0 + return FALSE /mob/living/proc/Stagger(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STAGGER, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) @@ -417,7 +417,7 @@ var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious() if(U) return U.duration - world.time - return 0 + return FALSE /mob/living/proc/Unconscious(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_UNCONSCIOUS, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) @@ -464,7 +464,7 @@ var/datum/status_effect/incapacitating/sleeping/S = IsSleeping() if(S) return S.duration - world.time - return 0 + return FALSE /mob/living/proc/Sleeping(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_SLEEP, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index f80866d97e21..f2d4f7cd5842 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -62,7 +62,7 @@ set hidden = 1 if(!loc) - return 0 + return FALSE var/datum/gas_mixture/environment = loc.return_air() @@ -677,7 +677,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) return /mob/proc/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //For sec bot threat assessment - return 0 + return FALSE /mob/proc/get_ghost(even_if_they_cant_reenter = 0) if(mind) @@ -750,7 +750,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) if(isliving(seat)) var/mob/living/L = seat if(L.mob_size <= MOB_SIZE_SMALL) //being on top of a small mob doesn't put you very high. - return 0 + return FALSE return 9 //can the mob be buckled to something by default? @@ -804,7 +804,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) /mob/proc/fully_replace_character_name(oldname,newname) log_message("[src] name changed from [oldname] to [newname]", LOG_OWNERSHIP) if(!newname) - return 0 + return FALSE real_name = newname name = newname if(mind) @@ -822,7 +822,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) // Only update if this player is a target if(obj.target && obj.target.current && obj.target.current.real_name == name) obj.update_explanation_text() - return 1 + return TRUE //Updates GLOB.data_core records with new name , see mob/living/carbon/human /mob/proc/replace_records_name(oldname,newname) @@ -881,7 +881,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) client.mouse_pointer_icon = client.mouse_override_icon /mob/proc/is_literate() - return 0 + return FALSE /mob/proc/can_hold_items() return FALSE diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index cdad94cf3f83..ea7900ebac1a 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -38,9 +38,9 @@ /proc/above_neck(zone) var/list/zones = list(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_PRECISE_EYES) if(zones.Find(zone)) - return 1 + return TRUE else - return 0 + return FALSE /** * Convert random parts of a passed in message to stars @@ -269,7 +269,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp var/mob/M = i if(M.real_name == msg) return M - return 0 + return FALSE /mob/proc/first_name() var/static/regex/firstname = new("^\[^\\s-\]+") //First word before whitespace or "-" @@ -364,7 +364,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp return FALSE /mob/proc/reagent_check(datum/reagent/R) // utilized in the species code - return 1 + return TRUE /proc/notify_ghosts(message, ghost_sound, enter_link, atom/source, mutable_appearance/alert_overlay, action = NOTIFY_JUMP, flashwindow = TRUE, ignore_mapload = TRUE, ignore_key, ignore_dnr_observers = FALSE, header) //Easy notification of ghosts. if(ignore_mapload && SSatoms.initialized != INITIALIZATION_INNEW_REGULAR) //don't notify for objects created during a map load @@ -407,7 +407,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp H.update_damage_overlays() user.visible_message("[user] has fixed some of the [dam ? "dents on" : "burnt wires in"] [H]'s [affecting.name].", \ "You fix some of the [dam ? "dents on" : "burnt wires in"] [H]'s [affecting.name].") - return 1 //successful heal + return TRUE //successful heal else to_chat(user, "[affecting] is already in good condition!") @@ -478,9 +478,9 @@ It's fairly easy to fix if dealing with single letters but not so much with comp /mob/proc/is_flying(mob/M = src) if(M.movement_type & FLYING) - return 1 + return TRUE else - return 0 + return FALSE /mob/proc/click_random_mob() var/list/nearby_mobs = list() diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index e39a9a976f2e..71f711e9879e 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -154,7 +154,7 @@ return TRUE /mob/proc/hivecheck() - return 0 + return FALSE /mob/proc/lingcheck() return LINGHIVE_NONE diff --git a/code/modules/mob/say_readme.dm b/code/modules/mob/say_readme.dm index 6b0eb187adc6..3a61bfee1a09 100644 --- a/code/modules/mob/say_readme.dm +++ b/code/modules/mob/say_readme.dm @@ -128,7 +128,7 @@ global procs handle_inherent_channels(message, message_mode) If message_mode is MODE_BINARY, MODE_ALIEN or MODE_CHANGELING (or, for AIs, MODE_HOLOPAD), this will - handle speaking in those modes. Return 1 to exit say(). + handle speaking in those modes. return TRUE to exit say(). treat_message(message) What it says on the tin. Treats the message according to masks, mutantraces, mutations, etc. @@ -143,7 +143,7 @@ global procs ITALICS = add italics to the message REDUCE_RANGE = reduce the message range to one tile. - Return 0 if no radio was spoken into. + return FALSE if no radio was spoken into. IMPORTANT: remember to call ..() and check for ..()'s return value properly! ============================RADIOS============================= diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index fa9dc9f4f83e..899994157676 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -603,35 +603,35 @@ //Bad mobs! - Remember to add a comment explaining what's wrong with the mob if(!MP) - return 0 //Sanity, this should never happen. + return FALSE //Sanity, this should never happen. if(ispath(MP, /mob/living/simple_animal/hostile/construct)) - return 0 //Verbs do not appear for players. + return FALSE //Verbs do not appear for players. //Good mobs! if(ispath(MP, /mob/living/simple_animal/pet/cat)) - return 1 + return TRUE if(ispath(MP, /mob/living/simple_animal/pet/dog/corgi)) - return 1 + return TRUE if(ispath(MP, /mob/living/simple_animal/crab)) - return 1 + return TRUE if(ispath(MP, /mob/living/simple_animal/hostile/carp)) - return 1 + return TRUE if(ispath(MP, /mob/living/simple_animal/hostile/mushroom)) - return 1 + return TRUE if(ispath(MP, /mob/living/simple_animal/hostile/construct/shade)) - return 1 + return TRUE if(ispath(MP, /mob/living/simple_animal/hostile/killertomato)) - return 1 + return TRUE if(ispath(MP, /mob/living/simple_animal/mouse)) - return 1 //It is impossible to pull up the player panel for mice (Fixed! - Nodrak) + return TRUE //It is impossible to pull up the player panel for mice (Fixed! - Nodrak) if(ispath(MP, /mob/living/simple_animal/hostile/bear)) - return 1 //Bears will auto-attack mobs, even if they're player controlled (Fixed! - Nodrak) + return TRUE //Bears will auto-attack mobs, even if they're player controlled (Fixed! - Nodrak) if(ispath(MP, /mob/living/simple_animal/parrot)) - return 1 //Parrots are no longer unfinished! -Nodrak + return TRUE //Parrots are no longer unfinished! -Nodrak //Not in here? Must be untested! - return 0 + return FALSE #undef TRANSFORMATION_DURATION diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 2d82988997f8..267691be39a6 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -392,7 +392,7 @@ if(network_card) return network_card.get_signal(specific_action) else - return 0 + return FALSE /obj/item/modular_computer/proc/add_log(text) if(!get_ntnet_status()) diff --git a/code/modules/modular_computers/computers/item/computer_power.dm b/code/modules/modular_computers/computers/item/computer_power.dm index f31c3c82cce2..7c741507b5c7 100644 --- a/code/modules/modular_computers/computers/item/computer_power.dm +++ b/code/modules/modular_computers/computers/item/computer_power.dm @@ -24,7 +24,7 @@ var/obj/item/computer_hardware/battery/battery_module = all_components[MC_CELL] if(battery_module?.battery) return battery_module.battery.give(amount) - return 0 + return FALSE /obj/item/modular_computer/get_cell() var/obj/item/computer_hardware/battery/battery_module = all_components[MC_CELL] diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm index 93324bffe8c7..f6aed4996b07 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -170,7 +170,7 @@ active_program = P P.alert_pending = FALSE update_appearance() - return 1 + return TRUE if("PC_toggle_light") return toggle_flashlight() diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index dc0cdda5d136..264ee0bd2ffd 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -72,7 +72,7 @@ /datum/computer_file/program/proc/generate_network_log(text) if(computer) return computer.add_log(text) - return 0 + return FALSE /** *Runs when the device is used to attack an atom in non-combat mode. @@ -99,7 +99,7 @@ /datum/computer_file/program/proc/get_signal(specific_action = 0) if(computer) return computer.get_ntnet_status(specific_action) - return 0 + return FALSE // Called by Process() on device that runs us, once every tick. /datum/computer_file/program/proc/process_tick(delta_time) @@ -161,7 +161,7 @@ return computer.get_header_data() return list() -// This is performed on program startup. May be overridden to add extra logic. Remember to include ..() call. Return 1 on success, 0 on failure. +// This is performed on program startup. May be overridden to add extra logic. Remember to include ..() call. return TRUE on success, 0 on failure. // When implementing new program based device, use this to run the program. /datum/computer_file/program/proc/run_program(mob/living/user) if(can_run(user, 1)) @@ -198,7 +198,7 @@ if(card_holder) ID = card_holder.GetID() generate_network_log("Connection closed -- Program ID: [filename] User:[ID?"[ID.registered_name]":"None"]") - return 1 + return TRUE /datum/computer_file/program/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) diff --git a/code/modules/modular_computers/file_system/programs/alarm.dm b/code/modules/modular_computers/file_system/programs/alarm.dm index 80c0c4dfa8a5..88d52646ac7c 100644 --- a/code/modules/modular_computers/file_system/programs/alarm.dm +++ b/code/modules/modular_computers/file_system/programs/alarm.dm @@ -23,7 +23,7 @@ program_icon_state = "alert-green" ui_header = "alarm_green.gif" update_computer_icon() - return 1 + return TRUE /datum/computer_file/program/alarm_monitor/ui_data(mob/user) var/list/data = get_header_data() diff --git a/code/modules/modular_computers/file_system/programs/configurator.dm b/code/modules/modular_computers/file_system/programs/configurator.dm index cf5d950c0f6f..567ff436a6ff 100644 --- a/code/modules/modular_computers/file_system/programs/configurator.dm +++ b/code/modules/modular_computers/file_system/programs/configurator.dm @@ -27,7 +27,7 @@ // No computer connection, we can't get data from that. if(!movable) - return 0 + return FALSE var/list/data = get_header_data() diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm index b1a44c4cc55d..20995502ae47 100644 --- a/code/modules/modular_computers/hardware/_hardware.dm +++ b/code/modules/modular_computers/hardware/_hardware.dm @@ -51,11 +51,11 @@ var/obj/item/stack/S = I if(obj_integrity == max_integrity) to_chat(user, span_warning("\The [src] doesn't seem to require repairs.")) - return 1 + return TRUE if(S.use(1)) to_chat(user, span_notice("You patch up \the [src] with a bit of \the [I].")) obj_integrity = min(obj_integrity + 10, max_integrity) - return 1 + return TRUE if(try_insert(I, user)) return TRUE diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index 074e158dbfa3..229b16c99d3c 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -34,16 +34,16 @@ // 0 - No signal, 1 - Low signal, 2 - High signal. 3 - Wired Connection /obj/item/computer_hardware/network_card/proc/get_signal(specific_action = 0) if(!holder) // Hardware is not installed in anything. No signal. How did this even get called? - return 0 + return FALSE if(!check_functionality()) - return 0 + return FALSE if(ethernet) // Computer is connected via wired connection. return 3 if(!SSnetworks.station_network || !SSnetworks.station_network.check_function(specific_action)) // NTNet is down and we are not connected via wired connection. No signal. - return 0 + return FALSE if(holder) @@ -53,12 +53,12 @@ if(long_range) return 2 else - return 1 + return TRUE if(long_range) // Computer is not on station, but it has upgraded network card. Low signal. - return 1 + return TRUE - return 0 // Computer is not on station and does not have upgraded network card. No signal. + return FALSE // Computer is not on station and does not have upgraded network card. No signal. /obj/item/computer_hardware/network_card/advanced diff --git a/code/modules/modular_computers/hardware/recharger.dm b/code/modules/modular_computers/hardware/recharger.dm index e8c479db479c..8e9183ead2bb 100644 --- a/code/modules/modular_computers/hardware/recharger.dm +++ b/code/modules/modular_computers/hardware/recharger.dm @@ -95,5 +95,5 @@ charge_rate = 100000 /obj/item/computer_hardware/recharger/lambda/use_power(amount, charging=0) - return 1 + return TRUE diff --git a/code/modules/movespeed/_movespeed_modifier.dm b/code/modules/movespeed/_movespeed_modifier.dm index 5fc415b2b6fe..1dfea6ac1ac1 100644 --- a/code/modules/movespeed/_movespeed_modifier.dm +++ b/code/modules/movespeed/_movespeed_modifier.dm @@ -199,7 +199,7 @@ GLOBAL_LIST_EMPTY(movespeed_modification_cache) /mob/proc/get_config_multiplicative_speed(floating = FALSE) var/list/read = floating? GLOB.mob_config_movespeed_type_lookup_floating : GLOB.mob_config_movespeed_type_lookup if(!islist(read) || !read[type]) - return 0 + return FALSE else return read[type] diff --git a/code/modules/newscaster/newspaper.dm b/code/modules/newscaster/newspaper.dm index 0afb36a7e708..0142e84e2616 100644 --- a/code/modules/newscaster/newspaper.dm +++ b/code/modules/newscaster/newspaper.dm @@ -113,17 +113,17 @@ /obj/item/newspaper/proc/notContent(list/L) if(!L.len) - return 0 + return FALSE for(var/i=L.len;i>0;i--) var/num = abs(L[i]) if(creationTime <= num) continue else if(L[i] > 0) - return 1 + return TRUE else - return 0 - return 0 + return FALSE + return FALSE /obj/item/newspaper/Topic(href, href_list) var/mob/living/U = usr diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm index f46d4bf02947..d9f660720945 100644 --- a/code/modules/paperwork/contract.dm +++ b/code/modules/paperwork/contract.dm @@ -189,31 +189,31 @@ /obj/item/paper/contract/infernal/proc/attempt_signature(mob/living/carbon/human/user, blood = 0) if(!user.IsAdvancedToolUser() || !user.is_literate()) to_chat(user, "You don't know how to read or write.") - return 0 + return FALSE if(user.mind != target) to_chat(user, "Your signature simply slides off the sheet, it seems this contract is not meant for you to sign.") - return 0 + return FALSE if(user.mind.soulOwner == owner) to_chat(user, "This devil already owns your soul, you may not sell it to [owner.p_them()] again.") - return 0 + return FALSE if(signed) to_chat(user, "This contract has already been signed. It may not be signed again.") - return 0 + return FALSE if(!user.mind.hasSoul) to_chat(user, "You do not possess a soul.") - return 0 + return FALSE if(HAS_TRAIT(user, TRAIT_DUMB)) to_chat(user, "You quickly scrawl 'your name' on the contract.") signIncorrectly() - return 0 + return FALSE if (contractType == CONTRACT_REVIVE) to_chat(user, "You are already alive, this contract would do nothing.") - return 0 + return FALSE else to_chat(user, "You quickly scrawl your name on the contract") if(fulfillContract(target.current, blood)<=0) to_chat(user, "But it seemed to have no effect, perhaps even Hell itself cannot grant this boon?") - return 1 + return TRUE @@ -221,7 +221,7 @@ if (target == M.mind && M.stat == DEAD && M.mind.soulOwner == M.mind) if (cooldown) to_chat(user, "Give [M] a chance to think through the contract, don't rush [M.p_them()].") - return 0 + return FALSE cooldown = TRUE var/mob/living/carbon/human/H = M var/mob/dead/observer/ghost = H.get_ghost() diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index 5b9bf71a9b24..4d112dc111e3 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -197,23 +197,23 @@ /obj/machinery/power/am_control_unit/proc/add_shielding(obj/machinery/am_shielding/AMS, AMS_linking = 0) if(!istype(AMS)) - return 0 + return FALSE if(!anchored) - return 0 + return FALSE if(!AMS_linking && !AMS.link_control(src)) - return 0 + return FALSE linked_shielding.Add(AMS) update_shield_icons = 1 - return 1 + return TRUE /obj/machinery/power/am_control_unit/proc/remove_shielding(obj/machinery/am_shielding/AMS) if(!istype(AMS)) - return 0 + return FALSE linked_shielding.Remove(AMS) update_shield_icons = 2 if(active) toggle_power() - return 1 + return TRUE /obj/machinery/power/am_control_unit/proc/check_stability()//TODO: make it break when low also might want to add a way to fix it like a part or such that can be replaced if(stability <= 0) diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index e9ee1e70d093..e1e91d2f7711 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -80,7 +80,7 @@ /obj/machinery/am_shielding/CanPass(atom/movable/mover, turf/target) - return 0 + return FALSE /obj/machinery/am_shielding/process() @@ -167,12 +167,12 @@ //Call this to link a detected shilding unit to the controller /obj/machinery/am_shielding/proc/link_control(obj/machinery/power/am_control_unit/AMC) if(!istype(AMC)) - return 0 + return FALSE if(control_unit && control_unit != AMC) return 0//Already have one control_unit = AMC control_unit.add_shielding(src,1) - return 1 + return TRUE //Scans cards for shields or the control unit and if all there it @@ -186,8 +186,8 @@ found_am_device = 1 break if(!found_am_device) - return 0 - return 1 + return FALSE + return TRUE /obj/machinery/am_shielding/proc/setup_core() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 9896cc4088bb..d79cd979b721 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -860,7 +860,7 @@ /obj/machinery/power/apc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(damage_flag == MELEE && damage_amount < 10 && (!(stat & BROKEN) || malfai)) - return 0 + return FALSE . = ..() @@ -1343,7 +1343,7 @@ if(terminal) return terminal.surplus() else - return 0 + return FALSE /obj/machinery/power/apc/add_load(amount) if(terminal && terminal.powernet) @@ -1353,7 +1353,7 @@ if(terminal) return terminal.avail(amount) else - return 0 + return FALSE /obj/machinery/power/apc/process() if(icon_update_needed) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 725482117b28..5aa16c0c2914 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -198,12 +198,12 @@ By design, d1 is the smallest direction and d2 is the highest // shock the user with probability prb /obj/structure/cable/proc/shock(mob/user, prb, siemens_coeff = 1) if(!prob(prb)) - return 0 + return FALSE if (electrocute_mob(user, powernet, src, siemens_coeff)) do_sparks(5, TRUE, src) - return 1 + return TRUE else - return 0 + return FALSE /obj/structure/cable/singularity_pull(S, current_size) ..() @@ -235,13 +235,13 @@ By design, d1 is the smallest direction and d2 is the highest if(powernet) return clamp(powernet.avail-powernet.load, 0, powernet.avail) else - return 0 + return FALSE /obj/structure/cable/proc/avail(amount) if(powernet) return amount ? powernet.avail >= amount : powernet.avail else - return 0 + return FALSE /obj/structure/cable/proc/add_delayedload(amount) if(powernet) @@ -251,13 +251,13 @@ By design, d1 is the smallest direction and d2 is the highest if(powernet) return clamp(powernet.newavail - powernet.delayedload, 0, powernet.newavail) else - return 0 + return FALSE /obj/structure/cable/proc/newavail() if(powernet) return powernet.newavail else - return 0 + return FALSE ///////////////////////////////////////////////// // Cable laying helpers diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 6d1da2bc20da..51710affc018 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -76,13 +76,13 @@ /obj/item/stock_parts/cell/use(amount, can_explode = TRUE) if(rigged && amount > 0 && can_explode) explode() - return 0 + return FALSE if(charge < amount) - return 0 + return FALSE charge -= amount if(!istype(loc, /obj/machinery/power/apc)) SSblackbox.record_feedback("tally", "cell_used", 1, type) - return 1 + return TRUE // recharge the cell /obj/item/stock_parts/cell/proc/give(amount) @@ -90,7 +90,7 @@ return if(rigged && amount > 0) explode() - return 0 + return FALSE if(maxcharge < amount) amount = maxcharge var/power_used = min(maxcharge-charge,amount) @@ -182,7 +182,7 @@ if(charge >= 1000) return clamp(round(charge/10000), 10, 90) + rand(-5,5) else - return 0 + return FALSE /obj/item/stock_parts/cell/get_part_rating() return rating * maxcharge @@ -298,7 +298,7 @@ chargerate = 30000 /obj/item/stock_parts/cell/infinite/use() - return 1 + return TRUE /obj/item/stock_parts/cell/infinite/abductor name = "void core" diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index a44a0faa068a..24e7581966b9 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -44,13 +44,13 @@ if(powernet) return clamp(powernet.avail-powernet.load, 0, powernet.avail) else - return 0 + return FALSE /obj/machinery/power/proc/avail(amount) if(powernet) return amount ? powernet.avail >= amount : powernet.avail else - return 0 + return FALSE /obj/machinery/power/proc/add_delayedload(amount) if(powernet) @@ -60,13 +60,13 @@ if(powernet) return clamp(powernet.newavail - powernet.delayedload, 0, powernet.newavail) else - return 0 + return FALSE /obj/machinery/power/proc/newavail() if(powernet) return powernet.newavail else - return 0 + return FALSE /obj/machinery/power/proc/disconnect_terminal() // machines without a terminal will just return, no harm no fowl. return @@ -309,17 +309,17 @@ //No animations will be performed by this proc. /proc/electrocute_mob(mob/living/M, power_source, obj/source, siemens_coeff = 1, dist_check = FALSE) if(!istype(M) || ismecha(M.loc)) - return 0 //feckin mechs are dumb + return FALSE //feckin mechs are dumb if(dist_check) if(!in_range(source,M)) - return 0 + return FALSE if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves if(G.siemens_coefficient == 0) SEND_SIGNAL(M, COMSIG_LIVING_SHOCK_PREVENTED, power_source, source, siemens_coeff, dist_check) - return 0 //to avoid spamming with insulated glvoes on + return FALSE //to avoid spamming with insulated glvoes on var/area/source_area if(istype(power_source, /area)) @@ -342,12 +342,12 @@ if (apc.terminal) PN = apc.terminal.powernet else if (!power_source) - return 0 + return FALSE else log_admin("ERROR: /proc/electrocute_mob([M], [power_source], [source]): wrong power_source") - return 0 + return FALSE if (!cell && !PN) - return 0 + return FALSE var/PN_damage = 0 var/cell_damage = 0 if (PN) diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index ff69adc894c0..a8b52ca84a45 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -98,4 +98,4 @@ if(avail >= 1000) return clamp(round(avail/10000), 10, 90) + rand(-5,5) else - return 0 + return FALSE diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 567ac00487d9..fba18c70dc7a 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -76,7 +76,7 @@ field_generator power level display if(get_dist(src, user) <= 1)//Need to actually touch the thing to turn it on if(active >= FG_CHARGING) to_chat(user, "You are unable to turn off [src] once it is online!") - return 1 + return TRUE else user.visible_message("[user] turns on [src].", \ "You turn on [src].", \ @@ -157,7 +157,7 @@ field_generator power level display /obj/machinery/field/generator/blob_act(obj/structure/blob/B) if(active) - return 0 + return FALSE else ..() @@ -207,25 +207,25 @@ field_generator power level display if(draw_power(round(power_draw/2,1))) check_power_level() - return 1 + return TRUE else visible_message("The [name] shuts down!", "You hear something shutting down.") turn_off() investigate_log("ran out of power and deactivated", INVESTIGATE_SINGULO) power = 0 check_power_level() - return 0 + return FALSE //This could likely be better, it tends to start loopin if you have a complex generator loop setup. Still works well enough to run the engine fields will likely recode the field gens and fields sometime -Mport /obj/machinery/field/generator/proc/draw_power(draw = 0, failsafe = FALSE, obj/machinery/field/generator/G = null, obj/machinery/field/generator/last = null) if((G && (G == src)) || (failsafe >= 8))//Loopin, set fail - return 0 + return FALSE else failsafe++ if(power >= draw)//We have enough power power -= draw - return 1 + return TRUE else//Need more power draw -= power @@ -236,14 +236,14 @@ field_generator power level display continue if(G)//Another gen is askin for power and we dont have it if(FG.draw_power(draw,failsafe,G,src))//Can you take the load - return 1 + return TRUE else - return 0 + return FALSE else//We are askin another for power if(FG.draw_power(draw,failsafe,src,src)) - return 1 + return TRUE else - return 0 + return FALSE /obj/machinery/field/generator/proc/start_fields() @@ -266,22 +266,22 @@ field_generator power level display /obj/machinery/field/generator/proc/setup_field(NSEW) var/turf/T = loc if(!istype(T)) - return 0 + return FALSE var/obj/machinery/field/generator/G = null var/steps = 0 if(!NSEW)//Make sure its ran right - return 0 + return FALSE for(var/dist in 0 to 7) // checks out to 8 tiles away for another generator T = get_step(T, NSEW) if(T.density)//We cant shoot a field though this - return 0 + return FALSE G = locate(/obj/machinery/field/generator) in T if(G) steps -= 1 if(!G.active) - return 0 + return FALSE break for(var/TC in T.contents) @@ -289,12 +289,12 @@ field_generator power level display if(ismob(A)) continue if(A.density) - return 0 + return FALSE steps++ if(!G) - return 0 + return FALSE T = loc for(var/dist in 0 to steps) // creates each field tile diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 6938352d16f9..a10152192771 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -141,8 +141,8 @@ /obj/structure/particle_accelerator/proc/connect_master(obj/O) if(O.dir == dir) master = O - return 1 - return 0 + return TRUE + return FALSE /////////// // PARTS // diff --git a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm index fc7cca55e655..bfcb53db7cb7 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm @@ -21,8 +21,8 @@ /obj/structure/particle_accelerator/particle_emitter/proc/set_delay(delay) if(delay >= 0) fire_delay = delay - return 1 - return 0 + return TRUE + return FALSE /obj/structure/particle_accelerator/particle_emitter/proc/emit_particle(strength = 0) if((last_shot + fire_delay) <= world.time) @@ -39,5 +39,5 @@ if(3) P = new/obj/effect/accelerated_particle/powerful(T) P.setDir(dir) - return 1 - return 0 + return TRUE + return FALSE diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 29fd68d0340b..b1f8efae6ea2 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -57,7 +57,7 @@ return ..() else last_failed_movement = direct - return 0 + return FALSE /obj/singularity/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) consume(user) @@ -74,10 +74,10 @@ /obj/singularity/attackby(obj/item/W, mob/user, params) consume(user) - return 1 + return TRUE /obj/singularity/Process_Spacemove() //The singularity stops drifting for no man! - return 0 + return FALSE /obj/singularity/blob_act(obj/structure/blob/B) return @@ -235,18 +235,18 @@ dissipate = 0 if(current_size == allowed_size) investigate_log("grew to size [current_size]", INVESTIGATE_SINGULO) - return 1 + return TRUE else if(current_size < (--temp_allowed_size)) expand(temp_allowed_size) else - return 0 + return FALSE /obj/singularity/proc/check_energy() if(energy <= 0) investigate_log("collapsed.", INVESTIGATE_SINGULO) qdel(src) - return 0 + return FALSE switch(energy)//Some of these numbers might need to be changed up later -Mport if(1 to 199) allowed_size = STAGE_ONE @@ -263,7 +263,7 @@ allowed_size = STAGE_FIVE if(current_size != allowed_size) expand() - return 1 + return TRUE /obj/singularity/proc/eat() @@ -296,7 +296,7 @@ /obj/singularity/proc/move(force_move = 0) if(!move_self) - return 0 + return FALSE var/movement_dir = pick(GLOB.alldirs - last_failed_movement) @@ -321,7 +321,7 @@ /obj/singularity/proc/check_turfs_in(direction = 0, step = 0) if(!direction) - return 0 + return FALSE var/steps = 0 if(!step) switch(current_size) @@ -342,7 +342,7 @@ for(var/i = 1 to steps) T = get_step(T,direction) if(!isturf(T)) - return 0 + return FALSE turfs.Add(T) var/dir2 = 0 var/dir3 = 0 @@ -357,35 +357,35 @@ for(var/j = 1 to steps-1) T2 = get_step(T2,dir2) if(!isturf(T2)) - return 0 + return FALSE turfs.Add(T2) for(var/k = 1 to steps-1) T = get_step(T,dir3) if(!isturf(T)) - return 0 + return FALSE turfs.Add(T) for(var/turf/T3 in turfs) if(isnull(T3)) continue if(!can_move(T3)) - return 0 - return 1 + return FALSE + return TRUE /obj/singularity/proc/can_move(turf/T) if(!T) - return 0 + return FALSE if((locate(/obj/machinery/field/containment) in T)||(locate(/obj/machinery/shieldwall) in T)) - return 0 + return FALSE else if(locate(/obj/machinery/field/generator) in T) var/obj/machinery/field/generator/G = locate(/obj/machinery/field/generator) in T if(G && G.active) - return 0 + return FALSE else if(locate(/obj/machinery/shieldwallgen) in T) var/obj/machinery/shieldwallgen/S = locate(/obj/machinery/shieldwallgen) in T if(S && S.active) - return 0 - return 1 + return FALSE + return TRUE /obj/singularity/proc/event() @@ -397,11 +397,11 @@ mezzer() if(3,4) //Sets all nearby mobs on fire if(current_size < STAGE_SIX) - return 0 + return FALSE combust_mobs() else - return 0 - return 1 + return FALSE + return TRUE /obj/singularity/proc/combust_mobs() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 0f0f853036db..4c5502a27776 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -264,7 +264,7 @@ tracker = TRUE qdel(W) user.visible_message("[user] inserts the electronics into the solar assembly.", "You insert the electronics into the solar assembly.") - return 1 + return TRUE else if(W.tool_behaviour == TOOL_CROWBAR) new /obj/item/electronics/tracker(src.loc) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index a8f33ab07c8e..5096c5488940 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -720,7 +720,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(damage > explosion_point) countdown() - return 1 + return TRUE /obj/machinery/power/supermatter_crystal/bullet_act(obj/item/projectile/Proj) var/turf/L = loc diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index c32bbc0c8684..2a6df54e9b55 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -194,6 +194,6 @@ if(anchored && !panel_open) flick("grounding_rodhit", src) zap_buckle_check(power) - return 0 + return FALSE else . = ..() diff --git a/code/modules/procedural_mapping/mapGenerator.dm b/code/modules/procedural_mapping/mapGenerator.dm index 323f74d0efe6..3592e3bb1ff7 100644 --- a/code/modules/procedural_mapping/mapGenerator.dm +++ b/code/modules/procedural_mapping/mapGenerator.dm @@ -37,7 +37,7 @@ //Returns the map /datum/mapGenerator/proc/defineRegion(turf/Start, turf/End, replace = 0) if(!checkRegion(Start, End)) - return 0 + return FALSE if(replace) undefineRegion() @@ -49,7 +49,7 @@ //Returns the map /datum/mapGenerator/proc/defineCircularRegion(turf/Start, turf/End, replace = 0) if(!checkRegion(Start, End)) - return 0 + return FALSE var/centerX = max(abs((End.x+Start.x)/2),1) var/centerY = max(abs((End.y+Start.y)/2),1) @@ -92,7 +92,7 @@ . = 1 if(!Start || !End) - return 0 //Just bail + return FALSE //Just bail if(Start.x > world.maxx || End.x > world.maxx) . = 0 diff --git a/code/modules/procedural_mapping/mapGeneratorModule.dm b/code/modules/procedural_mapping/mapGeneratorModule.dm index 3a78d8385ed4..790d98576e84 100644 --- a/code/modules/procedural_mapping/mapGeneratorModule.dm +++ b/code/modules/procedural_mapping/mapGeneratorModule.dm @@ -28,7 +28,7 @@ //Place a spawnable atom or turf on this turf /datum/mapGeneratorModule/proc/place(turf/T) if(!T) - return 0 + return FALSE var/clustering = 0 var/skipLoopIteration = FALSE @@ -107,7 +107,7 @@ /datum/mapGeneratorModule/proc/checkPlaceAtom(turf/T) . = 1 if(!T) - return 0 + return FALSE if(T.density) . = 0 for(var/atom/A in T) diff --git a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm index 18607b919aba..6f5efc32c7a1 100644 --- a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm +++ b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm @@ -61,8 +61,8 @@ for(var/direction in list(SOUTH,EAST,WEST,NORTH)) if (get_step(T,direction) in mother.map) continue - return 1 - return 0 + return TRUE + return FALSE /datum/mapGenerator/repressurize modules = list(/datum/mapGeneratorModule/bottomLayer/repressurize) diff --git a/code/modules/procedural_mapping/mapGenerators/cellular.dm b/code/modules/procedural_mapping/mapGenerators/cellular.dm index 5fc1344dc4eb..cf0423d2fdf1 100644 --- a/code/modules/procedural_mapping/mapGenerators/cellular.dm +++ b/code/modules/procedural_mapping/mapGenerators/cellular.dm @@ -78,10 +78,10 @@ value -= old_state[i][j] if(value in b_rule) - return 1 + return TRUE if(value in s_rule) return old_state[i][j] - return 0 + return FALSE /datum/mapGenerator/ca/caves b_rule = list(5,6,7,8) diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm index 437b7dcc5ab6..4190db780369 100644 --- a/code/modules/projectiles/ammunition/_firing.dm +++ b/code/modules/projectiles/ammunition/_firing.dm @@ -19,7 +19,7 @@ user.DelayNextAction(considered_action = TRUE, immediate = FALSE) user.newtonian_move(get_dir(target, user)) update_icon() - return 1 + return TRUE /obj/item/ammo_casing/proc/ready_proj(atom/target, mob/living/user, quiet, zone_override = "", fired_from) if (!BB) @@ -52,7 +52,7 @@ /obj/item/ammo_casing/proc/throw_proj(atom/target, turf/targloc, mob/living/user, params, spread) var/turf/curloc = get_turf(user) if (!istype(targloc) || !istype(curloc) || !BB) - return 0 + return FALSE var/firing_dir if(BB.firer) @@ -68,7 +68,7 @@ BB.preparePixelProjectile(target, user, params, spread) BB.fire(null, direct_target) BB = null - return 1 + return TRUE /obj/item/ammo_casing/proc/spread(turf/target, turf/current, distro) var/dx = abs(target.x - current.x) diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index e44fcb38c8d3..3a84a6106c0f 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -51,12 +51,12 @@ /obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/R, replace_spent = 0) // Boxes don't have a caliber type, magazines do. Not sure if it's intended or not, but if we fail to find a caliber, then we fall back to ammo_type. if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type)) - return 0 + return FALSE if (stored_ammo.len < max_ammo) stored_ammo += R R.forceMove(src) - return 1 + return TRUE //for accessibles magazines (e.g internal ones) when full, start replacing spent ammo else if(replace_spent) @@ -67,12 +67,12 @@ stored_ammo += R R.forceMove(src) - return 1 + return TRUE - return 0 + return FALSE /obj/item/ammo_box/proc/can_load(mob/user) - return 1 + return TRUE /obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = FALSE, replace_spent = 0) var/num_loaded = 0 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 9efbe1cffb27..18feb97cf109 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -807,7 +807,7 @@ return ..() /obj/item/gun/proc/getinaccuracy(mob/living/user, bonus_spread, stamloss) - return 0 // Replacement TBD: Exponential curved aim instability system. + return FALSE // Replacement TBD: Exponential curved aim instability system. /* if(inaccuracy_modifier == 0) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 5c6aff556443..4d2bd844ae0d 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -48,8 +48,8 @@ /obj/item/gun/ballistic/can_shoot() if(!magazine || !magazine.ammo_count(0)) - return 0 - return 1 + return FALSE + return TRUE /obj/item/gun/ballistic/attackby(obj/item/A, mob/user, params) ..() @@ -68,7 +68,7 @@ playsound(src, "gun_insert_empty_magazine", 70, 1) A.update_icon() update_icon() - return 1 + return TRUE else to_chat(user, "You cannot seem to get \the [src] out of your hands!") return @@ -89,7 +89,7 @@ to_chat(user, "You screw [S] onto [src].") install_suppressor(A) return - return 0 + return FALSE /obj/item/gun/ballistic/proc/install_suppressor(obj/item/suppressor/S) // this proc assumes that the suppressor is already inside src @@ -205,7 +205,7 @@ slot_flags |= ITEM_SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally) sawn_off = TRUE update_icon() - return 1 + return TRUE /// is something supposed to happen here? /obj/item/gun/ballistic/proc/on_sawoff(mob/user) diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 4d0852024630..0bb1c3cada17 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -52,7 +52,7 @@ chamber_round() A.update_icon() update_icon() - return 1 + return TRUE else to_chat(user, "You cannot seem to get \the [src] out of your hands!") diff --git a/code/modules/projectiles/guns/ballistic/magweapon.dm b/code/modules/projectiles/guns/ballistic/magweapon.dm index f3a11eb17973..cdb88f754af8 100644 --- a/code/modules/projectiles/guns/ballistic/magweapon.dm +++ b/code/modules/projectiles/guns/ballistic/magweapon.dm @@ -37,13 +37,13 @@ /obj/item/gun/ballistic/automatic/magrifle/can_shoot() if(QDELETED(cell)) - return 0 + return FALSE var/obj/item/ammo_casing/caseless/magnetic/shot = chambered if(!shot) - return 0 + return FALSE if(cell.charge < shot.energy_cost * burst_size) - return 0 + return FALSE . = ..() /obj/item/gun/ballistic/automatic/magrifle/shoot_live_shot(mob/living/user, pointblank = FALSE, mob/pbtarget, message = 1, stam_cost = 0) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 0b92e63ca66f..48411791854c 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -37,7 +37,7 @@ /obj/item/gun/ballistic/shotgun/can_shoot() if(!chambered) - return 0 + return FALSE return (chambered.BB ? 1 : 0) /obj/item/gun/ballistic/shotgun/attack_self(mob/living/user) @@ -67,7 +67,7 @@ pump_unload(M) pump_reload(M) update_icon() //I.E. fix the desc - return 1 + return TRUE /obj/item/gun/ballistic/shotgun/proc/pump_unload(mob/M) if(chambered)//We have a shell in the chamber @@ -77,7 +77,7 @@ /obj/item/gun/ballistic/shotgun/proc/pump_reload(mob/M) if(!magazine.ammo_count()) - return 0 + return FALSE var/obj/item/ammo_casing/AC = magazine.get_round() //load next casing. chambered = AC @@ -147,7 +147,7 @@ pump_unload(M) bolt_open = !bolt_open update_icon() //I.E. fix the desc - return 1 + return TRUE /obj/item/gun/ballistic/shotgun/boltaction/attackby(obj/item/A, mob/user, params) if(!bolt_open) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 9c9ccd2b8d90..aa5fafac9bab 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -203,7 +203,7 @@ /obj/item/gun/energy/kinetic_accelerator/getstamcost(mob/living/carbon/user) if(user && !lavaland_equipment_pressure_check(get_turf(user))) - return 0 + return FALSE else return ..() diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 4192f038c23b..eaa0dae83da1 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -66,12 +66,12 @@ /obj/item/gun/magic/process() charge_tick++ if(charge_tick < recharge_rate || charges >= max_charges) - return 0 + return FALSE charge_tick = 0 charges++ if(charges == 1) recharge_newshot() - return 1 + return TRUE /obj/item/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj) to_chat(user, "The [name] whizzles quietly.") diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 98de59b00eaf..ed68edf96e4b 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -473,7 +473,7 @@ return 0.5 if(istype(target, /obj/structure/blob)) return 0.65 //CIT CHANGE. - return 1 + return TRUE /obj/item/projectile/beam/beam_rifle/proc/handle_impact(atom/target) if(isobj(target)) diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm index a88f395561a2..3372f7044453 100644 --- a/code/modules/projectiles/guns/misc/blastcannon.dm +++ b/code/modules/projectiles/guns/misc/blastcannon.dm @@ -72,20 +72,20 @@ //returns the third value of a bomb blast /obj/item/gun/blastcannon/proc/calculate_bomb() if(!istype(bomb) || !istype(bomb.tank_one) || !istype(bomb.tank_two)) - return 0 + return FALSE var/datum/gas_mixture/temp = new(max(reaction_volume_mod, 0)) bomb.merge_gases(temp) if(prereaction) temp.react(src) var/prereaction_pressure = temp.return_pressure() if(prereaction_pressure < TANK_FRAGMENT_PRESSURE) - return 0 + return FALSE for(var/i in 1 to reaction_cycles) temp.react(src) var/pressure = temp.return_pressure() qdel(temp) if(pressure < TANK_FRAGMENT_PRESSURE) - return 0 + return FALSE return ((pressure - TANK_FRAGMENT_PRESSURE) / TANK_FRAGMENT_SCALE) /obj/item/gun/blastcannon/afterattack(atom/target, mob/user, flag, params) diff --git a/code/modules/projectiles/guns/misc/medbeam.dm b/code/modules/projectiles/guns/misc/medbeam.dm index 4a64317fd9a8..a4ee003d7b45 100644 --- a/code/modules/projectiles/guns/misc/medbeam.dm +++ b/code/modules/projectiles/guns/misc/medbeam.dm @@ -87,7 +87,7 @@ if(mounted) user_turf = get_turf(user) else if(!istype(user_turf)) - return 0 + return FALSE var/obj/dummy = new(user_turf) dummy.pass_flags |= PASSTABLE|PASSGLASS|PASSGRILLE //Grille/Glass so it can be used through common windows for(var/turf/turf in getline(user_turf,target)) @@ -95,18 +95,18 @@ continue //Mechs are dense and thus fail the check if(turf.density) qdel(dummy) - return 0 + return FALSE for(var/atom/movable/AM in turf) if(!AM.CanPass(dummy,turf,1)) qdel(dummy) - return 0 + return FALSE for(var/obj/effect/ebeam/medical/B in turf)// Don't cross the str-beams! if(B.owner.origin != current_beam.origin) explosion(B.loc,0,3,5,8) qdel(dummy) - return 0 + return FALSE qdel(dummy) - return 1 + return TRUE /obj/item/gun/medbeam/proc/on_beam_hit(var/mob/living/target) return diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm index 8de7633a7993..7ced76918c83 100644 --- a/code/modules/projectiles/guns/misc/syringe_gun.dm +++ b/code/modules/projectiles/guns/misc/syringe_gun.dm @@ -38,18 +38,18 @@ /obj/item/gun/syringe/attack_self(mob/living/user) if(!syringes.len) to_chat(user, "[src] is empty!") - return 0 + return FALSE var/obj/item/reagent_containers/syringe/S = syringes[syringes.len] if(!S) - return 0 + return FALSE S.forceMove(user.loc) syringes.Remove(S) to_chat(user, "You unload [S] from \the [src].") - return 1 + return TRUE /obj/item/gun/syringe/attackby(obj/item/A, mob/user, params, show_msg = TRUE) if(istype(A, /obj/item/reagent_containers/syringe)) diff --git a/code/modules/reagents/chem_splash.dm b/code/modules/reagents/chem_splash.dm index b16392ecd161..36d75bf7dd16 100644 --- a/code/modules/reagents/chem_splash.dm +++ b/code/modules/reagents/chem_splash.dm @@ -73,6 +73,6 @@ splash_holder.reaction(A, TOUCH, fraction) qdel(splash_holder) - return 1 + return TRUE diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 77d713047a94..57e7d660b317 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -552,7 +552,7 @@ fermiIsReacting = FALSE SSblackbox.record_feedback("tally", "fermi_chem", 1, ("[Ferm] explosion")) Ferm.FermiExplode(src, my_atom, volume = total_volume, temp = chem_temp, pH = pH) - return 0 + return FALSE //This is just to calc the on_reaction multiplier, and is a candidate for removal. for(var/B in cached_required_reagents) @@ -561,11 +561,11 @@ targetVol = cached_results[P]*multiplier if(!((chem_temp <= C.ExplodeTemp) && (chem_temp >= C.OptimalTempMin))) - return 0 //Not hot enough + return FALSE //Not hot enough if(! ((pH >= (C.OptimalpHMin - C.ReactpHLim)) && (pH <= (C.OptimalpHMax + C.ReactpHLim)) ))//To prevent pointless reactions - return 0 + return FALSE if (fermiIsReacting) - return 0 + return FALSE else START_PROCESSING(SSprocessing, src) selected_reaction.on_reaction(src, my_atom, multiplier) @@ -581,7 +581,7 @@ fermiIsReacting = FALSE SSblackbox.record_feedback("tally", "fermi_chem", 1, ("[Ferm] explosion")) Ferm.FermiExplode(src, my_atom, volume = total_volume, temp = chem_temp, pH = pH) - return 0 + return FALSE for(var/B in cached_required_reagents) // multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), CHEMICAL_QUANTISATION_LEVEL)) @@ -621,7 +621,7 @@ while(reaction_occurred) update_total() - return 0 + return FALSE /datum/reagents/process() var/datum/chemical_reaction/C = fermiReactID @@ -838,7 +838,7 @@ update_total() if(my_atom) my_atom.on_reagent_change(DEL_REAGENT) - return 1 + return TRUE /datum/reagents/proc/update_total() var/list/cached_reagents = reagent_list @@ -853,7 +853,7 @@ total_volume += R.volume if(!reagent_list || !total_volume) pH = REAGENT_NORMAL_PH - return 0 + return FALSE /datum/reagents/proc/clear_reagents() var/list/cached_reagents = reagent_list @@ -861,7 +861,7 @@ var/datum/reagent/R = reagent del_reagent(R.type) pH = REAGENT_NORMAL_PH - return 0 + return FALSE /datum/reagents/proc/reaction(atom/A, method = TOUCH, volume_modifier = 1, show_message = 1, from_gas = 0) var/react_type @@ -1075,9 +1075,9 @@ if(round(R.volume, CHEMICAL_QUANTISATION_LEVEL) >= amount) return R else - return 0 + return FALSE - return 0 + return FALSE /datum/reagents/proc/get_reagent_amount(reagent) var/list/cached_reagents = reagent_list @@ -1086,7 +1086,7 @@ if (R.type == reagent) return round(R.volume, CHEMICAL_QUANTISATION_LEVEL) - return 0 + return FALSE /datum/reagents/proc/get_reagents() var/list/names = list() @@ -1099,7 +1099,7 @@ /datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. if(!isnum(amount)) - return 1 + return TRUE var/list/cached_reagents = reagent_list var/has_removed_reagent = 0 diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 0e53b0796bb1..8986d39008d7 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -440,7 +440,7 @@ num = round(num) return num else - return 0 + return FALSE /obj/machinery/chem_master/adjust_item_drop_location(atom/movable/AM) // Special version for chemmasters and condimasters diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 2fb8f580195a..65fdb382f928 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -71,14 +71,14 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) /datum/reagent/proc/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0) if(!istype(M)) - return 0 + return FALSE if(method == VAPOR) //smoke, foam, spray if(M.reagents) var/modifier = clamp((1 - touch_protection), 0, 1) var/amount = round(reac_volume*modifier, 0.1) if(amount >= 0.5) M.reagents.add_reagent(type, amount) - return 1 + return TRUE /datum/reagent/proc/reaction_obj(obj/O, volume) if(O && volume && boiling_point) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index af670c00dc13..106de6474644 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -86,7 +86,7 @@ /datum/reagent/toxin/plasma/reaction_obj(obj/O, reac_volume) if((!O) || (!reac_volume)) - return 0 + return FALSE var/temp = holder ? holder.chem_temp : T20C O.atmos_spawn_air("plasma=[reac_volume];TEMP=[temp]") diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index df794f484264..b4c7779634c7 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -75,7 +75,7 @@ /obj/item/reagent_containers/proc/canconsume(mob/eater, mob/user) if(!iscarbon(eater)) - return 0 + return FALSE var/mob/living/carbon/C = eater var/covered = "" if(C.is_mouth_covered(head_only = 1)) @@ -85,8 +85,8 @@ if(covered) var/who = (isnull(user) || eater == user) ? "your" : "[eater.p_their()]" to_chat(user, "You have to remove [who] [covered] first!") - return 0 - return 1 + return FALSE + return TRUE /obj/item/reagent_containers/ex_act(severity, target, origin) if(reagents) diff --git a/code/modules/reagents/reagent_containers/borghypo.dm b/code/modules/reagents/reagent_containers/borghypo.dm index 0b3e5bcf75ac..a581463da2ef 100644 --- a/code/modules/reagents/reagent_containers/borghypo.dm +++ b/code/modules/reagents/reagent_containers/borghypo.dm @@ -53,7 +53,7 @@ Borg Hypospray charge_tick = 0 //update_icon() - return 1 + return TRUE // Use this to add more chemicals for the borghypo to produce. /obj/item/reagent_containers/borghypo/proc/add_reagent(datum/reagent/reagent) diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm index 8cf98008db2e..1549859cb267 100644 --- a/code/modules/reagents/reagent_containers/patch.dm +++ b/code/modules/reagents/reagent_containers/patch.dm @@ -28,8 +28,8 @@ /obj/item/reagent_containers/pill/patch/canconsume(mob/eater, mob/user) if(!iscarbon(eater)) - return 0 - return 1 // Masks were stopping people from "eating" patches. Thanks, inheritance. + return FALSE + return TRUE // Masks were stopping people from "eating" patches. Thanks, inheritance. /obj/item/reagent_containers/pill/patch/styptic name = "brute patch" diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index c1812d9121d7..c579938e4680 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -189,7 +189,7 @@ if(reagents && reagents.total_volume) return clamp(round((reagents.total_volume / volume * 15),5), 1, 15) else - return 0 + return FALSE /obj/item/reagent_containers/syringe/epinephrine name = "syringe (epinephrine)" diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 8e4db6f2f279..fb3f775bb004 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -18,7 +18,7 @@ /obj/structure/reagent_dispensers/attackby(obj/item/W, mob/user, params) if(W.is_refillable()) - return 0 //so we can refill them via their afterattack. + return FALSE //so we can refill them via their afterattack. else return ..() diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index 6c85bfc3ee61..5dd0163204a0 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -140,7 +140,7 @@ /obj/structure/disposalpipe/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(damage_flag == MELEE && damage_amount < 10) - return 0 + return FALSE return ..() diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 30d0c70566eb..1b3d0974fd47 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -107,7 +107,7 @@ /obj/machinery/rnd/production/proc/check_mat(datum/design/being_built, var/mat) // now returns how many times the item can be built with the material if (!materials.mat_container) // no connected silo - return 0 + return FALSE var/list/all_materials = being_built.reagents_list + being_built.materials var/A = materials.mat_container.get_material_amount(mat) @@ -344,10 +344,10 @@ var/datum/component/material_container/mat_container = materials.mat_container if (!mat_container) say("No access to material storage, please contact the quartermaster.") - return 0 + return FALSE if (materials.on_hold()) say("Mineral access is on hold, please contact the quartermaster.") - return 0 + return FALSE var/count = mat_container.retrieve_sheets(text2num(eject_amt), eject_sheet, drop_location()) var/list/matlist = list() matlist[eject_sheet] = MINERAL_MATERIAL_AMOUNT diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index 00748d260993..63fb75abc540 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -24,7 +24,7 @@ /obj/item/gun/magic/bloodchill/process() charge_tick++ if(charge_tick < recharge_rate || charges >= max_charges) - return 0 + return FALSE charge_tick = 0 var/mob/living/M = loc if(istype(M) && M.blood_volume >= 5) @@ -32,7 +32,7 @@ M.blood_volume -= 5 if(charges == 1) recharge_newshot() - return 1 + return TRUE /obj/item/ammo_casing/magic/bloodchill projectile_type = /obj/item/projectile/magic/bloodchill diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index dd2579663a8b..50b8692f8748 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -47,7 +47,7 @@ //Effect when activated by a Luminescent. Separated into a minor and major effect. Returns cooldown in deciseconds. /obj/item/slime_extract/proc/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) to_chat(user, "Nothing happened... This slime extract cannot be activated this way.") - return 0 + return FALSE //Core-crossing: Feeding adult slimes extracts to obtain a much more powerful, single extract. /obj/item/slime_extract/attack(mob/living/simple_animal/slime/M, mob/user) @@ -97,7 +97,7 @@ to_chat(user, "You spit out [S].") return 350 else - return 0 + return FALSE /obj/item/slime_extract/gold name = "gold slime extract" diff --git a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm index c8bc4b056831..e78628dcd64a 100644 --- a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm +++ b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm @@ -85,7 +85,7 @@ to_chat(user, "You fill in the oil well with soil.") O.play_tool_sound(src) deconstruct() - return 1 + return TRUE if(istype(O, /obj/item/reagent_containers)) //Refilling bottles with oil var/obj/item/reagent_containers/RG = O if(RG.is_refillable()) @@ -97,7 +97,7 @@ return FALSE if(user.a_intent != INTENT_HARM) to_chat(user, "You won't have any luck getting \the [O] out if you drop it in the oil.") - return 1 + return TRUE else return ..() @@ -170,14 +170,14 @@ user.gain_trauma(/datum/brain_trauma/magic/stalker) to_chat(user, "Oh no, no no no, THEY'RE EVERYWHERE! EVERY ONE OF THEM IS EVERYWHERE!") first_open = FALSE - return 1 - return 1 + return TRUE + return TRUE else to_chat(user, "You can't dig up a grave with \the [S.name].") - return 1 + return TRUE else to_chat(user, "The grave has already been dug up.") - return 1 + return TRUE else if((user.a_intent != INTENT_HELP) && opened) //checks to attempt to remove the grave entirely. if(istype(S,cutting_tool) && S.tool_behaviour == TOOL_SHOVEL) @@ -186,7 +186,7 @@ to_chat(user, "You remove \the [src] completely.") SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "graverobbing", /datum/mood_event/graverobbing) deconstruct(TRUE) - return 1 + return TRUE return /obj/structure/closet/crate/grave/bust_open() diff --git a/code/modules/ruins/lavalandruin_code/puzzle.dm b/code/modules/ruins/lavalandruin_code/puzzle.dm index 136acc7da780..45d3dd53a8f0 100644 --- a/code/modules/ruins/lavalandruin_code/puzzle.dm +++ b/code/modules/ruins/lavalandruin_code/puzzle.dm @@ -127,12 +127,12 @@ if(A.y > B.y) return -1 if(A.y < B.y) - return 1 + return TRUE if(A.x > B.x) - return 1 + return TRUE if(A.x < B.x) return -1 - return 0 + return FALSE /obj/effect/sliding_puzzle/proc/elements_in_order() return sortTim(elements,cmp=/proc/cmp_xy_desc) @@ -207,7 +207,7 @@ /obj/structure/puzzle_element/Move(nloc, dir) if(!isturf(nloc) || moving_diagonally || get_dist(get_step(src,dir),get_turf(source)) > 1) - return 0 + return FALSE else return ..() diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm index 94abd1ef0ab9..2c8d9e3237e3 100644 --- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm +++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm @@ -57,7 +57,7 @@ return QDEL_HINT_LETMELIVE /obj/structure/necropolis_gate/singularity_pull() - return 0 + return FALSE /obj/structure/necropolis_gate/CanAllowThrough(atom/movable/mover, turf/target) . = ..() @@ -67,7 +67,7 @@ /obj/structure/necropolis_gate/CheckExit(atom/movable/O, target) if(get_dir(O.loc, target) == dir) return !density - return 1 + return TRUE /obj/structure/opacity_blocker icon = 'icons/effects/96x96.dmi' @@ -81,7 +81,7 @@ anchored = TRUE /obj/structure/opacity_blocker/singularity_pull() - return 0 + return FALSE /obj/structure/opacity_blocker/Destroy(force) if(force) @@ -236,7 +236,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) add_overlay(top_overlay) /obj/structure/necropolis_arch/singularity_pull() - return 0 + return FALSE /obj/structure/necropolis_arch/Destroy(force) if(force) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 1fc81e38b849..5cb4a083cb53 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -76,7 +76,7 @@ /obj/docking_port/singularity_pull() return /obj/docking_port/singularity_act() - return 0 + return FALSE /obj/docking_port/shuttleRotate() return //we don't rotate with shuttles via this code. @@ -954,7 +954,7 @@ /obj/docking_port/mobile/proc/get_engine_coeff(current,engine_mod) var/new_value = max(0,current + engine_mod) if(new_value == initial_engines) - return 1 + return TRUE if(new_value > initial_engines) var/delta = new_value - initial_engines var/change_per_engine = (1 - ENGINE_COEFF_MIN) / ENGINE_DEFAULT_MAXSPEED_ENGINES // 5 by default diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 68207491a5b7..28cb9ac36c8c 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -220,7 +220,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th /obj/effect/proc_holder/spell/Trigger(mob/user, skip_can_cast = TRUE) if(cast_check(FALSE, user, skip_can_cast)) choose_targets() - return 1 + return TRUE /obj/effect/proc_holder/spell/proc/choose_targets(mob/user = usr) //depends on subtype - /targeted or /aoe_turf return @@ -449,9 +449,9 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th for(var/atom/movable/AM in turf) if(!AM.CanPass(dummy,turf,1)) qdel(dummy) - return 0 + return FALSE qdel(dummy) - return 1 + return TRUE /obj/effect/proc_holder/spell/proc/can_cast(mob/user = usr, skipcharge = FALSE, silent = FALSE) var/magic_flags = SEND_SIGNAL(user, COMSIG_MOB_SPELL_CAN_CAST, src) diff --git a/code/modules/spells/spell_types/lightning.dm b/code/modules/spells/spell_types/lightning.dm index f5aaca2a8782..b62cd4ab0486 100644 --- a/code/modules/spells/spell_types/lightning.dm +++ b/code/modules/spells/spell_types/lightning.dm @@ -18,7 +18,7 @@ /obj/effect/proc_holder/spell/targeted/tesla/Trigger(mob/user, skip_can_cast = TRUE) if(!ready && cast_check(FALSE, user, skip_can_cast)) StartChargeup(user) - return 1 + return TRUE /obj/effect/proc_holder/spell/targeted/tesla/proc/StartChargeup(mob/user = usr) ready = 1 diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm index 2c3524a598aa..a7c0bb104ef1 100644 --- a/code/modules/surgery/amputation.dm +++ b/code/modules/surgery/amputation.dm @@ -25,4 +25,4 @@ if(surgery.operated_bodypart) var/obj/item/bodypart/target_limb = surgery.operated_bodypart target_limb.drop_limb() - return 1 + return TRUE diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 9be468079b45..ed802781b3e8 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -94,10 +94,10 @@ //sometimes we want to ignore that we don't have the required amount of arms. /mob/proc/get_arm_ignore() - return 0 + return FALSE /mob/living/carbon/alien/larva/get_arm_ignore() - return 1 //so we can still handcuff larvas. + return TRUE //so we can still handcuff larvas. /mob/proc/get_num_legs(check_disabled = TRUE) diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm index 7cc545027c50..1b23568a6d80 100644 --- a/code/modules/surgery/cavity_implant.dm +++ b/code/modules/surgery/cavity_implant.dm @@ -38,14 +38,14 @@ if(tool) if(IC || tool.w_class > WEIGHT_CLASS_NORMAL || HAS_TRAIT(tool, TRAIT_NODROP) || istype(tool, /obj/item/organ)) to_chat(user, "You can't seem to fit [tool] in [target]'s [target_zone]!") - return 0 + return FALSE else display_results(user, target, "You stuff [tool] into [target]'s [target_zone].", "[user] stuffs [tool] into [target]'s [target_zone]!", "[user] stuffs [tool.w_class > WEIGHT_CLASS_SMALL ? tool : "something"] into [target]'s [target_zone].") user.transferItemToLoc(tool, target, TRUE) CH.cavity_item = tool - return 1 + return TRUE else if(IC) display_results(user, target, "You pull [IC] out of [target]'s [target_zone].", @@ -53,7 +53,7 @@ "[user] pulls [IC.w_class > WEIGHT_CLASS_SMALL ? IC : "something"] out of [target]'s [target_zone].") user.put_in_hands(IC) CH.cavity_item = null - return 1 + return TRUE else to_chat(user, "You don't find anything in [target]'s [target_zone].") - return 0 + return FALSE diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm index 683663c241d4..131e56e6b6a7 100644 --- a/code/modules/surgery/core_removal.dm +++ b/code/modules/surgery/core_removal.dm @@ -8,8 +8,8 @@ /datum/surgery/core_removal/can_start(mob/user, mob/living/target, obj/item/tool) if(target.stat == DEAD) - return 1 - return 0 + return TRUE + return FALSE //extract brain /datum/surgery_step/extract_core name = "extract core" @@ -33,9 +33,9 @@ if(slime.cores <= 0) slime.icon_state = "[slime.colour] baby slime dead-nocore" - return 1 + return TRUE else - return 0 + return FALSE else to_chat(user, "There aren't any cores left in [target]!") - return 1 + return TRUE diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index 6f55cb0c4657..e8d0564c62aa 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -14,7 +14,7 @@ /datum/surgery_step/insert_pill/success(mob/user, mob/living/carbon/target, target_zone, var/obj/item/reagent_containers/pill/tool, datum/surgery/surgery) if(!istype(tool)) - return 0 + return FALSE user.transferItemToLoc(tool, target, TRUE) @@ -25,18 +25,18 @@ pill_action.Grant(target) //The pill never actually goes in an inventory slot, so the owner doesn't inherit actions from it user.visible_message("[user] wedges \the [tool] into [target]'s [parse_zone(target_zone)]!", "You wedge [tool] into [target]'s [parse_zone(target_zone)].") - return 1 + return TRUE /datum/action/item_action/hands_free/activate_pill name = "Activate Pill" /datum/action/item_action/hands_free/activate_pill/Trigger() if(!..()) - return 0 + return FALSE to_chat(owner, "You grit your teeth and burst the implanted [target.name]!") log_combat(owner, null, "swallowed an implanted pill", target) if(target.reagents.total_volume) target.reagents.reaction(owner, INGEST) target.reagents.trans_to(owner, target.reagents.total_volume, log = "dental pill swallow") qdel(target) - return 1 + return TRUE diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm index 652c49519a11..7cd315656f2f 100644 --- a/code/modules/surgery/helpers.dm +++ b/code/modules/surgery/helpers.dm @@ -97,7 +97,7 @@ else if(!current_surgery.step_in_progress) attempt_cancel_surgery(current_surgery, I, M, user) - return 1 + return TRUE /proc/attempt_cancel_surgery(datum/surgery/S, obj/item/I, mob/living/M, mob/user) var/selected_zone = user.zone_selected @@ -128,7 +128,7 @@ /proc/get_location_modifier(mob/M) var/turf/T = get_turf(M) if(locate(/obj/structure/table/optable, T)) - return 1 + return TRUE else if(locate(/obj/structure/table, T)) return 0.8 else if(locate(/obj/structure/bed, T)) @@ -157,42 +157,42 @@ switch(location) if(BODY_ZONE_HEAD) if(covered_locations & HEAD) - return 0 + return FALSE if(BODY_ZONE_PRECISE_EYES) if(covered_locations & HEAD || face_covered & HIDEEYES || eyesmouth_covered & GLASSESCOVERSEYES) - return 0 + return FALSE if(BODY_ZONE_PRECISE_MOUTH) if(covered_locations & HEAD || face_covered & HIDEFACE || eyesmouth_covered & MASKCOVERSMOUTH || eyesmouth_covered & HEADCOVERSMOUTH) - return 0 + return FALSE if(BODY_ZONE_CHEST) if(covered_locations & CHEST) - return 0 + return FALSE if(BODY_ZONE_PRECISE_GROIN) if(covered_locations & GROIN) - return 0 + return FALSE if(BODY_ZONE_L_ARM) if(covered_locations & ARM_LEFT) - return 0 + return FALSE if(BODY_ZONE_R_ARM) if(covered_locations & ARM_RIGHT) - return 0 + return FALSE if(BODY_ZONE_L_LEG) if(covered_locations & LEG_LEFT) - return 0 + return FALSE if(BODY_ZONE_R_LEG) if(covered_locations & LEG_RIGHT) - return 0 + return FALSE if(BODY_ZONE_PRECISE_L_HAND) if(covered_locations & HAND_LEFT) - return 0 + return FALSE if(BODY_ZONE_PRECISE_R_HAND) if(covered_locations & HAND_RIGHT) - return 0 + return FALSE if(BODY_ZONE_PRECISE_L_FOOT) if(covered_locations & FOOT_LEFT) - return 0 + return FALSE if(BODY_ZONE_PRECISE_R_FOOT) if(covered_locations & FOOT_RIGHT) - return 0 + return FALSE - return 1 + return TRUE diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm index 5162fafbc041..6cfabdeb966b 100644 --- a/code/modules/surgery/implant_removal.dm +++ b/code/modules/surgery/implant_removal.dm @@ -50,7 +50,7 @@ else to_chat(user, "You can't find anything in [target]'s [target_zone]!") - return 1 + return TRUE /datum/surgery/implant_removal/mechanic name = "implant removal" diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm index ecdc5477f1a6..4689b2e40c96 100644 --- a/code/modules/surgery/lipoplasty.dm +++ b/code/modules/surgery/lipoplasty.dm @@ -6,8 +6,8 @@ /datum/surgery/lipoplasty/can_start(mob/user, mob/living/carbon/target, obj/item/tool) if(HAS_TRAIT(target, TRAIT_FAT)) - return 1 - return 0 + return TRUE + return FALSE //cut fat /datum/surgery_step/cut_fat @@ -24,7 +24,7 @@ display_results(user, target, "You cut [target]'s excess fat loose.", "[user] cuts [target]'s excess fat loose!", "[user] finishes the cut on [target]'s [target_zone].") - return 1 + return TRUE //remove fat /datum/surgery_step/remove_fat @@ -56,4 +56,4 @@ newmeat.subjectjob = H.job newmeat.reagents.add_reagent (/datum/reagent/consumable/nutriment, (removednutriment / 15)) //To balance with nutriment_factor of nutriment newmeat.forceMove(target.loc) - return 1 + return TRUE diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index fb18d6d1550c..2ff6f9e1f95b 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -157,4 +157,4 @@ display_results(user, target, "You can't extract anything from [target]'s [parse_zone(target_zone)]!", "[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!", "[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!") - return 1 + return TRUE diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm index 9e93042f63a9..0e4f1032109a 100644 --- a/code/modules/surgery/organic_steps.dm +++ b/code/modules/surgery/organic_steps.dm @@ -120,7 +120,7 @@ display_results(user, target, "You saw [target]'s [parse_zone(target_zone)] open.", "[user] saws [target]'s [parse_zone(target_zone)] open!", "[user] saws [target]'s [parse_zone(target_zone)] open!") - return 1 + return TRUE //drill bone /datum/surgery_step/drill @@ -137,4 +137,4 @@ display_results(user, target, "You drill into [target]'s [parse_zone(target_zone)].", "[user] drills into [target]'s [parse_zone(target_zone)]!", "[user] drills into [target]'s [parse_zone(target_zone)]!") - return 1 + return TRUE diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 420810d7d2fb..c0242248a70e 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -166,7 +166,7 @@ if(crit_fail || (organ_flags & ORGAN_FAILING)) if(!silent) to_chat(owner, "Your thrusters set seems to be broken!") - return 0 + return FALSE on = TRUE if(allow_thrust(0.01)) ion_trail.start() @@ -195,28 +195,28 @@ /obj/item/organ/cyberimp/chest/thrusters/proc/allow_thrust(num) if(!on || !owner) - return 0 + return FALSE var/turf/T = get_turf(owner) if(!T) // No more runtimes from being stuck in nullspace. - return 0 + return FALSE // Priority 1: use air from environment. var/datum/gas_mixture/environment = T.return_air() if(environment && environment.return_pressure() > 30) - return 1 + return TRUE // Priority 2: use plasma from internal plasma storage. // (just in case someone would ever use this implant system to make cyber-alien ops with jetpacks and taser arms) if(owner.getPlasma() >= num*100) owner.adjustPlasma(-num*100) - return 1 + return TRUE // Priority 3: use internals tank. var/obj/item/tank/I = owner.internal if(I && I.air_contents && I.air_contents.total_moles() >= num) T.assume_air_moles(I.air_contents, num) - return 1 + return TRUE toggle(silent = TRUE) - return 0 + return FALSE diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 6263284584b0..4ca6ff280678 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -49,12 +49,12 @@ /obj/item/organ/heart/proc/Stop() beating = 0 update_icon() - return 1 + return TRUE /obj/item/organ/heart/proc/Restart() beating = 1 update_icon() - return 1 + return TRUE /obj/item/organ/heart/proc/HeartStrengthMessage() if(beating) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index d4a26633741f..a41b2046a095 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -245,7 +245,7 @@ //Try code/modules/mob/living/carbon/brain/brain_item.dm /mob/living/proc/regenerate_organs() - return 0 + return FALSE /mob/living/carbon/regenerate_organs(only_one = FALSE) var/breathes = TRUE diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index e41980cdd3bd..cbddd8db2f5d 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -134,7 +134,7 @@ var/cooldown = 0 if(!user || !user.can_speak() || user.stat) - return 0 //no cooldown + return FALSE //no cooldown var/log_message = uppertext(message) if(iscultist(user)) @@ -597,7 +597,7 @@ var/special_check = get_vog_special(user) if(!special_check) - return 0 + return FALSE . = min(base_multiplier * special_check, VOG_MAX_STANDARD_POWER) // anything above should require conscious admin fuckery, as things are balanced around 3 multiplier tops (see: damage being 15*3) if(!specific_listeners.len) @@ -617,7 +617,7 @@ return 0.5 if(user.mind.assigned_role in GLOB.command_positions) return 1.4 // heads are great at speaking with authority - return 1 + return TRUE ////////////////////////////////////// ///////ENTHRAL VELVET CHORDS////////// @@ -665,7 +665,7 @@ /proc/velvetspeech(message, mob/living/user, base_multiplier = 1, message_admins = FALSE, debug = FALSE) if(!user || !user.can_speak() || user.stat) - return 0 //no cooldown + return FALSE //no cooldown var/log_message = message @@ -688,7 +688,7 @@ listeners += L if(!listeners.len) - return 0 + return FALSE //POWER CALCULATIONS diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index b0102da7b76a..a40fac66400c 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -7,10 +7,10 @@ requires_bodypart_type = 0 /datum/surgery/prosthetic_replacement/can_start(mob/user, mob/living/carbon/target, obj/item/tool) if(!iscarbon(target)) - return 0 + return FALSE var/mob/living/carbon/C = target if(!C.get_bodypart(user.zone_selected)) //can only start if limb is missing - return 1 + return TRUE /datum/surgery_step/add_prosthetic name = "add prosthetic" implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100, /obj/item/chainsaw = 100, /obj/item/melee/synthetic_arm_blade = 100) @@ -70,7 +70,7 @@ display_results(user, target, "You succeed in replacing [target]'s [parse_zone(target_zone)].", "[user] successfully replaces [target]'s [parse_zone(target_zone)] with [tool]!", "[user] successfully replaces [target]'s [parse_zone(target_zone)]!") - return 1 + return TRUE else var/obj/item/bodypart/L = target.newBodyPart(target_zone, FALSE, FALSE) L.is_pseudopart = TRUE @@ -82,8 +82,8 @@ if(istype(tool, /obj/item/chainsaw)) var/obj/item/mounted_chainsaw/new_arm = new(target) target_zone == BODY_ZONE_R_ARM ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm) - return 1 + return TRUE else if(istype(tool, /obj/item/melee/synthetic_arm_blade)) var/obj/item/melee/arm_blade/new_arm = new(target,TRUE,TRUE) target_zone == BODY_ZONE_R_ARM ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm) - return 1 + return TRUE diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm index dfdb1f7eca50..e2304d514b31 100644 --- a/code/modules/surgery/remove_embedded_object.dm +++ b/code/modules/surgery/remove_embedded_object.dm @@ -40,4 +40,4 @@ else to_chat(user, "You can't find [target]'s [parse_zone(user.zone_selected)], let alone any objects embedded in it!") - return 1 + return TRUE diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 9e39ec58e815..0b71c5fbad93 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -94,7 +94,7 @@ /datum/surgery/proc/next_step(mob/user, intent) if(step_in_progress) - return 1 + return TRUE var/try_to_fail = FALSE if(intent == INTENT_DISARM) diff --git a/code/modules/unit_tests/vore_tests.dm b/code/modules/unit_tests/vore_tests.dm index 6549aa9ce7fe..3a8df28479d9 100644 --- a/code/modules/unit_tests/vore_tests.dm +++ b/code/modules/unit_tests/vore_tests.dm @@ -35,11 +35,11 @@ H = new(T) startOxyloss = H.getOxyLoss() - return 1 + return TRUE /datum/unit_test/space_suffocation/check_result() if(H.life_tick < 10) - return 0 + return FALSE endOxyloss = H.getOxyLoss() @@ -47,7 +47,7 @@ Fail("Human mob is not taking oxygen damage in space. (Before: [startOxyloss]; after: [endOxyloss])") qdel(H) - return 1 + return TRUE /datum/unit_test/belly_nonsuffocation name = "MOB: human mob does not suffocate in a belly" diff --git a/code/modules/vehicles/mecha/combat/neovgre.dm b/code/modules/vehicles/mecha/combat/neovgre.dm index 7e40a1c35203..feb14e3f2483 100644 --- a/code/modules/vehicles/mecha/combat/neovgre.dm +++ b/code/modules/vehicles/mecha/combat/neovgre.dm @@ -98,5 +98,5 @@ /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre/can_attach(obj/vehicle/sealed/mecha/combat/neovgre/M) if(istype(M)) - return 1 - return 0 + return TRUE + return FALSE diff --git a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm index cb9e471ff84b..b57fc44c6392 100644 --- a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm @@ -9,7 +9,7 @@ /obj/item/mecha_parts/mecha_equipment/medical/can_attach(obj/vehicle/sealed/mecha/medical/M) if(..() && istype(M)) - return 1 + return TRUE /obj/item/mecha_parts/mecha_equipment/medical/attach(obj/vehicle/sealed/mecha/M) @@ -46,7 +46,7 @@ return ..() /obj/item/mecha_parts/mecha_equipment/medical/sleeper/Exit(atom/movable/O) - return 0 + return FALSE /obj/item/mecha_parts/mecha_equipment/medical/sleeper/action(mob/source, mob/living/carbon/target, params) if(!action_checks(target)) @@ -197,7 +197,7 @@ /obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/inject_reagent(datum/reagent/R,obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/SG) if(!R || !patient || !SG || !(SG in chassis.equipment)) - return 0 + return FALSE var/to_inject = min(R.volume, inject_amount) if(to_inject && patient.reagents.get_reagent_amount(R.type) + to_inject <= inject_amount*2) to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]Injecting [patient] with [to_inject] units of [R.name].") @@ -213,7 +213,7 @@ send_byjax(chassis.occupants,"msleeper.browser","lossinfo",get_patient_dam()) send_byjax(chassis.occupants,"msleeper.browser","reagents",get_patient_reagents()) send_byjax(chassis.occupants,"msleeper.browser","injectwith",get_available_reagents()) - return 1 + return TRUE return /obj/item/mecha_parts/mecha_equipment/medical/sleeper/container_resist(mob/living/user) @@ -456,23 +456,23 @@ if(syringes.len= 2) to_chat(user, "[icon2html(src, user)]The syringe is too far away!") - return 0 + return FALSE for(var/obj/structure/D in S.loc)//Basic level check for structures in the way (Like grilles and windows) if(!(D.CanPass(S,src.loc))) to_chat(user, "[icon2html(src, user)]Unable to load syringe!") - return 0 + return FALSE for(var/obj/machinery/door/D in S.loc)//Checks for doors if(!(D.CanPass(S,src.loc))) to_chat(user, "[icon2html(src, user)]Unable to load syringe!") - return 0 + return FALSE S.reagents.trans_to(src, S.reagents.total_volume) S.forceMove(src) syringes += S to_chat(user, "[icon2html(src, user)]Syringe loaded.") update_equip_info() - return 1 + return TRUE to_chat(user, "[icon2html(src, user)][src]'s syringe chamber is full!") - return 0 + return FALSE /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/analyze_reagents(atom/A, mob/user) if(get_dist(src,A) >= 4) diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm index 348a4bb6ecf1..b25a8ae60049 100644 --- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm @@ -410,7 +410,7 @@ return units else to_chat(user, "[icon2html(src, user)]Unit is full.") - return 0 + return FALSE else to_chat(user, "[icon2html(src, user)][fuel] traces in target minimal! [P] cannot be used as fuel.") return diff --git a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm index dd9448a8265a..8c64384d7824 100644 --- a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm @@ -19,8 +19,8 @@ /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/can_attach(obj/vehicle/sealed/mecha/working/ripley/M) if(..()) if(istype(M)) - return 1 - return 0 + return TRUE + return FALSE /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/attach(obj/vehicle/sealed/mecha/M) ..() @@ -239,7 +239,7 @@ if(W.loc == my_target) break sleep(2) - return 1 + return TRUE /obj/item/mecha_parts/mecha_equipment/extinguisher/get_equip_info() return "[..()] \[[src.reagents.total_volume]\]" @@ -247,8 +247,8 @@ /obj/item/mecha_parts/mecha_equipment/extinguisher/can_attach(obj/vehicle/sealed/mecha/working/M as obj) if(..()) if(istype(M)) - return 1 - return 0 + return TRUE + return FALSE diff --git a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm index b8818ef3f7f4..9254bc2ed4b5 100644 --- a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm @@ -426,8 +426,8 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar/can_attach(obj/vehicle/sealed/mecha/combat/honker/M) if(..()) if(istype(M)) - return 1 - return 0 + return TRUE + return FALSE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar name = "mousetrap mortar" @@ -444,8 +444,8 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar/can_attach(obj/vehicle/sealed/mecha/combat/honker/M) if(..()) if(istype(M)) - return 1 - return 0 + return TRUE + return FALSE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar/proj_init(obj/item/assembly/mousetrap/armed/M) M.secured = 1 @@ -475,8 +475,8 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/can_attach(obj/vehicle/sealed/mecha/combat/honker/M) if(..()) if(istype(M)) - return 1 - return 0 + return TRUE + return FALSE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/get_equip_info() if(!chassis) diff --git a/code/modules/vehicles/mecha/mech_fabricator.dm b/code/modules/vehicles/mecha/mech_fabricator.dm index 29cc88a56367..91313690a035 100644 --- a/code/modules/vehicles/mecha/mech_fabricator.dm +++ b/code/modules/vehicles/mecha/mech_fabricator.dm @@ -632,10 +632,10 @@ var/datum/component/material_container/mat_container = rmat.mat_container if (!mat_container) say("No access to material storage, please contact the quartermaster.") - return 0 + return FALSE if (rmat.on_hold()) say("Mineral access is on hold, please contact the quartermaster.") - return 0 + return FALSE var/count = mat_container.retrieve_sheets(text2num(eject_amt), eject_sheet, drop_location()) var/list/matlist = list() matlist[eject_sheet] = text2num(eject_amt) diff --git a/code/modules/vehicles/mecha/mech_melee_attack.dm b/code/modules/vehicles/mecha/mech_melee_attack.dm index 2f5faea172c6..81784ddbd0c2 100644 --- a/code/modules/vehicles/mecha/mech_melee_attack.dm +++ b/code/modules/vehicles/mecha/mech_melee_attack.dm @@ -35,9 +35,9 @@ playsound(src, 'sound/items/welder.ogg', 50, TRUE) if(TOX) playsound(src, 'sound/effects/spray2.ogg', 50, TRUE) - return 0 + return FALSE else - return 0 + return FALSE mecha_attacker.visible_message("[mecha_attacker.name] hits [src]!", "You hit [src]!", null, COMBAT_MESSAGE_RANGE) return take_damage(mecha_attacker.force * 3, mech_damtype, MELEE, play_soundeffect, get_dir(src, mecha_attacker)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs. diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index 7208fdaa1521..b53156dba77c 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -24,7 +24,7 @@ /obj/vehicle/sealed/mecha/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) . = ..() if(!damage_amount) - return 0 + return FALSE var/booster_deflection_modifier = 1 var/booster_damage_modifier = 1 if(damage_flag == BULLET || damage_flag == LASER || damage_flag == ENERGY) @@ -47,7 +47,7 @@ if(prob(deflect_chance * booster_deflection_modifier)) visible_message("[src]'s armour deflects the attack!") log_message("Armor saved.", LOG_MECHA) - return 0 + return FALSE if(.) . *= booster_damage_modifier @@ -72,7 +72,7 @@ log_message("Attack by simple animal. Attacker - [user].", LOG_MECHA, color="red") if(!user.melee_damage_upper && !user.obj_damage) user.emote("custom", message = "[user.friendly_verb_continuous] [src].") - return 0 + return FALSE else var/play_soundeffect = 1 if(user.environment_smash) @@ -84,7 +84,7 @@ animal_damage = min(animal_damage, 20*user.environment_smash) log_combat(user, src, "attacked") attack_generic(user, animal_damage, user.melee_damage_type, MELEE, play_soundeffect) - return 1 + return TRUE /obj/vehicle/sealed/mecha/hulk_damage() diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index 40b2e6140222..6518c2fe05ab 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -153,7 +153,7 @@ /obj/vehicle/sealed/mecha/working/ripley/Exit(atom/movable/O) if(O in cargo) - return 0 + return FALSE return ..() /obj/vehicle/sealed/mecha/working/ripley/Topic(href, href_list) diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index 13a614449ab5..d8aaf6ac3b02 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -33,10 +33,10 @@ /obj/vehicle/ridden/scooter/buckle_mob(mob/living/M, force = 0, check_loc = 1) if(!istype(M)) - return 0 + return FALSE if(M.get_num_legs() < 2 && M.get_num_arms() <= 0) to_chat(M, "Your limbless body can't ride \the [src].") - return 0 + return FALSE . = ..() /obj/vehicle/ridden/scooter/skateboard diff --git a/code/modules/vore/hook-defs.dm b/code/modules/vore/hook-defs.dm index 5c3c3d01c858..d48371f13c29 100644 --- a/code/modules/vore/hook-defs.dm +++ b/code/modules/vore/hook-defs.dm @@ -33,5 +33,5 @@ if(!hook_vr("human_new",args)) result = 0 - //Return 1 to superhook + //return TRUE to superhook return result diff --git a/code/modules/vore/trycatch.dm b/code/modules/vore/trycatch.dm index d4b1ac2c058f..8fcb9ee38d22 100644 --- a/code/modules/vore/trycatch.dm +++ b/code/modules/vore/trycatch.dm @@ -24,7 +24,7 @@ The proc you're attemping should return nonzero values on success. catch(var/exception/e) stack_trace("attempt_vr runtimed when calling [procname] on [callon].") stack_trace("attempt_vr catch: [e] on [e.file]:[e.line]") - return 0 + return FALSE /* This is the _vr version of calling hooks. diff --git a/modular_citadel/code/modules/eventmaps/Spookystation/JTGSZwork.dm b/modular_citadel/code/modules/eventmaps/Spookystation/JTGSZwork.dm index 9ea5a679fdc5..244b0be71eb4 100644 --- a/modular_citadel/code/modules/eventmaps/Spookystation/JTGSZwork.dm +++ b/modular_citadel/code/modules/eventmaps/Spookystation/JTGSZwork.dm @@ -702,7 +702,7 @@ GLOBAL_LIST_EMPTY(rain_sounds) else new /obj/item/stack/sheet/hay/(get_turf(src)) qdel(src) - return 1 + return TRUE else . = ..() diff --git a/modular_citadel/code/modules/festive/turfs.dm b/modular_citadel/code/modules/festive/turfs.dm index dd119a25e7fa..d7b450caf253 100644 --- a/modular_citadel/code/modules/festive/turfs.dm +++ b/modular_citadel/code/modules/festive/turfs.dm @@ -1503,9 +1503,9 @@ /obj/structure/festive/trainplatform/edge_north/CanPass(atom/movable/mover, turf/target) if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return 1 + return TRUE if(dir == FULLTILE_WINDOW_DIR) - return 0 + return FALSE if(get_dir(loc, target) == dir) return !density if(istype(mover, /obj/structure/festive/trainplatform/edge_north)) @@ -1518,14 +1518,14 @@ return FALSE else if(istype(mover, /obj/machinery/door/window) && !valid_window_location(loc, mover.dir)) return FALSE - return 1 + return TRUE /obj/structure/festive/trainplatform/edge_north/CheckExit(atom/movable/O, turf/target) if(istype(O) && (O.pass_flags & PASSGLASS)) - return 1 + return TRUE if(get_dir(O.loc, target) == dir) - return 0 - return 1 + return FALSE + return TRUE /obj/structure/festive/trainplatform/edge_north dir = SOUTH @@ -1561,9 +1561,9 @@ /obj/structure/festive/trainplatform/edge_south/CanPass(atom/movable/mover, turf/target) if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return 1 + return TRUE if(dir == FULLTILE_WINDOW_DIR) - return 0 + return FALSE if(get_dir(loc, target) == dir) return !density if(istype(mover, /obj/structure/festive/trainplatform/edge_south)) @@ -1576,14 +1576,14 @@ return FALSE else if(istype(mover, /obj/machinery/door/window) && !valid_window_location(loc, mover.dir)) return FALSE - return 1 + return TRUE /obj/structure/festive/trainplatform/edge_north/CheckExit(atom/movable/O, turf/target) if(istype(O) && (O.pass_flags & PASSGLASS)) - return 1 + return TRUE if(get_dir(O.loc, target) == dir) - return 0 - return 1 + return FALSE + return TRUE /obj/structure/festive/trainplatform/edge_south dir = NORTH @@ -1619,9 +1619,9 @@ /obj/structure/festive/trainplatform/edge_east/CanPass(atom/movable/mover, turf/target) if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return 1 + return TRUE if(dir == FULLTILE_WINDOW_DIR) - return 0 + return FALSE if(get_dir(loc, target) == dir) return !density if(istype(mover, /obj/structure/festive/trainplatform/edge_east)) @@ -1634,14 +1634,14 @@ return FALSE else if(istype(mover, /obj/machinery/door/window) && !valid_window_location(loc, mover.dir)) return FALSE - return 1 + return TRUE /obj/structure/festive/trainplatform/edge_east/CheckExit(atom/movable/O, turf/target) if(istype(O) && (O.pass_flags & PASSGLASS)) - return 1 + return TRUE if(get_dir(O.loc, target) == dir) - return 0 - return 1 + return FALSE + return TRUE /obj/structure/festive/trainplatform/edge_east dir = WEST @@ -1677,9 +1677,9 @@ /obj/structure/festive/trainplatform/edge_west/CanPass(atom/movable/mover, turf/target) if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return 1 + return TRUE if(dir == FULLTILE_WINDOW_DIR) - return 0 + return FALSE if(get_dir(loc, target) == dir) return !density if(istype(mover, /obj/structure/festive/trainplatform/edge_west)) @@ -1692,14 +1692,14 @@ return FALSE else if(istype(mover, /obj/machinery/door/window) && !valid_window_location(loc, mover.dir)) return FALSE - return 1 + return TRUE /obj/structure/festive/trainplatform/edge_west/CheckExit(atom/movable/O, turf/target) if(istype(O) && (O.pass_flags & PASSGLASS)) - return 1 + return TRUE if(get_dir(O.loc, target) == dir) - return 0 - return 1 + return FALSE + return TRUE /obj/structure/festive/trainplatform/edge_west dir = EAST diff --git a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm index e5b81806e688..f3abc0603ebe 100644 --- a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm +++ b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm @@ -68,7 +68,7 @@ playsound(M, 'sound/weapons/laserPump.ogg', 100, 1) //Ends with high pitched charging noise recharge_newshot() //try to charge a new shot update_icon() - return 1 + return TRUE /obj/item/gun/energy/pumpaction/AltClick(mob/living/user) //for changing firing modes since attackself is already used for pumping . = ..() From 00b30e06726cb70b5daa6dcb2d7258ec03e70f42 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Fri, 5 Jan 2024 12:53:42 -0300 Subject: [PATCH 5/9] stoppable --- code/modules/client/preferences.dm | 2 +- code/modules/client/preferences_savefile.dm | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index f9d4ec151311..4ccab2df4b5c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -3215,7 +3215,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) load_character() if("changeslot") - if(char_queue != -1) + if(char_queue) deltimer(char_queue) // Do not dare. if(!load_character(text2num(href_list["num"]))) random_character() diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index b9d5d19d4ddc..f30665c35ec8 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -602,7 +602,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car queue_save_pref(PREF_SAVE_COOLDOWN, silent) return FALSE COOLDOWN_START(src, saveprefcooldown, PREF_SAVE_COOLDOWN) - if(pref_queue != -1) + if(pref_queue) deltimer(pref_queue) var/savefile/S = new /savefile(path) if(!S) @@ -683,9 +683,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car /datum/preferences/proc/queue_save_pref(save_in, silent) if(parent && !silent) to_chat(parent, span_notice("Saving preferences in [save_in * 0.1] second\s.")) - if(pref_queue != -1) + if(pref_queue) deltimer(pref_queue) - pref_queue = addtimer(CALLBACK(src, PROC_REF(save_preferences), TRUE, silent), save_in) + pref_queue = addtimer(CALLBACK(src, PROC_REF(save_preferences), TRUE, silent), save_in, TIMER_STOPPABLE) /datum/preferences/proc/load_character(slot, bypass_cooldown = FALSE) if(!path) @@ -1104,7 +1104,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car queue_save_char(PREF_SAVE_COOLDOWN, silent) return FALSE COOLDOWN_START(src, savecharcooldown, PREF_SAVE_COOLDOWN) - if(char_queue != -1) + if(char_queue) deltimer(char_queue) var/savefile/S = new /savefile(path) if(!S) @@ -1300,9 +1300,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car /datum/preferences/proc/queue_save_char(save_in, silent) if(parent && !silent) to_chat(parent, span_notice("Saving character in [save_in * 0.1] second\s.")) - if(char_queue != -1) + if(char_queue) deltimer(char_queue) - char_queue = addtimer(CALLBACK(src, PROC_REF(save_character), TRUE, silent), save_in) + char_queue = addtimer(CALLBACK(src, PROC_REF(save_character), TRUE, silent), save_in, TIMER_STOPPABLE) #undef SAVEFILE_VERSION_MAX #undef SAVEFILE_VERSION_MIN From 6d7321b0c499c51740969e7c4e2aa9d4baa831aa Mon Sep 17 00:00:00 2001 From: SandPoot Date: Fri, 5 Jan 2024 22:09:21 -0300 Subject: [PATCH 6/9] okay so this is necessary --- code/_onclick/drag_drop.dm | 14 ++++++++++++++ code/game/objects/structures/manned_turret.dm | 2 +- code/modules/keybindings/keybind/mob.dm | 2 +- code/modules/mob/living/living_active_parry.dm | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index fffbbc059fd0..a864ff48cef9 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -91,6 +91,20 @@ /atom/movable/screen/click_catcher/IsAutoclickable() . = 1 +//Please don't roast me too hard +/client/MouseMove(object, location, control, params) + mouseParams = params + mouse_location_ref = WEAKREF(location) + mouse_object_ref = WEAKREF(object) + middle_drag_atom_ref = WEAKREF(control) + if(mob) + SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_MOUSEMOVE, object, location, control, params) + // god forgive me for i have sinned - used for autoparry. currently at 5 objects. + moused_over_objects[object] = world.time + if(moused_over_objects.len > 7) + moused_over_objects.Cut(1, 2) + ..() + /client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params) var/list/modifiers = params2list(params) if (LAZYACCESS(modifiers, MIDDLE_CLICK)) diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm index 639180356d1b..5fce5a91753d 100644 --- a/code/game/objects/structures/manned_turret.dm +++ b/code/game/objects/structures/manned_turret.dm @@ -80,7 +80,7 @@ return FALSE var/client/C = controller.client if(C) - var/atom/A = WEAKREF(C.mouse_object_ref) + var/atom/A = C.mouse_object_ref?.resolve() var/turf/T = get_turf(A) if(istype(T)) //They're hovering over something in the map. direction_track(controller, T) diff --git a/code/modules/keybindings/keybind/mob.dm b/code/modules/keybindings/keybind/mob.dm index d5b8eb1a38a1..15990731541d 100644 --- a/code/modules/keybindings/keybind/mob.dm +++ b/code/modules/keybindings/keybind/mob.dm @@ -85,6 +85,6 @@ description = "Immediately examine anything you're hovering your mouse over." /datum/keybinding/mob/examine_immediate/down(client/user) - var/atom/A = WEAKREF(user.mouse_object_ref) + var/atom/A = user.mouse_object_ref?.resolve() if(A) A.attempt_examinate(user.mob) diff --git a/code/modules/mob/living/living_active_parry.dm b/code/modules/mob/living/living_active_parry.dm index dacfe3a86338..7dcc812863a2 100644 --- a/code/modules/mob/living/living_active_parry.dm +++ b/code/modules/mob/living/living_active_parry.dm @@ -241,7 +241,7 @@ // before doing anything, check if the user moused over them properly if(!client) return BLOCK_NONE - var/found = attacker == WEAKREF(client.mouse_object_ref) + var/found = attacker == client.mouse_object_ref?.resolve() if(!found) for(var/i in client.moused_over_objects) if(i == object) From 8d283066b654e459ea8f9623857a066deaeba30e Mon Sep 17 00:00:00 2001 From: SandPoot Date: Tue, 9 Jan 2024 00:30:06 -0300 Subject: [PATCH 7/9] just force them to update always, it's pretty much what tg does --- code/datums/action.dm | 8 +++----- code/game/atoms.dm | 5 ++++- code/game/objects/items/devices/PDA/PDA.dm | 5 +++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/code/datums/action.dm b/code/datums/action.dm index f536a5d933de..6a1bbe5e6329 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -157,7 +157,7 @@ /datum/action/proc/OnUpdatedIcon() SIGNAL_HANDLER - UpdateButtons() + UpdateButtons(force = TRUE) //Give our action button to the player /datum/action/proc/GiveAction(mob/viewer) @@ -267,12 +267,10 @@ /datum/action/item_action/toggle_light name = "Toggle Light" -/datum/action/item_action/toggle_light/Trigger(trigger_flags) +/datum/action/item_action/toggle_light/pda/Trigger(trigger_flags) if(istype(target, /obj/item/pda)) var/obj/item/pda/P = target - P.toggle_light(owner) - return - ..() + return P.toggle_light(owner) /datum/action/item_action/toggle_hood name = "Toggle Hood" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 6a7b78b8dd5b..1554ac996468 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -613,7 +613,10 @@ cut_overlay(managed_overlays) managed_overlays = null if(length(new_overlays)) - managed_overlays = new_overlays + if (length(new_overlays) == 1) + managed_overlays = new_overlays[1] + else + managed_overlays = new_overlays add_overlay(new_overlays) . |= UPDATE_OVERLAYS diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 8e04f591f232..32876fc36ade 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -29,7 +29,7 @@ GLOBAL_LIST_EMPTY(PDAs) item_flags = NOBLUDGEON w_class = WEIGHT_CLASS_TINY slot_flags = ITEM_SLOT_ID | ITEM_SLOT_BELT - actions_types = list(/datum/action/item_action/toggle_light) + actions_types = list(/datum/action/item_action/toggle_light/pda) armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF | ACID_PROOF @@ -963,7 +963,7 @@ GLOBAL_LIST_EMPTY(PDAs) /obj/item/pda/proc/toggle_light() if(hasSiliconAccessInArea(usr) || !usr.canUseTopic(src, BE_CLOSE)) - return + return FALSE if(fon) fon = FALSE set_light(0) @@ -971,6 +971,7 @@ GLOBAL_LIST_EMPTY(PDAs) fon = TRUE set_light(f_lum, f_pow, f_col) update_icon() + return TRUE /obj/item/pda/proc/remove_pen() From 1dad7e880e97061c29ffc78973f1fd0637b1d684 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Sat, 13 Jan 2024 13:35:54 -0300 Subject: [PATCH 8/9] 514 click stuff? --- code/modules/client/client_procs.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 5caea781a40b..4c5cef201277 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -884,11 +884,13 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( var/ab = FALSE var/list/modifiers = params2list(params) + var/button_clicked = LAZYACCESS(modifiers, "button") + var/dragged = LAZYACCESS(modifiers, DRAG) - if(dragged && !LAZYACCESS(modifiers, dragged)) //I don't know what's going on here, but I don't trust it + if(dragged && button_clicked != dragged) return - if (object && IS_WEAKREF_OF(object, middle_drag_atom_ref) && LAZYACCESS(modifiers, LEFT_CLICK)) + if (object && IS_WEAKREF_OF(object, middle_drag_atom_ref) && button_clicked == LEFT_CLICK) ab = max(0, 5 SECONDS-(world.time-middragtime)*0.1) var/mcl = CONFIG_GET(number/minute_click_limit) From 17a01b6f2a64a61105cde58c015c8b280afb3ccd Mon Sep 17 00:00:00 2001 From: SandPoot Date: Tue, 16 Jan 2024 14:53:48 -0300 Subject: [PATCH 9/9] revert stuff --- code/_onclick/drag_drop.dm | 17 ++--------------- code/modules/client/client_defines.dm | 5 +---- code/modules/client/client_procs.dm | 12 +----------- 3 files changed, 4 insertions(+), 30 deletions(-) diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index a864ff48cef9..bd1509d88be8 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -96,7 +96,7 @@ mouseParams = params mouse_location_ref = WEAKREF(location) mouse_object_ref = WEAKREF(object) - middle_drag_atom_ref = WEAKREF(control) + mouse_control_object = control if(mob) SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_MOUSEMOVE, object, location, control, params) // god forgive me for i have sinned - used for autoparry. currently at 5 objects. @@ -106,17 +106,10 @@ ..() /client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params) - var/list/modifiers = params2list(params) - if (LAZYACCESS(modifiers, MIDDLE_CLICK)) - if (src_object && src_location != over_location) - middragtime = world.time - middle_drag_atom_ref = WEAKREF(src_object) - else - middragtime = 0 - middle_drag_atom_ref = null mouseParams = params mouse_location_ref = WEAKREF(over_location) mouse_object_ref = WEAKREF(over_object) + mouse_control_object = over_control if(selected_target[1] && over_object?.IsAutoclickable()) selected_target[1] = over_object selected_target[2] = params @@ -127,9 +120,3 @@ /obj/item/proc/onMouseDrag(src_object, over_object, src_location, over_location, params, mob) return - -/client/MouseDrop(atom/src_object, atom/over_object, atom/src_location, atom/over_location, src_control, over_control, params) - if (IS_WEAKREF_OF(src_object, middle_drag_atom_ref)) - middragtime = 0 - middle_drag_atom_ref = null - ..() diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 940e8bf62294..14224cf02ec6 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -138,10 +138,7 @@ var/datum/weakref/mouse_location_ref = null ///Used in MouseDrag to preserve the last mouse-entered object. Weakref var/datum/weakref/mouse_object_ref - //Middle-mouse-button click dragtime control for aimbot exploit detection. - var/middragtime = 0 - //Middle-mouse-button clicked object control for aimbot exploit detection. Weakref - var/datum/weakref/middle_drag_atom_ref + var/mouse_control_object /// Messages currently seen by this client var/list/seen_messages diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 4c5cef201277..58103faf7d72 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -881,18 +881,11 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( click_intercept_time = 0 //Reset and return. Next click should work, but not this one. return click_intercept_time = 0 //Just reset. Let's not keep re-checking forever. - var/ab = FALSE var/list/modifiers = params2list(params) - var/button_clicked = LAZYACCESS(modifiers, "button") - - var/dragged = LAZYACCESS(modifiers, DRAG) - if(dragged && button_clicked != dragged) + if(modifiers[DRAG]) return - if (object && IS_WEAKREF_OF(object, middle_drag_atom_ref) && button_clicked == LEFT_CLICK) - ab = max(0, 5 SECONDS-(world.time-middragtime)*0.1) - var/mcl = CONFIG_GET(number/minute_click_limit) if (!holder && !ignore_spam && mcl) var/minute = round(world.time, 600) @@ -908,9 +901,6 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( clicklimiter[ADMINSWARNED_AT] = minute msg += " Administrators have been informed." - if (ab) - log_game("[key_name(src)] is using the middle click aimbot exploit") - message_admins("[ADMIN_LOOKUPFLW(usr)] [ADMIN_KICK(usr)] is using the middle click aimbot exploit") log_click(object, location, control, params, src, "lockout (spam - minute)", TRUE) log_game("[key_name(src)] Has hit the per-minute click limit of [mcl] clicks in a given game minute") message_admins("[ADMIN_LOOKUPFLW(src)] [ADMIN_KICK(usr)] Has hit the per-minute click limit of [mcl] clicks in a given game minute")