From febfdc13253ae4031127b875b8f43d6d39dfcc4c Mon Sep 17 00:00:00 2001 From: warior4356 Date: Tue, 30 Oct 2018 20:58:01 -0700 Subject: [PATCH 01/32] Makes mecha drillable --- code/game/mecha/equipment/tools/mining_tools.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index 63e70626a8d..6398c8fbb01 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -15,7 +15,7 @@ return if(isobj(target)) var/obj/target_obj = target - if(target_obj.unacidable) + if(target_obj.unacidable && !istype(target_obj, /obj/mecha)) return target.visible_message("[chassis] starts to drill [target].", "[chassis] starts to drill [target]...", From 890cb79eaf5bcea2cf8a1812dd7162d9a2b08ce8 Mon Sep 17 00:00:00 2001 From: warior4356 Date: Tue, 30 Oct 2018 21:30:52 -0700 Subject: [PATCH 02/32] Adds message denying mecha drilling --- code/game/mecha/equipment/tools/mining_tools.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index 63e70626a8d..94c944f75be 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -16,6 +16,7 @@ if(isobj(target)) var/obj/target_obj = target if(target_obj.unacidable) + src.occupant_message("[target] is too durable to drill through.") return target.visible_message("[chassis] starts to drill [target].", "[chassis] starts to drill [target]...", From 6028fc83c3cfe5d4a882565df2e0d47533b7f683 Mon Sep 17 00:00:00 2001 From: tigercat2000 Date: Tue, 30 Oct 2018 22:57:42 -0700 Subject: [PATCH 03/32] Not quite done yet --- code/_onclick/hud/action_button.dm | 2 +- code/_onclick/hud/alert.dm | 38 ++- code/datums/action.dm | 4 +- code/datums/spell.dm | 2 +- code/game/mecha/combat/durand.dm | 57 +---- code/game/mecha/combat/gygax.dm | 69 +----- code/game/mecha/combat/marauder.dm | 117 +-------- code/game/mecha/combat/phazon.dm | 37 +-- code/game/mecha/combat/reticence.dm | 3 +- code/game/mecha/mecha.dm | 232 +++++++++--------- code/game/mecha/mecha_actions.dm | 205 ++++++++++++++++ code/game/mecha/mecha_topic.dm | 137 +++++------ code/game/mecha/medical/odysseus.dm | 1 + code/game/mecha/working/ripley.dm | 1 + code/modules/admin/verbs/freeze.dm | 2 - .../simple_animal/hostile/megafauna/dragon.dm | 2 +- .../hostile/terror_spiders/actions.dm | 2 +- icons/mob/{ => actions}/actions.dmi | Bin icons/mob/actions/actions_mecha.dmi | Bin 0 -> 7153 bytes icons/mob/screen_alert.dmi | Bin 40571 -> 41752 bytes paradise.dme | 1 + 21 files changed, 475 insertions(+), 437 deletions(-) create mode 100644 code/game/mecha/mecha_actions.dm rename icons/mob/{ => actions}/actions.dmi (100%) create mode 100644 icons/mob/actions/actions_mecha.dmi diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 16cb8baa044..32a9d7cf46d 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -17,7 +17,7 @@ //Hide/Show Action Buttons ... Button /obj/screen/movable/action_button/hide_toggle name = "Hide Buttons" - icon = 'icons/mob/actions.dmi' + icon = 'icons/mob/actions/actions.dmi' icon_state = "bg_default" var/hidden = 0 diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index a187dfe3648..99991fa7b72 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -358,12 +358,48 @@ so as to remain in compliance with the most up-to-date laws." AI.eyeobj.setLoc(T) //MECHS - /obj/screen/alert/low_mech_integrity name = "Mech Damaged" desc = "Mech integrity is low." icon_state = "low_mech_integrity" +/obj/screen/alert/mech_port_available + name = "Connect to Port" + desc = "Click here to connect to an air port and refill your oxygen!" + icon_state = "mech_port" + var/obj/machinery/atmospherics/unary/portables_connector/target = null + +/obj/screen/alert/mech_port_available/Destroy() + target = null + return ..() + +/obj/screen/alert/mech_port_available/Click() + if(!usr || !usr.client) + return + if(!istype(usr.loc, /obj/mecha) || !target) + return + var/obj/mecha/M = usr.loc + if(M.connect(target)) + to_chat(usr, "[M] connects to the port.") + else + to_chat(usr, "[M] failed to connect to the port.") + +/obj/screen/alert/mech_port_disconnect + name = "Disconnect from Port" + desc = "Click here to disconnect from your air port." + icon_state = "mech_port_x" + +/obj/screen/alert/mech_port_disconnect/Click() + if(!usr || !usr.client) + return + if(!istype(usr.loc, /obj/mecha)) + return + var/obj/mecha/M = usr.loc + if(M.disconnect()) + to_chat(usr, "[M] disconnects from the port.") + else + to_chat(usr, "[M] is not connected to a port at the moment.") + //GUARDIANS /obj/screen/alert/cancharge name = "Charge Ready" diff --git a/code/datums/action.dm b/code/datums/action.dm index e0634527104..a9c895f3482 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -11,10 +11,10 @@ var/check_flags = 0 var/processing = 0 var/obj/screen/movable/action_button/button = null - var/button_icon = 'icons/mob/actions.dmi' + var/button_icon = 'icons/mob/actions/actions.dmi' var/background_icon_state = "bg_default" - var/icon_icon = 'icons/mob/actions.dmi' + var/icon_icon = 'icons/mob/actions/actions.dmi' var/button_icon_state = "default" var/mob/owner diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 653cc0020bc..dee057c5568 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -97,7 +97,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin var/centcom_cancast = 1 //Whether or not the spell should be allowed on z2 var/datum/action/spell_action/action = null - var/action_icon = 'icons/mob/actions.dmi' + var/action_icon = 'icons/mob/actions/actions.dmi' var/action_icon_state = "spell_default" var/action_background_icon_state = "bg_spell" diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index 6f3a8b51354..a1264b753e6 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -12,10 +12,15 @@ max_temperature = 30000 infra_luminosity = 8 force = 40 - var/defence = 0 - var/defence_deflect = 35 wreckage = /obj/effect/decal/mecha_wreckage/durand +/obj/mecha/combat/durand/GrantActions(mob/living/user, human_occupant = 0) + ..() + defense_action.Grant(user, src) + +/obj/mecha/combat/durand/RemoveActions(mob/living/user, human_occupant = 0) + ..() + defense_action.Remove(user) /obj/mecha/combat/durand/loaded/New() ..() @@ -24,54 +29,6 @@ ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack ME.attach(src) - -/obj/mecha/combat/durand/relaymove(mob/user,direction) - if(defence) - if(world.time - last_message > 20) - occupant_message("Unable to move while in defence mode") - last_message = world.time - return 0 - . = ..() - - -/obj/mecha/combat/durand/verb/defence_mode() - set category = "Exosuit Interface" - set name = "Toggle defence mode" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - defence = !defence - if(defence) - deflect_chance = defence_deflect - occupant_message("You enable [src] defence mode.") - else - deflect_chance = initial(deflect_chance) - occupant_message("You disable [src] defence mode.") - log_message("Toggled defence mode.") - - -/obj/mecha/combat/durand/get_stats_part() - var/output = ..() - output += "Defence mode: [defence?"on":"off"]" - return output - -/obj/mecha/combat/durand/get_commands() - var/output = {"
-
Special
- -
- "} - output += ..() - return output - -/obj/mecha/combat/durand/Topic(href, href_list) - ..() - if(href_list["toggle_defence_mode"]) - defence_mode() - /obj/mecha/combat/durand/old desc = "A retired, third-generation combat exosuit utilized by the Nanotrasen corporation. Originally developed to combat hostile alien lifeforms." name = "Durand" diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 05e02901ce2..c930df4b97b 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -11,13 +11,21 @@ armor = list(melee = 25, bullet = 20, laser = 30, energy = 15, bomb = 0, bio = 0, rad = 0) max_temperature = 25000 infra_luminosity = 6 - var/overload = 0 - var/overload_coeff = 2 + leg_overload_coeff = 2 wreckage = /obj/effect/decal/mecha_wreckage/gygax internal_damage_threshold = 35 max_equip = 3 maxsize = 2 step_energy_drain = 3 + normal_step_energy_drain = 3 + +/obj/mecha/combat/gygax/GrantActions(mob/living/user, human_occupant = 0) + ..() + overload_action.Grant(user, src) + +/obj/mecha/combat/gygax/RemoveActions(mob/living/user, human_occupant = 0) + ..() + overload_action.Remove(user) /obj/mecha/combat/gygax/loaded/New() ..() @@ -35,7 +43,7 @@ deflect_chance = 15 damage_absorption = list("brute"=0.6,"fire"=0.8,"bullet"=0.6,"laser"=0.5,"energy"=0.65,"bomb"=0.8) max_temperature = 35000 - overload_coeff = 1 + leg_overload_coeff = 100 operation_req_access = list(access_syndicate) wreckage = /obj/effect/decal/mecha_wreckage/gygax/dark max_equip = 4 @@ -55,57 +63,4 @@ /obj/mecha/combat/gygax/dark/add_cell() cell = new /obj/item/stock_parts/cell/bluespace(src) cell.charge = 30000 - cell.maxcharge = 30000 - - -/obj/mecha/combat/gygax/verb/overload() - set category = "Exosuit Interface" - set name = "Toggle leg actuators overload" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - if(overload) - overload = 0 - step_in = initial(step_in) - step_energy_drain = initial(step_energy_drain) - occupant_message("You disable leg actuators overload.") - else - overload = 1 - step_in = min(1, round(step_in/2)) - step_energy_drain = step_energy_drain*overload_coeff - occupant_message("You enable leg actuators overload.") - log_message("Toggled leg actuators overload.") - -/obj/mecha/combat/gygax/domove(direction) - if(!..()) - return - if(overload) - health-- - if(health < initial(health) - initial(health) / 3) - overload = 0 - step_in = initial(step_in) - step_energy_drain = initial(step_energy_drain) - occupant_message("Leg actuators damage threshold exceded. Disabling overload.") - - -/obj/mecha/combat/gygax/get_stats_part() - var/output = ..() - output += "Leg actuators overload: [overload?"on":"off"]" - return output - -/obj/mecha/combat/gygax/get_commands() - var/output = {"
-
Special
- -
- "} - output += ..() - return output - -/obj/mecha/combat/gygax/Topic(href, href_list) - ..() - if(href_list["toggle_leg_overload"]) - overload() \ No newline at end of file + cell.maxcharge = 30000 \ No newline at end of file diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index b05f97acbcd..8e16b6128dd 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -11,12 +11,6 @@ max_temperature = 60000 burn_state = LAVA_PROOF infra_luminosity = 3 - var/zoom = 0 - var/thrusters = 0 - var/smoke = 5 - var/smoke_ready = 1 - var/smoke_cooldown = 100 - var/datum/effect_system/smoke_spread/smoke_system = new operation_req_access = list(access_cent_specops) wreckage = /obj/effect/decal/mecha_wreckage/marauder add_req_access = 0 @@ -24,6 +18,17 @@ force = 45 max_equip = 5 +/obj/mecha/combat/marauder/GrantActions(mob/living/user, human_occupant = 0) + . = ..() + thrusters_action.Grant(user, src) + smoke_action.Grant(user, src) + zoom_action.Grant(user, src) + +/obj/mecha/combat/marauder/RemoveActions(mob/living/user, human_occupant = 0) + . = ..() + thrusters_action.Remove(user) + smoke_action.Remove(user) + zoom_action.Remove(user) /obj/mecha/combat/marauder/loaded/New() ..() @@ -37,8 +42,6 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) ME.attach(src) - smoke_system.set_up(3, 0, src) - smoke_system.attach(src) /obj/mecha/combat/marauder/seraph desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel." @@ -98,100 +101,4 @@ ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) - ME.attach(src) - smoke_system.set_up(3, 0, src) - smoke_system.attach(src) - - -/obj/mecha/combat/marauder/relaymove(mob/user,direction) - if(zoom) - if(world.time - last_message > 20) - occupant_message("Unable to move while in zoom mode.") - last_message = world.time - return 0 - return ..() - -/obj/mecha/combat/marauder/Process_Spacemove(var/movement_dir = 0) - if(..()) - return 1 - if(thrusters && movement_dir && use_power(step_energy_drain)) - return 1 - return 0 - -/obj/mecha/combat/marauder/verb/toggle_thrusters() - set category = "Exosuit Interface" - set name = "Toggle thrusters" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - if(occupant) - if(get_charge() > 0) - thrusters = !thrusters - log_message("Toggled thrusters.") - occupant_message("Thrusters [thrusters?"en":"dis"]abled.") - - -/obj/mecha/combat/marauder/verb/smoke() - set category = "Exosuit Interface" - set name = "Smoke" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - if(smoke_ready && smoke>0) - smoke_system.start() - smoke-- - smoke_ready = 0 - spawn(smoke_cooldown) - smoke_ready = 1 - -/obj/mecha/combat/marauder/verb/zoom() - set category = "Exosuit Interface" - set name = "Zoom" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - if(occupant.client) - zoom = !zoom - log_message("Toggled zoom mode.") - occupant_message("Zoom mode [zoom?"en":"dis"]abled.") - if(zoom) - occupant.client.AddViewMod("mecha", 12) - to_chat(occupant, sound('sound/mecha/imag_enh.ogg',volume=50)) - else - occupant.client.RemoveViewMod("mecha") - - - -/obj/mecha/combat/marauder/get_stats_part() - var/output = ..() - output += {"Smoke: [smoke] -
- Thrusters: [thrusters?"on":"off"] - "} - return output - - -/obj/mecha/combat/marauder/get_commands() - var/output = {"
-
Special
- -
- "} - output += ..() - return output - -/obj/mecha/combat/marauder/Topic(href, href_list) - ..() - if(href_list["toggle_thrusters"]) - toggle_thrusters() - if(href_list["smoke"]) - smoke() - if(href_list["toggle_zoom"]) - zoom() \ No newline at end of file + ME.attach(src) \ No newline at end of file diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index 5dbffb62f29..af48fb1b6dc 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -6,6 +6,7 @@ step_in = 2 dir_in = 2 //Facing south. step_energy_drain = 3 + normal_step_energy_drain = 3 health = 200 deflect_chance = 30 damage_absorption = list("brute"=0.7,"fire"=0.7,"bullet"=0.7,"laser"=0.7,"energy"=0.7,"bomb"=0.7) @@ -17,10 +18,16 @@ //operation_req_access = list() internal_damage_threshold = 25 force = 15 - var/phasing = 0 - var/phasing_energy_drain = 200 + phase_state = "phazon-phase" max_equip = 3 +/obj/mecha/combat/phazon/GrantActions(mob/living/user, human_occupant = 0) + ..() + phasing_action.Grant(user, src) + +/obj/mecha/combat/phazon/RemoveActions(mob/living/user, human_occupant = 0) + ..() + phasing_action.Remove(user) /obj/mecha/combat/phazon/New() ..() @@ -29,25 +36,6 @@ ME = new /obj/item/mecha_parts/mecha_equipment/gravcatapult ME.attach(src) -/obj/mecha/combat/phazon/mechstep(direction) - . = ..() - if(!. && phasing && get_charge() >= phasing_energy_drain) - if(can_move) - can_move = 0 - flick("phazon-phase", src) - forceMove(get_step(src, direction)) - use_power(phasing_energy_drain) - playsound(src,stepsound,40,1) - sleep(step_in * 3) - can_move = 1 - return 1 - -/obj/mecha/combat/phazon/click_action(atom/target,mob/user) - if(phasing) - occupant_message("Unable to interact with objects while phasing") - return - return ..() - /obj/mecha/combat/phazon/verb/switch_damtype() set category = "Exosuit Interface" set name = "Reconfigure arm microtool arrays" @@ -72,7 +60,6 @@ var/output = {" @@ -83,8 +70,4 @@ /obj/mecha/combat/phazon/Topic(href, href_list) ..() if(href_list["switch_damtype"]) - switch_damtype() - if(href_list["phasing"]) - phasing = !phasing - send_byjax(occupant,"exosuit.browser","phasing_command","[phasing?"Dis":"En"]able phasing") - occupant_message("En":"#f00\">Dis"]abled phasing.") \ No newline at end of file + switch_damtype() \ No newline at end of file diff --git a/code/game/mecha/combat/reticence.dm b/code/game/mecha/combat/reticence.dm index 9e51be0357d..ba4566a1e91 100644 --- a/code/game/mecha/combat/reticence.dm +++ b/code/game/mecha/combat/reticence.dm @@ -15,7 +15,8 @@ add_req_access = 0 internal_damage_threshold = 60 max_equip = 3 - step_energy_drain = 3 + step_energy_drain = 3 + normal_step_energy_drain = 3 stepsound = null turnsound = null diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 64874762050..1cdecf3f2a1 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -7,6 +7,9 @@ #define MELEE 1 #define RANGED 2 +#define MECHAMOVE_RAND 1 +#define MECHAMOVE_TURN 2 +#define MECHAMOVE_STEP 4 /obj/mecha name = "Mecha" @@ -25,7 +28,9 @@ var/mob/living/carbon/occupant = null var/step_in = 10 //make a step in step_in/10 sec. var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. + var/normal_step_energy_drain = 10 var/step_energy_drain = 10 + var/overload_step_energy_drain_min = 100 var/health = 300 //health is health var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. //the values in this list show how much damage will pass through, not how much will be absorbed. @@ -69,13 +74,26 @@ var/turf/crashing = null var/occupant_sight_flags = 0 - var/stepsound = 'sound/mecha/mechstep.ogg' var/turnsound = 'sound/mecha/mechturn.ogg' var/melee_cooldown = 10 var/melee_can_hit = 1 + // Action vars + var/defence_mode = FALSE + var/defence_mode_deflect_chance = 35 + var/leg_overload_mode = FALSE + var/leg_overload_coeff = 100 + var/thrusters_active = FALSE + var/smoke = 5 + var/smoke_ready = 1 + var/smoke_cooldown = 100 + var/zoom_mode = FALSE + var/phasing = FALSE + var/phasing_energy_drain = 200 + var/phase_state = "" //icon_state when phasing + hud_possible = list (DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD) /obj/mecha/New() @@ -84,17 +102,14 @@ icon_state += "-open" add_radio() add_cabin() - - if(!add_airtank()) //we check this here in case mecha does not have an internal tank available by default - WIP - removeVerb(/obj/mecha/verb/connect_to_port) - removeVerb(/obj/mecha/verb/toggle_internal_tank) - + add_airtank() spark_system.set_up(2, 0, src) spark_system.attach(src) + smoke_system.set_up(3, src) + smoke_system.attach(src) add_cell() processing_objects.Add(src) - removeVerb(/obj/mecha/verb/disconnect_from_port) GLOB.poi_list |= src log_message("[src] created.") GLOB.mechas_list += src //global mech list @@ -176,6 +191,9 @@ return if(user.incapacitated()) return + if(phasing) + occupant_message("Unable to interact with objects while phasing.") + return if(state) occupant_message("Maintenance protocols in effect.") return @@ -251,6 +269,8 @@ . = ..() if(.) return 1 + if(thrusters_active && movement_dir && use_power(step_energy_drain)) + return 1 var/atom/movable/backup = get_spacemove_backup() if(backup) @@ -284,23 +304,55 @@ return 0 if(!has_charge(step_energy_drain)) return 0 + if(defence_mode) + if(world.time - last_message > 20) + occupant_message("Unable to move while in defence mode.") + last_message = world.time + return 0 + if(zoom_mode) + if(world.time - last_message > 20) + occupant_message("Unable to move while in zoom mode.") + last_message = world.time + return 0 var/move_result = 0 + var/move_type = 0 if(internal_damage & MECHA_INT_CONTROL_LOST) move_result = mechsteprand() + move_type = MECHAMOVE_RAND else if(dir != direction) move_result = mechturn(direction) + move_type = MECHAMOVE_TURN else move_result = mechstep(direction) + move_type = MECHAMOVE_STEP - can_move = 0 + can_move = FALSE spawn(step_in) - can_move = 1 + can_move = TRUE - if(move_result) - use_power(step_energy_drain) - return 1 - return 0 + if(move_result && move_type) + aftermove(move_type) + return TRUE + return FALSE + +/obj/mecha/proc/aftermove(move_type) + use_power(step_energy_drain) + if(move_type & (MECHAMOVE_RAND | MECHAMOVE_STEP) && occupant) + var/obj/machinery/atmospherics/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/unary/portables_connector) in loc + if(possible_port) + var/obj/screen/alert/mech_port_available/A = occupant.throw_alert("mechaport", /obj/screen/alert/mech_port_available, override = TRUE) + if(A) + A.target = possible_port + else + occupant.clear_alert("mechaport") + if(leg_overload_mode) + take_damage(1) + if(health < initial(health) - initial(health) / 3) + leg_overload_mode = FALSE + step_in = initial(step_in) + step_energy_drain = initial(step_energy_drain) + occupant_message("Leg actuators damage threshold exceded. Disabling overload.") /obj/mecha/proc/mechturn(direction) @@ -310,16 +362,25 @@ return 1 /obj/mecha/proc/mechstep(direction) - var/result = step(src,direction) - if(result && stepsound) - playsound(src,stepsound,40,1) - return result + . = step(src, direction) + if(!.) + if(phasing && get_charge() >= phasing_energy_drain) + if(can_move) + can_move = 0 + . = TRUE + flick("phazon-phase", src) + forceMove(get_step(src, direction)) + use_power(phasing_energy_drain) + playsound(src, stepsound, 40, 1) + spawn(step_in * 3) + can_move = 1 + else if(stepsound) + playsound(src, stepsound, 40, 1) /obj/mecha/proc/mechsteprand() - var/result = step_rand(src) - if(result && stepsound) - playsound(src,stepsound,40,1) - return result + . = step_rand(src) + if(. && stepsound) + playsound(src, stepsound, 40, 1) @@ -627,6 +688,7 @@ qdel(cabin_air) cabin_air = null QDEL_NULL(spark_system) + QDEL_NULL(smoke_system) GLOB.mechas_list -= src //global mech list return ..() @@ -777,8 +839,8 @@ else if(iswelder(W) && user.a_intent != INTENT_HARM) var/obj/item/weldingtool/WT = W if(healthYou repair the damaged gas tank.") else @@ -958,6 +1020,10 @@ to_chat(AI, "[AI.can_dominate_mechs ? "Takeover of [name] complete! You are now permanently loaded onto the onboard computer. Do not attempt to leave the station sector!" \ : "You have been uploaded to a mech's onboard computer."]") to_chat(AI, "Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions.") + if(interaction == AI_TRANS_FROM_CARD) + GrantActions(AI, FALSE) + else + GrantActions(AI, !AI.can_dominate_mechs) ///////////////////////////////////// //////// Atmospheric stuff //////// @@ -994,7 +1060,7 @@ /obj/mecha/proc/connect(obj/machinery/atmospherics/unary/portables_connector/new_port) //Make sure not already connected to something else - if(connected_port || !new_port || new_port.connected_device) + if(connected_port || !istype(new_port) || new_port.connected_device) return 0 //Make sure are close enough for a valid connection @@ -1006,6 +1072,10 @@ connected_port.connected_device = src connected_port.parent.reconcile_air() + if(occupant) + occupant.clear_alert("mechaport") + occupant.throw_alert("mechaport_d", /obj/screen/alert/mech_port_disconnect) + log_message("Connected to gas port.") return 1 @@ -1016,6 +1086,8 @@ connected_port.connected_device = null connected_port = null log_message("Disconnected from gas port.") + if(occupant) + occupant.clear_alert("mechaport_d") return 1 /obj/mecha/portableConnectorReturnAir() @@ -1025,71 +1097,19 @@ ///////////////////////// //////// Verbs //////// ///////////////////////// - - -/obj/mecha/verb/connect_to_port() - set name = "Connect to port" - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(!occupant) return - if(usr!=occupant) - return - var/obj/machinery/atmospherics/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/unary/portables_connector/) in loc - if(possible_port) - if(connect(possible_port)) - occupant_message("[name] connects to the port.") - verbs += /obj/mecha/verb/disconnect_from_port - verbs -= /obj/mecha/verb/connect_to_port - return - else - occupant_message("[name] failed to connect to the port.") - return - else - occupant_message("Nothing happens") - - -/obj/mecha/verb/disconnect_from_port() - set name = "Disconnect from port" - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(!occupant) return - if(usr!=occupant) - return - if(disconnect()) - occupant_message("[name] disconnects from the port.") - verbs -= /obj/mecha/verb/disconnect_from_port - verbs += /obj/mecha/verb/connect_to_port - else - occupant_message("[name] is not connected to the port at the moment.") - -/obj/mecha/verb/toggle_lights() - set name = "Toggle Lights" - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(usr!=occupant) return +/obj/mecha/proc/toggle_lights() lights = !lights - if(lights) set_light(light_range + lights_power) - else set_light(light_range - lights_power) - occupant_message("Toggled lights [lights?"on":"off"].") - log_message("Toggled lights [lights?"on":"off"].") - return + if(lights) + set_light(light_range + lights_power) + else + set_light(light_range - lights_power) + occupant_message("Toggled lights [lights ? "on" : "off"].") + log_message("Toggled lights [lights ? "on" : "off"].") - -/obj/mecha/verb/toggle_internal_tank() - set name = "Toggle internal airtank usage." - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(usr!=occupant) - return +/obj/mecha/proc/toggle_internal_tank() use_internal_tank = !use_internal_tank - occupant_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].") - log_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].") - return - + occupant_message("Now taking air from [use_internal_tank ? "internal airtank" : "environment"].") + log_message("Now taking air from [use_internal_tank ? "internal airtank" : "environment"].") /obj/mecha/MouseDrop_T(mob/M, mob/user) if(user.incapacitated()) @@ -1147,7 +1167,7 @@ H.forceMove(src) H.reset_perspective(src) add_fingerprint(H) - //GrantActions(H, human_occupant=1) + GrantActions(H, human_occupant = 1) forceMove(loc) log_append_to_last("[H] moved in as pilot.") icon_state = reset_icon() @@ -1204,7 +1224,6 @@ to_chat(brainmob, "Your imprint to [R.imprinted_master] has been temporarily disabled. You should help the crew and not commit harm.") mmi_as_oc.loc = src mmi_as_oc.mecha = src - verbs -= /obj/mecha/verb/eject Entered(mmi_as_oc) Move(loc) icon_state = reset_icon() @@ -1212,6 +1231,7 @@ log_message("[mmi_as_oc] moved in as pilot.") if(!hasInternalDamage()) to_chat(occupant, sound('sound/mecha/nominal.ogg',volume=50)) + GrantActions(brainmob) return 1 else return 0 @@ -1228,27 +1248,6 @@ /obj/mecha/proc/pilot_mmi_hud(var/mob/living/carbon/brain/pilot) return -/obj/mecha/verb/view_stats() - set name = "View Stats" - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(usr!=occupant) - return - occupant << browse(get_stats_html(), "window=exosuit") - return - -/obj/mecha/verb/eject() - set name = "Eject" - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - go_out() - add_fingerprint(usr) - - /obj/mecha/Exited(atom/movable/M, atom/newloc) if(occupant && occupant == M) // The occupant exited the mech without calling go_out() go_out(1, newloc) @@ -1259,17 +1258,19 @@ var/atom/movable/mob_container occupant.clear_alert("charge") occupant.clear_alert("mech damage") + occupant.clear_alert("mechaport") + occupant.clear_alert("mechaport_d") if(ishuman(occupant)) mob_container = occupant - //RemoveActions(occupant, human_occupant=1) + RemoveActions(occupant, human_occupant = 1) else if(isbrain(occupant)) var/mob/living/carbon/brain/brain = occupant - //RemoveActions(brain) + RemoveActions(brain) mob_container = brain.container else if(isAI(occupant)) var/mob/living/silicon/ai/AI = occupant if(forced)//This should only happen if there are multiple AIs in a round, and at least one is Malf. - //RemoveActions(occupant) + RemoveActions(occupant) occupant.gib() //If one Malf decides to steal a mech from another AI (even other Malfs!), they are destroyed, as they have nowhere to go when replaced. occupant = null return @@ -1281,7 +1282,7 @@ to_chat(AI, "Returning to core...") AI.controlled_mech = null AI.remote_control = null - //RemoveActions(occupant, 1) + RemoveActions(occupant, 1) mob_container = AI newloc = get_turf(AI.linked_core) qdel(AI.linked_core) @@ -1310,6 +1311,7 @@ if(L && L.client) L.client.RemoveViewMod("mecha") + zoom_mode = FALSE ///////////////////////// ////// Access stuff ///// @@ -1319,14 +1321,14 @@ if(!ishuman(H)) return 0 for(var/ID in list(H.get_active_hand(), H.wear_id, H.belt)) - if(check_access(ID,operation_req_access)) + if(check_access(ID, operation_req_access)) return 1 return 0 /obj/mecha/proc/internals_access_allowed(mob/living/carbon/human/H) for(var/atom/ID in list(H.get_active_hand(), H.wear_id, H.belt)) - if(check_access(ID,internals_req_access)) + if(check_access(ID, internals_req_access)) return 1 return 0 diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm new file mode 100644 index 00000000000..2db88a3b57b --- /dev/null +++ b/code/game/mecha/mecha_actions.dm @@ -0,0 +1,205 @@ +/obj/mecha + //Action datums + var/datum/action/innate/mecha/mech_eject/eject_action = new + var/datum/action/innate/mecha/mech_toggle_internals/internals_action = new + var/datum/action/innate/mecha/mech_toggle_lights/lights_action = new + var/datum/action/innate/mecha/mech_view_stats/stats_action = new + var/datum/action/innate/mecha/mech_defence_mode/defense_action = new + var/datum/action/innate/mecha/mech_overload_mode/overload_action = new + var/datum/action/innate/mecha/mech_toggle_thrusters/thrusters_action = new + var/datum/effect_system/smoke_spread/smoke_system = new //not an action, but trigged by one + var/datum/action/innate/mecha/mech_smoke/smoke_action = new + var/datum/action/innate/mecha/mech_zoom/zoom_action = new + var/datum/action/innate/mecha/mech_toggle_phasing/phasing_action = new + // var/datum/action/innate/mecha/mech_switch_damtype/switch_damtype_action = new + +/obj/mecha/proc/GrantActions(mob/living/user, human_occupant = 0) + if(human_occupant) + eject_action.Grant(user, src) + internals_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + +/obj/mecha/proc/RemoveActions(mob/living/user, human_occupant = 0) + if(human_occupant) + eject_action.Remove(user) + internals_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + +/datum/action/innate/mecha + check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUNNED | AB_CHECK_CONSCIOUS + icon_icon = 'icons/mob/actions/actions_mecha.dmi' + var/obj/mecha/chassis + +/datum/action/innate/mecha/Grant(mob/living/L, obj/mecha/M) + if(M) + chassis = M + . = ..() + +/datum/action/innate/mecha/Destroy() + chassis = null + return ..() + +/datum/action/innate/mecha/mech_eject + name = "Eject From Mech" + button_icon_state = "mech_eject" + +/datum/action/innate/mecha/mech_eject/Activate() + if(!owner) + return + if(!chassis || chassis.occupant != owner) + return + chassis.go_out() + +/datum/action/innate/mecha/mech_toggle_internals + name = "Toggle Internal Airtank Usage" + button_icon_state = "mech_internals_off" + +/datum/action/innate/mecha/mech_toggle_internals/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + chassis.use_internal_tank = !chassis.use_internal_tank + button_icon_state = "mech_internals_[chassis.use_internal_tank ? "on" : "off"]" + chassis.occupant_message("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"].") + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_toggle_lights + name = "Toggle Lights" + button_icon_state = "mech_lights_off" + +/datum/action/innate/mecha/mech_toggle_lights/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + chassis.lights = !chassis.lights + if(chassis.lights) + chassis.set_light(chassis.lights_power) + button_icon_state = "mech_lights_on" + else + chassis.set_light(-chassis.lights_power) + button_icon_state = "mech_lights_off" + chassis.occupant_message("Toggled lights [chassis.lights ? "on" : "off"].") + chassis.log_message("Toggled lights [chassis.lights ? "on" : "off"].") + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_view_stats + name = "View Stats" + button_icon_state = "mech_view_stats" + +/datum/action/innate/mecha/mech_view_stats/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + chassis.occupant << browse(chassis.get_stats_html(), "window=exosuit") + +/datum/action/innate/mecha/mech_defence_mode + name = "Toggle Defence Mode" + button_icon_state = "mech_defense_mode_off" + +/datum/action/innate/mecha/mech_defence_mode/Activate(forced_state = null) + if(!owner || !chassis || chassis.occupant != owner) + return + if(!isnull(forced_state)) + chassis.defence_mode = forced_state + else + chassis.defence_mode = !chassis.defence_mode + button_icon_state = "mech_defense_mode_[chassis.defence_mode ? "on" : "off"]" + if(chassis.defence_mode) + chassis.deflect_chance = chassis.defence_mode_deflect_chance + chassis.occupant_message("You enable [chassis] defence mode.") + else + chassis.deflect_chance = initial(chassis.deflect_chance) + chassis.occupant_message("You disable [chassis] defence mode.") + chassis.log_message("Toggled defence mode.") + UpdateButtonIcon() + + +/datum/action/innate/mecha/mech_overload_mode + name = "Toggle leg actuators overload" + button_icon_state = "mech_overload_off" + +/datum/action/innate/mecha/mech_overload_mode/Activate(forced_state = null) + if(!owner || !chassis || chassis.occupant != owner) + return + if(chassis.health < initial(chassis.health) - initial(chassis.health) / 3) + chassis.occupant_message("The leg actuators are too damaged to overload!") + return // Can't activate them if the mech is too damaged + if(!isnull(forced_state)) + chassis.leg_overload_mode = forced_state + else + chassis.leg_overload_mode = !chassis.leg_overload_mode + button_icon_state = "mech_overload_[chassis.leg_overload_mode ? "on" : "off"]" + chassis.log_message("Toggled leg actuators overload.") + if(chassis.leg_overload_mode) + chassis.leg_overload_mode = 1 + // chassis.bumpsmash = 1 + chassis.step_in = min(1, round(chassis.step_in / 2)) + chassis.step_energy_drain = max(chassis.overload_step_energy_drain_min, chassis.step_energy_drain * chassis.leg_overload_coeff) + chassis.occupant_message("You enable leg actuators overload.") + else + chassis.leg_overload_mode = 0 + // chassis.bumpsmash = 0 + chassis.step_in = initial(chassis.step_in) + chassis.step_energy_drain = chassis.normal_step_energy_drain + chassis.occupant_message("You disable leg actuators overload.") + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_toggle_thrusters + name = "Toggle Thrusters" + button_icon_state = "mech_thrusters_off" + +/datum/action/innate/mecha/mech_toggle_thrusters/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + if(chassis.get_charge() > 0) + chassis.thrusters_active = !chassis.thrusters_active + button_icon_state = "mech_thrusters_[chassis.thrusters_active ? "on" : "off"]" + chassis.log_message("Toggled thrusters.") + chassis.occupant_message("Thrusters [chassis.thrusters_active ? "en" : "dis"]abled.") + +/datum/action/innate/mecha/mech_smoke + name = "Smoke" + button_icon_state = "mech_smoke" + +/datum/action/innate/mecha/mech_smoke/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + if(chassis.smoke_ready && chassis.smoke > 0) + chassis.smoke_system.start() + chassis.smoke-- + chassis.smoke_ready = 0 + spawn(chassis.smoke_cooldown) + chassis.smoke_ready = 1 + else + chassis.occupant_message("You are either out of smoke, or the smoke isn't ready yet.") + +/datum/action/innate/mecha/mech_zoom + name = "Zoom" + button_icon_state = "mech_zoom_off" + +/datum/action/innate/mecha/mech_zoom/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + if(owner.client) + chassis.zoom_mode = !chassis.zoom_mode + button_icon_state = "mech_zoom_[chassis.zoom_mode ? "on" : "off"]" + chassis.log_message("Toggled zoom mode.") + chassis.occupant_message("Zoom mode [chassis.zoom_mode ? "en" : "dis"]abled.") + if(chassis.zoom_mode) + owner.client.AddViewMod("mecha", 12) + SEND_SOUND(owner, sound('sound/mecha/imag_enh.ogg',volume=50)) + else + owner.client.RemoveViewMod("mecha") + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_toggle_phasing + name = "Toggle Phasing" + button_icon_state = "mech_phasing_off" + +/datum/action/innate/mecha/mech_toggle_phasing/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + chassis.phasing = !chassis.phasing + button_icon_state = "mech_phasing_[chassis.phasing ? "on" : "off"]" + chassis.occupant_message("En":"#f00\">Dis"]abled phasing.") + UpdateButtonIcon() \ No newline at end of file diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 2ce732f83ed..41d4c3aa540 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -73,81 +73,80 @@ var/cell_charge = get_charge() var/tank_pressure = internal_tank ? round(internal_tank.return_pressure(),0.01) : "None" var/tank_temperature = internal_tank ? internal_tank.return_temperature() : "Unknown" + var/tank_temperature_c = internal_tank ? internal_tank.return_temperature() - T0C : "Unknown" var/cabin_pressure = round(return_pressure(),0.01) - var/output = {"[report_internal_damage()] - [integrity<30?"DAMAGE LEVEL CRITICAL
":null] - Integrity: [integrity]%
- Powercell charge: [isnull(cell_charge)?"No powercell installed":"[cell.percent()]%"]
- Air source: [use_internal_tank?"Internal Airtank":"Environment"]
- Airtank pressure: [tank_pressure]kPa
- Airtank temperature: [tank_temperature]°K|[tank_temperature - T0C]°C
- Cabin pressure: [cabin_pressure>WARNING_HIGH_PRESSURE ? "[cabin_pressure]": cabin_pressure]kPa
- Cabin temperature: [return_temperature()]°K|[return_temperature() - T0C]°C
- Lights: [lights?"on":"off"]
- [dna?"DNA-locked:
[dna] \[Reset\]
":null] - "} - return output + . = "[report_internal_damage()]" + . += "[integrity<30?"DAMAGE LEVEL CRITICAL
":null]" + . += "Integrity: [integrity]%
" + . += "Powercell charge: [isnull(cell_charge)?"No powercell installed":"[cell.percent()]%"]
" + . += "Air source: [use_internal_tank?"Internal Airtank":"Environment"]
" + . += "Airtank pressure: [tank_pressure]kPa
" + . += "Airtank temperature: [tank_temperature]°K|[tank_temperature_c]°C
" + . += "Cabin pressure: [cabin_pressure>WARNING_HIGH_PRESSURE ? "[cabin_pressure]": cabin_pressure]kPa
" + . += "Cabin temperature: [return_temperature()]°K|[return_temperature() - T0C]°C
" + . += "Lights: [lights?"on":"off"]
" + . += "[dna ? "DNA-locked:
[dna] \[Reset\]
" : ""]" + . += "[defense_action.owner ? "Defence Mode: [defence_mode ? "Enabled" : "Disabled"]
" : ""]" + . += "[overload_action.owner ? "Leg Actuators Overload: [leg_overload_mode ? "Enabled" : "Disabled"]
" : ""]" + . += "[thrusters_action.owner ? "Thrusters: [thrusters_active ? "Enabled" : "Disabled"]
" : ""]" + . += "[smoke_action.owner ? "Smoke: [smoke]
" : ""]" + . += "[zoom_action.owner ? "Zoom: [zoom_mode ? "Enabled" : "Disabled"]
" : ""]" + . += "[phasing_action.owner ? "Phase Modulator: [phasing ? "Enabled" : "Disabled"]
" : ""]" /obj/mecha/proc/get_commands() - var/output = {"
-
Electronics
- -
-
-
Airtank
- -
- -
[get_equipment_menu()]
-
- [(/obj/mecha/verb/eject in verbs)?"Eject
":null] - "} - return output + . = "
" + . += "
Electronics
" + . += "" + . += "
" + . += "
" + . += "
Airtank
" + . += "" + . += "
" + . += "
" + . += "
Permissions & Logging
" + . += "" + . += "
" + . += "
[get_equipment_menu()]
" + . += "
" + . += "Eject
" /obj/mecha/proc/get_equipment_menu() //outputs mecha html equipment menu - var/output + . = "" if(equipment.len) - output += {"
-
Equipment
-
" /obj/mecha/proc/get_equipment_list() //outputs mecha equipment list in html if(!equipment.len) return - var/output = "Equipment:
" + . = "Equipment:
" for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment) - output += "
[MT.get_equip_info()]
" - output += "
" - return output + . += "
[MT.get_equip_info()]
" + . += "
" /obj/mecha/proc/get_log_html() @@ -248,11 +247,11 @@ selected = equip occupant_message("You switch to [equip]") visible_message("[src] raises [equip]") - send_byjax(occupant,"exosuit.browser","eq_list",get_equipment_list()) + send_byjax(occupant, "exosuit.browser", "eq_list", get_equipment_list()) return if(href_list["eject"]) if(usr != occupant) return - eject() + go_out() return if(href_list["toggle_lights"]) if(usr != occupant) return @@ -280,14 +279,6 @@ radio.set_frequency(new_frequency) send_byjax(occupant,"exosuit.browser","rfreq","[format_frequency(radio.frequency)]") return - if(href_list["port_disconnect"]) - if(usr != occupant) return - disconnect_from_port() - return - if(href_list["port_connect"]) - if(usr != occupant) return - connect_to_port() - return if(href_list["view_log"]) if(usr != occupant) return occupant << browse(get_log_html(), "window=exosuit_log") diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm index d0fcb0f99be..da746290e8a 100644 --- a/code/game/mecha/medical/odysseus.dm +++ b/code/game/mecha/medical/odysseus.dm @@ -10,6 +10,7 @@ internal_damage_threshold = 35 deflect_chance = 15 step_energy_drain = 6 + normal_step_energy_drain = 6 var/builtin_hud_user = 0 /obj/mecha/medical/odysseus/moved_inside(var/mob/living/carbon/human/H) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 407c9cd63dc..ab38ee3a0d0 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -83,6 +83,7 @@ damage_absorption = list("brute"=0.6,"fire"=0.4,"bullet"=0.6,"laser"=0.6,"energy"=1,"bomb"=0.3) wreckage = /obj/effect/decal/mecha_wreckage/ripley/deathripley step_energy_drain = 0 + normal_step_energy_drain = 0 /obj/mecha/working/ripley/deathripley/New() ..() diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm index 8dc852e9221..76a7a693838 100644 --- a/code/modules/admin/verbs/freeze.dm +++ b/code/modules/admin/verbs/freeze.dm @@ -104,7 +104,6 @@ var/global/list/frozen_mob_list = list() M.can_move = 0 M.overlays += adminomaly if(M.occupant) - M.removeVerb(/obj/mecha/verb/eject) to_chat(M.occupant, "You have been frozen by [key]") message_admins("[key_name_admin(usr)] froze [key_name(M.occupant)] in a [M.name]") log_admin("[key_name(usr)] froze [key_name(M.occupant)] in a [M.name]") @@ -115,7 +114,6 @@ var/global/list/frozen_mob_list = list() M.can_move = 1 M.overlays -= adminomaly if(M.occupant) - M.addVerb(/obj/mecha/verb/eject) to_chat(M.occupant, "You have been unfrozen by [key]") message_admins("[key_name_admin(usr)] unfroze [key_name(M.occupant)] in a [M.name]") log_admin("[key_name(usr)] unfroze [key_name(M.occupant)] in a [M.name]") diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index 82e4af1862f..efeec62ae96 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -101,7 +101,7 @@ Difficulty: Medium animate(src, pixel_z = 0, time = 12) /obj/effect/temp_visual/target - icon = 'icons/mob/actions.dmi' + icon = 'icons/mob/actions/actions.dmi' icon_state = "sniper_zoom" layer = MOB_LAYER - 0.1 luminosity = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm index f2bed558b8c..b0756cddd7f 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm @@ -65,7 +65,7 @@ /datum/action/innate/terrorspider/queen/queensense name = "Hive Sense" - icon_icon = 'icons/mob/actions.dmi' + icon_icon = 'icons/mob/actions/actions.dmi' button_icon_state = "mindswap" /datum/action/innate/terrorspider/queen/queensense/Activate() diff --git a/icons/mob/actions.dmi b/icons/mob/actions/actions.dmi similarity index 100% rename from icons/mob/actions.dmi rename to icons/mob/actions/actions.dmi diff --git a/icons/mob/actions/actions_mecha.dmi b/icons/mob/actions/actions_mecha.dmi new file mode 100644 index 0000000000000000000000000000000000000000..81c706b22c8aa57503b31d2c438ee0081c7d20b8 GIT binary patch literal 7153 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 literal 0 HcmV?d00001 diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index 56c1730fd3a3ecdedd394259cb85549421674389..b2e0a83bd35ee73b6007fe5ec331dfa58913e242 100644 GIT binary patch literal 41752 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 IM6N<$g17Qj1poj5 literal 40571 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%0AWPuGJccjC|JG4aue45+7~Hs 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
jA`~+SA?=M$??6gZHp(jG*Jr2nOULTWKj8>b} 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

N9oWrA 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 Date: Wed, 31 Oct 2018 17:12:43 +0800 Subject: [PATCH 04/32] Add baycard to map, loadout & datum. Replacing normal non-syndicate cards with them. --- _maps/map_files/Delta/delta.dmm | 12 ++++++------ _maps/map_files/RandomZLevels/moonoutpost19.dmm | 2 +- _maps/map_files/cyberiad/cyberiad.dmm | 8 ++++---- _maps/map_files/shuttles/emergency_bar.dmm | 2 +- _maps/map_files/templates/spacehotel/s_06.dmm | 2 +- code/modules/arcade/prize_datums.dm | 2 +- .../client/preference/loadout/loadout_general.dm | 12 ++++++++++-- 7 files changed, 24 insertions(+), 16 deletions(-) diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm index b02b0854d29..2ecf891ec60 100644 --- a/_maps/map_files/Delta/delta.dmm +++ b/_maps/map_files/Delta/delta.dmm @@ -2210,7 +2210,7 @@ "aQz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/security/prison) "aQA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/security/prison) "aQB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/table,/turf/simulated/floor/plating,/area/security/prison) -"aQC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel,/area/security/prison) +"aQC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table,/obj/item/deck/cards,/turf/simulated/floor/plasteel,/area/security/prison) "aQD" = (/obj/structure/chair/stool,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/prison) "aQE" = (/turf/simulated/floor/plasteel,/area/security/prison) "aQF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/prison) @@ -2264,7 +2264,7 @@ "aRB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/structure/chair/stool,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aRC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/table/wood,/obj/item/reagent_containers/food/snacks/cheesiehonkers,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aRD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/table/wood,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) -"aRE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/table/wood,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) +"aRE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aRF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/chair/stool,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aRG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aRH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/arrow,/obj/effect/decal/warning_stripes/yellow/partial,/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 4},/area/hallway/primary/fore) @@ -6472,7 +6472,7 @@ "cux" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/locker) "cuy" = (/obj/structure/table,/obj/item/storage/fancy/crayons,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) "cuz" = (/obj/structure/table,/obj/item/folder,/obj/item/pen,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) -"cuA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/structure/table,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) +"cuA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/structure/table,/obj/item/deck/cards,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) "cuB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/chair/stool,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) "cuC" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) "cuD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/closet/wardrobe/black,/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 2},/area/crew_quarters/locker) @@ -6652,7 +6652,7 @@ "cxV" = (/obj/item/twohanded/required/kirbyplants,/obj/structure/extinguisher_cabinet{pixel_x = -26},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/library) "cxW" = (/obj/structure/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) "cxX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/wood,/obj/item/storage/pill_bottle/dice,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) -"cxY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/wood,/obj/item/toy/cards/deck,/obj/item/toy/cards/deck/black{pixel_x = 0; pixel_y = 6},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) +"cxY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/wood,/obj/item/deck/cards,/obj/item/deck/cards{pixel_x = 0; pixel_y = 6},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) "cxZ" = (/obj/structure/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) "cya" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/library) "cyb" = (/obj/item/twohanded/required/kirbyplants,/obj/machinery/newscaster{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/library) @@ -7601,7 +7601,7 @@ "cQi" = (/obj/structure/closet/secure_closet/personal/cabinet,/turf/unsimulated/floor/carpet,/area/crew_quarters/sleep) "cQj" = (/obj/machinery/light,/obj/machinery/computer/cryopod{pixel_y = -32},/obj/machinery/camera{c_tag = "Cryodorms Aft"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/sleep) "cQk" = (/obj/structure/table,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness) -"cQl" = (/obj/structure/table,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/fitness) +"cQl" = (/obj/structure/table,/obj/item/deck/cards,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/fitness) "cQm" = (/obj/structure/table,/obj/item/storage/firstaid/regular,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/fitness) "cQn" = (/obj/structure/table,/obj/item/paper_bin,/obj/item/pen,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/fitness) "cQo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/chair{dir = 4},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 2},/area/crew_quarters/fitness) @@ -9846,7 +9846,7 @@ "dHr" = (/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/library/abandoned) "dHs" = (/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/library/abandoned) "dHt" = (/obj/structure/bookcase,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/library/abandoned) -"dHu" = (/obj/structure/table/wood,/obj/item/toy/cards/deck,/obj/item/toy/cards/deck/black{pixel_x = 0; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/library/abandoned) +"dHu" = (/obj/structure/table/wood,/obj/item/deck/cards,/obj/item/deck/cards{pixel_x = 0; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/library/abandoned) "dHv" = (/obj/structure/table/wood,/obj/item/clipboard,/obj/item/folder/red,/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/library/abandoned) "dHw" = (/obj/structure/chair/office/dark{dir = 8},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/plating,/area/library/abandoned) "dHx" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "neutral"},/area/maintenance/fpmaint2) diff --git a/_maps/map_files/RandomZLevels/moonoutpost19.dmm b/_maps/map_files/RandomZLevels/moonoutpost19.dmm index 870a6f075a8..89c6b61013b 100644 --- a/_maps/map_files/RandomZLevels/moonoutpost19.dmm +++ b/_maps/map_files/RandomZLevels/moonoutpost19.dmm @@ -692,7 +692,7 @@ "np" = (/obj/structure/sign/vacuum{desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; name = "\improper HOSTILE ATMOSPHERE AHEAD"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "nq" = (/obj/effect/decal/cleanable/cobweb2,/obj/effect/landmark/damageturf,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "nr" = (/obj/structure/chair{dir = 8},/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) -"ns" = (/obj/structure/table,/obj/item/toy/cards/deck,/obj/effect/landmark/damageturf,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) +"ns" = (/obj/structure/table,/obj/item/deck/cards,/obj/effect/landmark/damageturf,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "nt" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "nu" = (/obj/structure/grille/broken,/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "nv" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index e7dd8a55279..cfc1fc96d37 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -1404,7 +1404,7 @@ "aAZ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/security/lobby) "aBa" = (/obj/structure/chair{dir = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby) "aBb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/lobby) -"aBc" = (/obj/structure/table/wood,/obj/item/toy/cards/deck/black,/turf/simulated/floor/wood,/area/maintenance/abandonedbar) +"aBc" = (/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/wood,/area/maintenance/abandonedbar) "aBd" = (/obj/structure/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/abandonedbar) "aBe" = (/obj/structure/chair/wood/wings{tag = "icon-wooden_chair_wings (WEST)"; icon_state = "wooden_chair_wings"; dir = 8},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar) "aBf" = (/obj/structure/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/wood,/area/maintenance/abandonedbar) @@ -2070,7 +2070,7 @@ "aNP" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aNQ" = (/obj/machinery/light,/obj/item/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/structure/table/wood,/obj/item/reagent_containers/spray/waterflower,/turf/simulated/floor/wood,/area/mimeoffice) "aNR" = (/obj/structure/table/wood,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) -"aNS" = (/obj/structure/table/wood,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) +"aNS" = (/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "aNT" = (/obj/structure/disposalpipe/segment,/obj/structure/chair/stool,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "aNU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Arcade"},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/carpet/arcade,/area/crew_quarters/fitness{name = "\improper Arcade"}) "aNV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness) @@ -3033,7 +3033,7 @@ "bgq" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bgr" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bgs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) -"bgt" = (/obj/structure/table/wood,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry) +"bgt" = (/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry) "bgu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bgv" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/secondary/entry) "bgw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/port) @@ -3704,7 +3704,7 @@ "btl" = (/obj/structure/table/wood,/turf/simulated/floor/wood,/area/library) "btm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkred"},/area/hallway/secondary/exit) "btn" = (/obj/structure/disposalpipe/segment,/obj/structure/table/wood,/obj/item/dice,/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bto" = (/obj/structure/table/wood,/obj/item/toy/cards/deck,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bto" = (/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/wood,/area/crew_quarters/bar) "btp" = (/turf/simulated/floor/plasteel{icon_state = "rampbottom"; tag = "icon-stage_stairs"},/area/hallway/secondary/exit) "btq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "btr" = (/obj/structure/table/wood,/obj/item/reagent_containers/food/condiment/saltshaker{pixel_x = -2; pixel_y = 4},/obj/item/reagent_containers/food/condiment/peppermill{pixel_x = 2; pixel_y = 6},/turf/simulated/floor/wood,/area/crew_quarters/bar) diff --git a/_maps/map_files/shuttles/emergency_bar.dmm b/_maps/map_files/shuttles/emergency_bar.dmm index 8dede5a9ed1..abefc573a7e 100644 --- a/_maps/map_files/shuttles/emergency_bar.dmm +++ b/_maps/map_files/shuttles/emergency_bar.dmm @@ -51,7 +51,7 @@ "aY" = (/obj/structure/table/wood,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/shuttle/escape) "aZ" = (/obj/structure/table,/obj/machinery/chem_dispenser/soda,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape) "ba" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "8"},/turf/simulated/floor/plating,/area/shuttle/escape) -"bb" = (/obj/structure/table/wood,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/shuttle/escape) +"bb" = (/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/shuttle/escape) "bc" = (/obj/structure/chair/comfy/brown{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/shuttle/escape) "bd" = (/obj/structure/table,/obj/item/storage/box/drinkingglasses,/obj/item/reagent_containers/food/drinks/shaker,/obj/item/clothing/mask/cigarette/cigar,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape) "be" = (/obj/structure/chair/wood/wings{tag = "icon-wooden_chair_wings (NORTH)"; icon_state = "wooden_chair_wings"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/shuttle/escape) diff --git a/_maps/map_files/templates/spacehotel/s_06.dmm b/_maps/map_files/templates/spacehotel/s_06.dmm index 9ee738768dc..69fb8a932b8 100644 --- a/_maps/map_files/templates/spacehotel/s_06.dmm +++ b/_maps/map_files/templates/spacehotel/s_06.dmm @@ -4,7 +4,7 @@ "d" = (/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/obj/structure/rack,/obj/item/twohanded/dualsaber/toy,/obj/item/twohanded/toy/chainsaw,/obj/item/toy/foamblade,/turf/unsimulated/floor/carpet,/area/template_noop) "f" = (/obj/structure/rack,/obj/item/toy/griffin{pixel_y = 8},/obj/item/toy/snappop,/obj/item/toy/redbutton,/turf/unsimulated/floor/carpet,/area/template_noop) -"g" = (/obj/structure/rack,/obj/item/toy/cards/deck,/obj/item/toy/figure/secofficer,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/rack,/obj/item/deck/cards,/obj/item/toy/figure/secofficer,/turf/unsimulated/floor/carpet,/area/template_noop) "h" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) "i" = (/obj/structure/table/wood,/obj/item/flashlight/lamp/green,/turf/unsimulated/floor/carpet,/area/template_noop) "j" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop) diff --git a/code/modules/arcade/prize_datums.dm b/code/modules/arcade/prize_datums.dm index a2209a172ff..c4207dac0e8 100644 --- a/code/modules/arcade/prize_datums.dm +++ b/code/modules/arcade/prize_datums.dm @@ -76,7 +76,7 @@ var/global/datum/prizes/global_prizes = new /datum/prize_item/cards name = "Deck of Cards" desc = "Anyone fancy a game of 52-card Pickup?" - typepath = /obj/item/toy/cards/deck + typepath = /obj/item/deck/cards cost = 25 /datum/prize_item/crayons diff --git a/code/modules/client/preference/loadout/loadout_general.dm b/code/modules/client/preference/loadout/loadout_general.dm index 570679ce67f..50105813fd6 100644 --- a/code/modules/client/preference/loadout/loadout_general.dm +++ b/code/modules/client/preference/loadout/loadout_general.dm @@ -36,8 +36,16 @@ path = /obj/item/storage/box/matches /datum/gear/cards - display_name = "a deck of cards" - path = /obj/item/toy/cards/deck + display_name = "a deck of standard cards" + path = /obj/item/deck/cards + +/datum/gear/doublecards + display_name = "a double deck of standard cards" + path = /obj/item/deck/doublecards + +/datum/gear/tarot + display_name = "a deck of tarot cards" + path = /obj/item/deck/tarot /datum/gear/headphones display_name = "a pair of headphones" From 7905b640761cd3d6aff60d5ff45509c5697d9750 Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Wed, 31 Oct 2018 22:44:39 +0800 Subject: [PATCH 05/32] Port over fermentation barrel, minor refactor of reagent container, add in wine power etc. --- .../objects/items/weapons/storage/bags.dm | 2 +- code/modules/food_and_drinks/drinks/drinks.dm | 2 +- code/modules/hydroponics/fermenting_barrel.dm | 79 +++++++++++++ code/modules/hydroponics/grown.dm | 11 +- code/modules/hydroponics/grown/ambrosia.dm | 7 +- code/modules/hydroponics/grown/apple.dm | 3 + code/modules/hydroponics/grown/banana.dm | 4 + code/modules/hydroponics/grown/beans.dm | 4 +- code/modules/hydroponics/grown/berries.dm | 12 ++ code/modules/hydroponics/grown/cannabis.dm | 5 + code/modules/hydroponics/grown/cereals.dm | 4 + code/modules/hydroponics/grown/chili.dm | 3 + code/modules/hydroponics/grown/citrus.dm | 4 + .../hydroponics/grown/cocoa_vanilla.dm | 4 +- code/modules/hydroponics/grown/corn.dm | 2 + code/modules/hydroponics/grown/eggplant.dm | 4 +- code/modules/hydroponics/grown/flowers.dm | 3 + .../modules/hydroponics/grown/grass_carpet.dm | 2 + code/modules/hydroponics/grown/kudzu.dm | 1 + code/modules/hydroponics/grown/melon.dm | 3 + code/modules/hydroponics/grown/misc.dm | 4 + code/modules/hydroponics/grown/mushrooms.dm | 11 ++ code/modules/hydroponics/grown/onion.dm | 4 + code/modules/hydroponics/grown/pineapple.dm | 3 +- code/modules/hydroponics/grown/potato.dm | 2 + code/modules/hydroponics/grown/pumpkin.dm | 2 + code/modules/hydroponics/grown/random.dm | 8 +- code/modules/hydroponics/grown/root.dm | 4 + code/modules/hydroponics/grown/tea_coffee.dm | 2 + code/modules/hydroponics/grown/tobacco.dm | 5 +- code/modules/hydroponics/grown/tomato.dm | 5 + code/modules/mining/lavaland/ash_flora.dm | 32 +++--- .../reagents/chemistry/reagents/alcohol.dm | 104 ++++++++++++++++++ .../reagent_containers/glass_containers.dm | 3 +- icons/obj/objects.dmi | Bin 113670 -> 114714 bytes paradise.dme | 1 + 36 files changed, 320 insertions(+), 29 deletions(-) create mode 100644 code/modules/hydroponics/fermenting_barrel.dm diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 4d0de3bd09e..26309f885fa 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -168,7 +168,7 @@ max_combined_w_class = 100 //Doesn't matter what this is, so long as it's more or equal to storage_slots * plants.w_class max_w_class = WEIGHT_CLASS_NORMAL w_class = WEIGHT_CLASS_TINY - can_hold = list(/obj/item/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/grown,/obj/item/reagent_containers/food/snacks/ash_flora) + can_hold = list(/obj/item/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/grown,/obj/item/reagent_containers/food/snacks/grown/ash_flora) burn_state = FLAMMABLE /obj/item/storage/bag/plants/portaseeder diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 235b0b609f1..c481df1ca42 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -62,7 +62,7 @@ if(!proximity) return - if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it. + if(target.is_refillable() && is_drainable()) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) to_chat(user, " [src] is empty.") return FALSE diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm new file mode 100644 index 00000000000..ab9f9f82d3e --- /dev/null +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -0,0 +1,79 @@ +/obj/structure/fermenting_barrel + name = "wooden barrel" + desc = "A large wooden barrel. You can ferment fruits and such inside it, or just use it to hold liquid." + icon = 'icons/obj/objects.dmi' + icon_state = "barrel" + density = TRUE + anchored = FALSE + container_type = DRAINABLE | AMOUNT_VISIBLE + pressure_resistance = 2 * ONE_ATMOSPHERE + max_integrity = 300 + var/open = FALSE + var/speed_multiplier = 1 //How fast it distills. Defaults to 100% (1.0). Lower is better. + +/obj/structure/fermenting_barrel/Initialize() + create_reagents(300) //Bluespace beakers, but without the portability or efficiency in circuits. + . = ..() + +/obj/structure/fermenting_barrel/examine(mob/user) + . = ..() + to_chat(user, "It is currently [open ? "open, letting you pour liquids in." : "closed, letting you draw liquids from the tap."] ") + +/obj/structure/fermenting_barrel/proc/makeWine(obj/item/reagent_containers/food/snacks/grown/G) + if(G.reagents) + G.reagents.trans_to(src, G.reagents.total_volume) + var/amount = G.seed.potency / 4 + if(G.distill_reagent) + reagents.add_reagent(G.distill_reagent, amount) + else + var/data = list() + data["names"] = list("[initial(G.name)]" = 1) + data["color"] = G.filling_color + data["alcohol_perc"] = G.wine_power + if(G.wine_flavor) + data["tastes"] = list(G.wine_flavor = 1) + // else // Stub - Will implement when we port over tg's better taste system - I'd rather get the barrel in first. + // data["tastes"] = list(G.tastes[1] = 1) + reagents.add_reagent("fruit_wine", amount, data) + qdel(G) + playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) + +/obj/structure/fermenting_barrel/attackby(obj/item/I, mob/user, params) + var/obj/item/reagent_containers/food/snacks/grown/G = I + if(istype(G)) + if(!G.can_distill) + to_chat(user, "You can't distill this into anything...") + return FALSE + else if(!user.drop_item()) + to_chat(user, "[G] is stuck to your hand!") + return FALSE + G.loc = src + to_chat(user, "You place [G] into [src] to start the fermentation process.") + addtimer(CALLBACK(src, .proc/makeWine, G), rand(80, 120) * speed_multiplier) + else if(I.is_refillable()) + return FALSE // To refill via afterattack proc + else + return ..() + +/obj/structure/fermenting_barrel/attack_hand(mob/user) + open = !open + if(open) + container_type = REFILLABLE | AMOUNT_VISIBLE + to_chat(user, "You open [src], letting you fill it.") + else + container_type = DRAINABLE | AMOUNT_VISIBLE + to_chat(user, "You close [src], letting you draw from its tap.") + update_icon() + +/obj/structure/fermenting_barrel/update_icon() + if(open) + icon_state = "barrel_open" + else + icon_state = "barrel" + +/datum/crafting_recipe/fermenting_barrel + name = "Wooden Barrel" + result = /obj/structure/fermenting_barrel + reqs = list(/obj/item/stack/sheet/wood = 30) + time = 50 + category = CAT_PRIMAL diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 772e9f5d856..2e0feaecea7 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -8,12 +8,13 @@ icon = 'icons/obj/hydroponics/harvest.dmi' var/obj/item/seeds/seed = null // type path, gets converted to item on New(). It's safe to assume it's always a seed item. var/plantname = "" - var/bitesize_mod = 0 + var/bitesize_mod = 0 // If set, bitesize = 1 + round(reagents.total_volume / bitesize_mod) var/splat_type = /obj/effect/decal/cleanable/plant_smudge - // If set, bitesize = 1 + round(reagents.total_volume / bitesize_mod) - dried_type = -1 - // Saves us from having to define each stupid grown's dried_type as itself. - // If you don't want a plant to be driable (watermelons) set this to null in the time definition. + var/can_distill = TRUE //If FALSE, this object cannot be distilled into an alcohol. + var/distill_reagent //If NULL and this object can be distilled, it uses a generic fruit_wine reagent and adjusts its variables. + var/wine_flavor //If NULL, this is automatically set to the fruit's flavor. Determines the flavor of the wine if distill_reagent is NULL. + var/wine_power = 0.1 //Determines the boozepwr of the wine if distill_reagent is NULL. Uses 0.1 - 1.2 not tg's boozepower (divide by 100) else you'll end up with 1000% proof alcohol! + dried_type = -1 // Saves us from having to define each stupid grown's dried_type as itself. If you don't want a plant to be driable (watermelons) set this to null in the time definition. burn_state = FLAMMABLE origin_tech = "biotech=1" diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm index d6942d6a7f6..47b2975ffa8 100644 --- a/code/modules/hydroponics/grown/ambrosia.dm +++ b/code/modules/hydroponics/grown/ambrosia.dm @@ -30,6 +30,7 @@ name = "ambrosia vulgaris branch" desc = "This is a plant containing various healing chemicals." origin_tech = "biotech=2" + wine_power = 0.2 // Ambrosia Deus /obj/item/seeds/ambrosia/deus @@ -50,6 +51,7 @@ icon_state = "ambrosiadeus" filling_color = "#008B8B" origin_tech = "biotech=4;materials=3" + wine_power = 0.5 //Ambrosia Gaia /obj/item/seeds/ambrosia/gaia @@ -74,6 +76,8 @@ origin_tech = "biotech=6;materials=5" light_range = 3 seed = /obj/item/seeds/ambrosia/gaia + wine_power = 0.7 + wine_flavor = "the earthmothert's blessing" // Ambrosia Cruciatus /obj/item/seeds/ambrosia/cruciatus @@ -83,4 +87,5 @@ reagents_add = list("thc" = 0.15, "kelotane" = 0.15, "bicaridine" = 0.1, "bath_salts" = 0.20, "plantmatter" = 0.05) /obj/item/reagent_containers/food/snacks/grown/ambrosia/cruciatus - seed = /obj/item/seeds/ambrosia/cruciatus \ No newline at end of file + seed = /obj/item/seeds/ambrosia/cruciatus + wine_power = 0.7 \ No newline at end of file diff --git a/code/modules/hydroponics/grown/apple.dm b/code/modules/hydroponics/grown/apple.dm index 64c7c0381a9..67948c4beb9 100644 --- a/code/modules/hydroponics/grown/apple.dm +++ b/code/modules/hydroponics/grown/apple.dm @@ -23,6 +23,7 @@ icon_state = "apple" filling_color = "#FF4500" bitesize = 100 // Always eat the apple in one bite + distill_reagent = "hcider" // Posioned Apple /obj/item/seeds/apple/poisoned @@ -55,3 +56,5 @@ icon_state = "goldapple" filling_color = "#FFD700" origin_tech = "biotech=4;materials=5" + distill_reagent = null + wine_power = 0.5 diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index 6874038a7bf..4515b3ad75f 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -23,6 +23,7 @@ trash = /obj/item/grown/bananapeel filling_color = "#FFFF00" bitesize = 5 + distill_reagent = "bananahonk" /obj/item/reagent_containers/food/snacks/grown/banana/suicide_act(mob/user) user.visible_message("[user] is aiming the [name] at [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide.") @@ -74,6 +75,7 @@ icon_state = "mimana" trash = /obj/item/grown/bananapeel/mimanapeel filling_color = "#FFFFEE" + distill_reagent = "silencer" /obj/item/grown/bananapeel/mimanapeel seed = /obj/item/seeds/banana/mime @@ -102,6 +104,8 @@ trash = /obj/item/grown/bananapeel/bluespace filling_color = "#0000FF" origin_tech = "biotech=3;bluespace=5" + wine_power = 0.6 + wine_flavor = "slippery hypercubes" /obj/item/grown/bananapeel/bluespace seed = /obj/item/seeds/banana/bluespace diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm index 24ddf1dbbba..fa73e7cd45f 100644 --- a/code/modules/hydroponics/grown/beans.dm +++ b/code/modules/hydroponics/grown/beans.dm @@ -25,6 +25,7 @@ icon_state = "soybeans" filling_color = "#F0E68C" bitesize_mod = 2 + wine_power = 20 // Koibean /obj/item/seeds/soya/koi @@ -45,4 +46,5 @@ desc = "Something about these seems fishy." icon_state = "koibeans" filling_color = "#F0E68C" - bitesize_mod = 2 \ No newline at end of file + bitesize_mod = 2 + wine_power = 40 \ No newline at end of file diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index 155566ebd10..8e740719fbf 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -25,6 +25,7 @@ gender = PLURAL filling_color = "#FF00FF" bitesize_mod = 2 + distill_reagent = "gin" // Poison Berries /obj/item/seeds/berry/poison @@ -44,6 +45,8 @@ desc = "Taste so good, you could die!" icon_state = "poisonberrypile" filling_color = "#C71585" + distill_reagent = null + wine_power = 0.35 // Death Berries /obj/item/seeds/berry/death @@ -65,6 +68,8 @@ desc = "Taste so good, you could die!" icon_state = "deathberrypile" filling_color = "#708090" + distill_reagent = null + wine_power = 0.5 // Glow Berries /obj/item/seeds/berry/glow @@ -89,6 +94,9 @@ filling_color = "#7CFC00" origin_tech = "plasmatech=6" light_color = "#006622" + distill_reagent = null + wine_power = 0.6 + wine_flavor = "warmth" // Cherries /obj/item/seeds/cherry @@ -118,6 +126,7 @@ gender = PLURAL filling_color = "#FF0000" bitesize_mod = 2 + wine_power = 0.3 // Blue Cherries /obj/item/seeds/cherry/blue @@ -138,6 +147,7 @@ icon_state = "bluecherry" filling_color = "#6495ED" bitesize_mod = 2 + wine_power = 0.5 // Grapes /obj/item/seeds/grape @@ -168,6 +178,7 @@ dried_type = /obj/item/reagent_containers/food/snacks/no_raisin filling_color = "#FF1493" bitesize_mod = 2 + distill_reagent = "wine" // Green Grapes /obj/item/seeds/grape/green @@ -186,3 +197,4 @@ name = "bunch of green grapes" icon_state = "greengrapes" filling_color = "#7FFF00" + distill_reagent = "cognac" diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm index e82e72e83b0..ed05d7a6954 100644 --- a/code/modules/hydroponics/grown/cannabis.dm +++ b/code/modules/hydroponics/grown/cannabis.dm @@ -93,6 +93,7 @@ icon_state = "cannabis" filling_color = "#00FF00" bitesize_mod = 2 + wine_power = 0.2 /obj/item/reagent_containers/food/snacks/grown/cannabis/rainbow @@ -100,18 +101,21 @@ name = "rainbow cannabis leaf" desc = "Is it supposed to be glowing like that...?" icon_state = "megacannabis" + wine_power = 0.6 /obj/item/reagent_containers/food/snacks/grown/cannabis/death seed = /obj/item/seeds/cannabis/death name = "death cannabis leaf" desc = "Looks a bit dark. Oh well." icon_state = "blackcannabis" + wine_power = 0.4 /obj/item/reagent_containers/food/snacks/grown/cannabis/white seed = /obj/item/seeds/cannabis/white name = "white cannabis leaf" desc = "It feels smooth and nice to the touch." icon_state = "whitecannabis" + wine_power = 0.1 /obj/item/reagent_containers/food/snacks/grown/cannabis/ultimate seed = /obj/item/seeds/cannabis/ultimate @@ -119,3 +123,4 @@ desc = "You feel dizzy looking at it. What the fuck?" icon_state = "ocannabis" volume = 420 + wine_power = 0.9 diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm index 91b6cd0a14c..e864687a551 100644 --- a/code/modules/hydroponics/grown/cereals.dm +++ b/code/modules/hydroponics/grown/cereals.dm @@ -21,6 +21,7 @@ icon_state = "wheat" filling_color = "#F0E68C" bitesize_mod = 2 + distill_reagent = "beer" // Oat /obj/item/seeds/wheat/oat @@ -40,6 +41,7 @@ icon_state = "oat" filling_color = "#556B2F" bitesize_mod = 2 + distill_reagent = "ale" // Rice /obj/item/seeds/wheat/rice @@ -60,6 +62,7 @@ icon_state = "rice" filling_color = "#FAFAD2" bitesize_mod = 2 + distill_reagent = "sake" //Meatwheat - grows into synthetic meat /obj/item/seeds/wheat/meat @@ -80,6 +83,7 @@ filling_color = rgb(150, 0, 0) bitesize_mod = 2 seed = /obj/item/seeds/wheat/meat + can_distill = FALSE /obj/item/reagent_containers/food/snacks/grown/meatwheat/attack_self(mob/living/user) user.visible_message("[user] crushes [src] into meat.", "You crush [src] into something that resembles meat.") diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm index f8bf515ce6b..5f4621eff16 100644 --- a/code/modules/hydroponics/grown/chili.dm +++ b/code/modules/hydroponics/grown/chili.dm @@ -25,6 +25,7 @@ icon_state = "chilipepper" filling_color = "#FF0000" bitesize_mod = 2 + wine_power = 0.2 // Ice Chili /obj/item/seeds/chili/ice @@ -49,6 +50,7 @@ filling_color = "#0000CD" bitesize_mod = 2 origin_tech = "biotech=4" + wine_power = 0.3 // Ghost Chili /obj/item/seeds/chili/ghost @@ -74,3 +76,4 @@ filling_color = "#F8F8FF" bitesize_mod = 4 origin_tech = "biotech=4;magnets=5" + wine_power = 0.5 diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index 86bc8082661..b6e4a36d164 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -5,6 +5,7 @@ desc = "It's so sour, your face will twist." icon_state = "lime" bitesize_mod = 2 + wine_power = 0.3 // Lime /obj/item/seeds/lime @@ -29,6 +30,7 @@ desc = "It's so sour, your face will twist." icon_state = "lime" filling_color = "#00FF00" + distill_reagent = "triple_sec" // Orange /obj/item/seeds/orange @@ -104,6 +106,8 @@ desc = "Made for burning houses down." icon_state = "firelemon" bitesize_mod = 2 + wine_power = 0.7 + wine_flavor = "fire" /obj/item/reagent_containers/food/snacks/grown/firelemon/attack_self(mob/living/user) var/area/A = get_area(user) diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm index 0ca061af745..745aa006498 100644 --- a/code/modules/hydroponics/grown/cocoa_vanilla.dm +++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm @@ -25,6 +25,7 @@ icon_state = "cocoapod" filling_color = "#FFD700" bitesize_mod = 2 + distill_reagent = "creme_de_cacao" // Vanilla Pod /obj/item/seeds/cocoapod/vanillapod @@ -43,4 +44,5 @@ name = "vanilla pod" desc = "Fattening... Mmmmm... vanilla." icon_state = "vanillapod" - filling_color = "#FFD700" \ No newline at end of file + filling_color = "#FFD700" + distill_reagent = "vanilla" //Takes longer, but you can get even more vanilla from it. \ No newline at end of file diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index 693818c9537..dca121d1acb 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -24,6 +24,8 @@ filling_color = "#FFFF00" trash = /obj/item/grown/corncob bitesize_mod = 2 + distill_reagent = "whiskey" + wine_power = 0.4 /obj/item/grown/corncob name = "corn cob" diff --git a/code/modules/hydroponics/grown/eggplant.dm b/code/modules/hydroponics/grown/eggplant.dm index d9a243eab6f..b9244bfd3ec 100644 --- a/code/modules/hydroponics/grown/eggplant.dm +++ b/code/modules/hydroponics/grown/eggplant.dm @@ -22,6 +22,7 @@ icon_state = "eggplant" filling_color = "#800080" bitesize_mod = 2 + wine_power = 0.2 // Egg-Plant /obj/item/seeds/eggplant/eggy @@ -41,4 +42,5 @@ icon_state = "eggyplant" trash = /obj/item/reagent_containers/food/snacks/egg filling_color = "#F8F8FF" - bitesize_mod = 2 \ No newline at end of file + bitesize_mod = 2 + distill_reagent = "eggnog" \ No newline at end of file diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index b8d88ebf0c9..adbb5f3152c 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -25,6 +25,7 @@ slot_flags = SLOT_HEAD filling_color = "#FF6347" bitesize_mod = 3 + distill_reagent = "vermouth" // Lily /obj/item/seeds/poppy/lily @@ -88,6 +89,7 @@ slot_flags = SLOT_HEAD filling_color = "#E6E6FA" bitesize_mod = 3 + distill_reagent = "vermouth" // Sunflower @@ -145,6 +147,7 @@ slot_flags = SLOT_HEAD filling_color = "#E6E6FA" bitesize_mod = 2 + distill_reagent = "absinthe" // Novaflower /obj/item/seeds/sunflower/novaflower diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index 5113a8454f3..c45899a310b 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -27,6 +27,7 @@ bitesize_mod = 2 var/stacktype = /obj/item/stack/tile/grass var/tile_coefficient = 0.02 // 1/50 + wine_power = 0.15 /obj/item/reagent_containers/food/snacks/grown/grass/attack_self(mob/user) to_chat(user, "You prepare the astroturf.") @@ -65,3 +66,4 @@ desc = "The textile industry's dark secret." icon_state = "carpetclump" stacktype = /obj/item/stack/tile/carpet + can_distill = FALSE diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm index ba67bf426fa..eea80e17e60 100644 --- a/code/modules/hydroponics/grown/kudzu.dm +++ b/code/modules/hydroponics/grown/kudzu.dm @@ -95,3 +95,4 @@ icon_state = "kudzupod" filling_color = "#6B8E23" bitesize_mod = 2 + wine_power = 0.2 diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index be548339d39..ed7608e21b9 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -25,6 +25,7 @@ w_class = WEIGHT_CLASS_NORMAL filling_color = "#008000" bitesize_mod = 3 + wine_power = 0.4 // Holymelon /obj/item/seeds/watermelon/holy @@ -45,3 +46,5 @@ icon_state = "holymelon" filling_color = "#FFD700" dried_type = null + wine_power = 0.7 //Water to wine, baby. + wine_flavor = "divinity" diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index df58b55c333..605f5082522 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -53,6 +53,7 @@ icon_state = "cabbage" filling_color = "#90EE90" bitesize_mod = 2 + wine_power = 0.2 // Sugarcane @@ -78,6 +79,7 @@ icon_state = "sugarcane" filling_color = "#FFD700" bitesize_mod = 2 + distill_reagent = "rum" // Gatfruit @@ -108,6 +110,7 @@ origin_tech = "combat=6" trash = /obj/item/gun/projectile/revolver bitesize_mod = 2 + wine_power = 0.9 //It burns going down, too. //Cherry Bombs /obj/item/seeds/cherry/bomb @@ -129,6 +132,7 @@ seed = /obj/item/seeds/cherry/bomb bitesize_mod = 2 volume = 125 //Gives enough room for the black powder at max potency + wine_power = 0.8 /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/attack_self(mob/living/user) var/area/A = get_area(user) diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index 95ea83cd424..14c4b2a252a 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -1,6 +1,7 @@ /obj/item/reagent_containers/food/snacks/grown/mushroom name = "mushroom" bitesize_mod = 2 + wine_power = 0.4 // Reishi @@ -84,6 +85,7 @@ desc = "Amanita Virosa: Deadly poisonous basidiomycete fungus filled with alpha amanitin." icon_state = "angel" filling_color = "#C0C0C0" + wine_power = 0.6 // Liberty Cap @@ -109,6 +111,8 @@ desc = "Psilocybe Semilanceata: Liberate yourself!" icon_state = "libertycap" filling_color = "#DAA520" + wine_power = 0.8 + wine_flavor = "freedom" // Plump Helmet @@ -135,6 +139,7 @@ desc = "Plumus Hellmus: Plump, soft and s-so inviting~" icon_state = "plumphelmet" filling_color = "#9370DB" + distill_reagent = "manlydorf" // Walking Mushroom @@ -161,6 +166,7 @@ icon_state = "walkingmushroom" filling_color = "#9370DB" origin_tech = "biotech=4;programming=5" + can_distill = FALSE /obj/item/reagent_containers/food/snacks/grown/mushroom/walkingmushroom/attack_self(mob/user) if(istype(user.loc, /turf/space)) @@ -232,6 +238,7 @@ var/effect_path = /obj/structure/glowshroom origin_tech = "biotech=4;plasmatech=6" light_color = "#006622" + wine_power = 0.5 /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/attack_self(mob/user) if(istype(user.loc, /turf/space)) @@ -280,6 +287,8 @@ effect_path = /obj/structure/glowshroom/glowcap origin_tech = "biotech=4;powerstorage=6;plasmatech=4" light_color = "#8E0300" + wine_power = 0.6 + wine_flavor = "warmth" // Fungus/Mold /obj/item/seeds/fungus @@ -326,3 +335,5 @@ icon_state = "shadowshroom" effect_path = /obj/structure/glowshroom/shadowshroom origin_tech = "biotech=4;plasmatech=4;magnets=4" + wine_power = 0.6 + wine_flavor = "strange coldness" diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm index 93176799802..e39548d9e7c 100644 --- a/code/modules/hydroponics/grown/onion.dm +++ b/code/modules/hydroponics/grown/onion.dm @@ -25,6 +25,8 @@ bitesize_mod = 2 slice_path = /obj/item/reagent_containers/food/snacks/onion_slice slices_num = 2 + wine_power = 0.2 + wine_flavor = "pungentness" /obj/item/seeds/onion/red name = "pack of red onion seeds" @@ -43,6 +45,8 @@ icon_state = "onion_red" filling_color = "#C29ACF" slice_path = /obj/item/reagent_containers/food/snacks/onion_slice/red + wine_power = 0.6 + wine_flavor = "powerful pungentness" /obj/item/reagent_containers/food/snacks/onion_slice name = "onion slices" diff --git a/code/modules/hydroponics/grown/pineapple.dm b/code/modules/hydroponics/grown/pineapple.dm index 2e0825151c6..589f9456bc2 100644 --- a/code/modules/hydroponics/grown/pineapple.dm +++ b/code/modules/hydroponics/grown/pineapple.dm @@ -24,4 +24,5 @@ icon_state = "pineapple" filling_color = "#e5b437" w_class = WEIGHT_CLASS_NORMAL - bitesize_mod = 3 \ No newline at end of file + bitesize_mod = 3 + wine_power = 0.4 \ No newline at end of file diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm index 2692ee8adf8..655cb6d69bd 100644 --- a/code/modules/hydroponics/grown/potato.dm +++ b/code/modules/hydroponics/grown/potato.dm @@ -25,6 +25,7 @@ icon_state = "potato" filling_color = "#E9967A" bitesize = 100 + distill_reagent = "vodka" /obj/item/reagent_containers/food/snacks/grown/potato/wedges @@ -33,6 +34,7 @@ icon_state = "potato_wedges" filling_color = "#E9967A" bitesize = 100 + distill_reagent = "sbiten" /obj/item/reagent_containers/food/snacks/grown/potato/attackby(obj/item/W, mob/user, params) diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm index 9668379442d..f05a6847dc2 100644 --- a/code/modules/hydroponics/grown/pumpkin.dm +++ b/code/modules/hydroponics/grown/pumpkin.dm @@ -23,6 +23,7 @@ icon_state = "pumpkin" filling_color = "#FFA500" bitesize_mod = 2 + wine_power = 0.2 /obj/item/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, params) if(is_sharp(W)) @@ -52,3 +53,4 @@ icon_state = "blumpkin" filling_color = "#87CEFA" bitesize_mod = 2 + wine_power = 0.5 diff --git a/code/modules/hydroponics/grown/random.dm b/code/modules/hydroponics/grown/random.dm index 734adae15be..f743989cb4a 100644 --- a/code/modules/hydroponics/grown/random.dm +++ b/code/modules/hydroponics/grown/random.dm @@ -26,4 +26,10 @@ name = "strange plant" desc = "What could this even be?" icon_state = "crunchy" - bitesize_mod = 2 \ No newline at end of file + bitesize_mod = 2 + +/obj/item/reagent_containers/food/snacks/grown/random/Initialize() + . = ..() + wine_power = rand(0.1,1.5) + if(prob(1)) + wine_power = 2.0 \ No newline at end of file diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm index 7f26176c675..35bb5ee195c 100644 --- a/code/modules/hydroponics/grown/root.dm +++ b/code/modules/hydroponics/grown/root.dm @@ -21,6 +21,7 @@ icon_state = "carrot" filling_color = "#FFA500" bitesize_mod = 2 + wine_power = 0.3 /obj/item/reagent_containers/food/snacks/grown/carrot/wedges name = "carrot wedges" @@ -59,6 +60,7 @@ desc = "Closely related to carrots." icon_state = "parsnip" bitesize_mod = 2 + wine_power = 0.35 // White-Beet @@ -84,6 +86,7 @@ icon_state = "whitebeet" filling_color = "#F4A460" bitesize_mod = 2 + wine_power = 0.4 // Red Beet /obj/item/seeds/redbeet @@ -107,3 +110,4 @@ desc = "You can't beat red beet." icon_state = "redbeet" bitesize_mod = 2 + wine_power = 0.6 diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index bd3b182c132..1139c03cad5 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -22,6 +22,7 @@ desc = "These aromatic tips of the tea plant can be dried to make tea." icon_state = "tea_aspera_leaves" filling_color = "#008000" + can_distill = FALSE // Tea Astra /obj/item/seeds/tea/astra @@ -67,6 +68,7 @@ icon_state = "coffee_arabica" filling_color = "#DC143C" bitesize_mod = 2 + distill_reagent = "kahlua" // Coffee Robusta /obj/item/seeds/coffee/robusta diff --git a/code/modules/hydroponics/grown/tobacco.dm b/code/modules/hydroponics/grown/tobacco.dm index de235280b02..95333bba31a 100644 --- a/code/modules/hydroponics/grown/tobacco.dm +++ b/code/modules/hydroponics/grown/tobacco.dm @@ -21,6 +21,7 @@ desc = "Dry them out to make some smokes." icon_state = "tobacco_leaves" filling_color = "#008000" + distill_reagent = "creme_de_menthe" //Menthol, I guess. // Space Tobacco /obj/item/seeds/tobacco/space @@ -38,4 +39,6 @@ seed = /obj/item/seeds/tobacco/space name = "space tobacco leaves" desc = "Dry them out to make some space-smokes." - icon_state = "stobacco_leaves" \ No newline at end of file + icon_state = "stobacco_leaves" + distill_reagent = null + wine_power = 0.5 \ No newline at end of file diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index 3adf57c4021..58bf18057ad 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -22,6 +22,7 @@ splat_type = /obj/effect/decal/cleanable/tomato_smudge filling_color = "#FF6347" bitesize_mod = 2 + distill_reagent = "enzyme" // Blood Tomato /obj/item/seeds/tomato/blood @@ -43,6 +44,7 @@ splat_type = /obj/effect/gibspawner/generic filling_color = "#FF0000" origin_tech = "biotech=5" + distill_reagent = "bloodymary" // Blue Tomato @@ -89,6 +91,8 @@ desc = "So lubricated, you might slip through space-time." icon_state = "bluespacetomato" origin_tech = "biotech=4;bluespace=5" + distill_reagent = null + wine_power = 0.8 // Killer Tomato @@ -117,6 +121,7 @@ var/awakening = 0 filling_color = "#FF0000" origin_tech = "biotech=4;combat=5" + distill_reagent = "demonsblood" /obj/item/reagent_containers/food/snacks/grown/tomato/killer/attack(mob/M, mob/user, def_zone) if(awakening) diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index 364a918c0ff..0e0d248d8b7 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -7,7 +7,7 @@ var/harvested_name = "shortened mushrooms" var/harvested_desc = "Some quickly regrowing mushrooms, formerly known to be quite large." var/needs_sharp_harvest = TRUE - var/harvest = /obj/item/reagent_containers/food/snacks/ash_flora/shavings + var/harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings var/harvest_amount_low = 1 var/harvest_amount_high = 3 var/harvest_time = 60 @@ -79,7 +79,7 @@ desc = "A number of mushrooms, each of which surrounds a greenish sporangium with a number of leaf-like structures." harvested_name = "leafless mushrooms" harvested_desc = "A bunch of formerly-leafed mushrooms, with their sporangiums exposed. Scandalous?" - harvest = /obj/item/reagent_containers/food/snacks/ash_flora/mushroom_leaf + harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf needs_sharp_harvest = FALSE harvest_amount_high = 4 harvest_time = 20 @@ -95,7 +95,7 @@ desc = "Several mushrooms, the larger of which have a ring of conks at the midpoint of their stems." harvested_name = "small mushrooms" harvested_desc = "Several small mushrooms near the stumps of what likely were larger mushrooms." - harvest = /obj/item/reagent_containers/food/snacks/ash_flora/mushroom_cap + harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap harvest_amount_high = 4 harvest_time = 50 harvest_message_low = "You slice the cap off of a mushroom." @@ -111,7 +111,7 @@ luminosity = 1 harvested_name = "tiny mushrooms" harvested_desc = "A few tiny mushrooms around larger stumps. You can already see them growing back." - harvest = /obj/item/reagent_containers/food/snacks/ash_flora/mushroom_stem + harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem harvest_amount_high = 4 harvest_time = 40 harvest_message_low = "You pick and slice the cap off of a mushroom, leaving the stem." @@ -126,7 +126,7 @@ desc = "Several prickly cacti, brimming with ripe fruit and covered in a thin layer of ash." harvested_name = "cacti" harvested_desc = "A bunch of prickly cacti. You can see fruits slowly growing beneath the covering of ash." - harvest = /obj/item/reagent_containers/food/snacks/ash_flora/cactus_fruit + harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit needs_sharp_harvest = FALSE harvest_amount_high = 2 harvest_time = 10 @@ -149,45 +149,51 @@ H.visible_message("[H] steps on a cactus!", \ "You step on a cactus!") -/obj/item/reagent_containers/food/snacks/ash_flora +/obj/item/reagent_containers/food/snacks/grown/ash_flora name = "mushroom shavings" desc = "Some shavings from a tall mushroom. With enough, might serve as a bowl." icon = 'icons/obj/lavaland/ash_flora.dmi' icon_state = "mushroom_shavings" list_reagents = list("sugar" = 3, "ethanol" = 2, "stabilizing_agent" = 3, "minttoxin" = 2) w_class = WEIGHT_CLASS_TINY + wine_power = 0.2 -/obj/item/reagent_containers/food/snacks/ash_flora/New() +/obj/item/reagent_containers/food/snacks/grown/ash_flora/New() ..() pixel_x = rand(-4, 4) pixel_y = rand(-4, 4) -/obj/item/reagent_containers/food/snacks/ash_flora/shavings //for actual crafting +/obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings //for actual crafting -/obj/item/reagent_containers/food/snacks/ash_flora/mushroom_leaf +/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf name = "mushroom leaf" desc = "A leaf, from a mushroom." list_reagents = list("nutriment" = 3, "vitfro" = 2, "nicotine" = 2) icon_state = "mushroom_leaf" + wine_power = 0.4 -/obj/item/reagent_containers/food/snacks/ash_flora/mushroom_cap +/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap name = "mushroom cap" desc = "The cap of a large mushroom." list_reagents = list("lsd" = 2, "entpoly" = 4, "psilocybin" = 2) icon_state = "mushroom_cap" + wine_power = 0.7 -/obj/item/reagent_containers/food/snacks/ash_flora/mushroom_stem + +/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem name = "mushroom stem" desc = "A long mushroom stem. It's slightly glowing." list_reagents = list("tinlux" = 2, "vitamin" = 1, "space_drugs" = 1) icon_state = "mushroom_stem" luminosity = 1 + wine_power = 0.6 -/obj/item/reagent_containers/food/snacks/ash_flora/cactus_fruit +/obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit name = "cactus fruit" list_reagents = list("vitamin" = 2, "nutriment" = 2, "vitfro" = 4) desc = "A cactus fruit covered in a thick, reddish skin. And some ash." icon_state = "cactus_fruit" + wine_power = 0.5 /obj/item/mushroom_bowl name = "mushroom bowl" @@ -200,6 +206,6 @@ /datum/crafting_recipe/mushroom_bowl name = "Mushroom Bowl" result = /obj/item/reagent_containers/food/drinks/mushroom_bowl - reqs = list(/obj/item/reagent_containers/food/snacks/ash_flora/shavings = 5) + reqs = list(/obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings = 5) time = 30 category = CAT_PRIMAL diff --git a/code/modules/reagents/chemistry/reagents/alcohol.dm b/code/modules/reagents/chemistry/reagents/alcohol.dm index c74e5973bf7..9a74b155e52 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol.dm @@ -1236,3 +1236,107 @@ drink_icon = "synthignonglass" drink_name = "Glass of Synthignon" drink_desc = "Someone mixed good wine and robot booze. Romantic, but atrocious." + +/datum/reagent/consumable/ethanol/fruit_wine + name = "Fruit Wine" + id = "fruit_wine" + description = "A wine made from grown plants." + color = "#FFFFFF" + alcohol_perc = 0.35 + taste_message = "bad coding" + can_synth = FALSE + var/list/names = list("null fruit" = 1) //Names of the fruits used. Associative list where name is key, value is the percentage of that fruit. + var/list/tastes = list("bad coding" = 1) //List of tastes. See above. + +/datum/reagent/consumable/ethanol/fruit_wine/on_new(list/data) + names = data["names"] + tastes = data["tastes"] + alcohol_perc = data["alcohol_perc"] + color = data["color"] + generate_data_info(data) + +/datum/reagent/consumable/ethanol/fruit_wine/on_merge(list/data, amount) + var/diff = (amount/volume) + if(diff < 1) + color = BlendRGB(color, data["color"], diff/2) //The percentage difference over two, so that they take average if equal. + else + color = BlendRGB(color, data["color"], (1/diff)/2) //Adjust so it's always blending properly. + var/oldvolume = volume-amount + + var/list/cachednames = data["names"] + for(var/name in names | cachednames) + names[name] = ((names[name] * oldvolume) + (cachednames[name] * amount)) / volume + + var/list/cachedtastes = data["tastes"] + for(var/taste in tastes | cachedtastes) + tastes[taste] = ((tastes[taste] * oldvolume) + (cachedtastes[taste] * amount)) / volume + + alcohol_perc *= oldvolume + var/newzepwr = data["alcohol_perc"] * amount + alcohol_perc += newzepwr + alcohol_perc /= volume //Blending alcohol percentage to volume. + generate_data_info(data) + +/datum/reagent/consumable/ethanol/fruit_wine/proc/generate_data_info(list/data) + var/minimum_percent = 0.15 //Percentages measured between 0 and 1. + var/list/primary_tastes = list() + var/list/secondary_tastes = list() + drink_name = "glass of [name]" + drink_desc = description + for(var/taste in tastes) + switch(tastes[taste]) + if(minimum_percent*2 to INFINITY) + primary_tastes += taste + if(minimum_percent to minimum_percent*2) + secondary_tastes += taste + + var/minimum_name_percent = 0.35 + name = "" + var/list/names_in_order = sortTim(names, /proc/cmp_numeric_dsc, TRUE) + var/named = FALSE + for(var/fruit_name in names) + if(names[fruit_name] >= minimum_name_percent) + name += "[fruit_name] " + named = TRUE + if(named) + name += "wine" + else + name = "mixed [names_in_order[1]] wine" + + var/alcohol_description + switch(alcohol_perc) + if(1.2 to INFINITY) + alcohol_description = "suicidally strong" + if(0.9 to 1.2) + alcohol_description = "rather strong" + if(0.7 to 0.9) + alcohol_description = "strong" + if(0.4 to 0.7) + alcohol_description = "rich" + if(0.2 to 0.4) + alcohol_description = "mild" + if(0 to 0.2) + alcohol_description = "sweet" + else + alcohol_description = "watery" //How the hell did you get negative boozepwr? + + var/list/fruits = list() + if(names_in_order.len <= 3) + fruits = names_in_order + else + for(var/i in 1 to 3) + fruits += names_in_order[i] + fruits += "other plants" + var/fruit_list = english_list(fruits) + description = "A [alcohol_description] wine brewed from [fruit_list]." + + var/flavor = "" + if(!primary_tastes.len) + primary_tastes = list("[alcohol_description] alcohol") + flavor += english_list(primary_tastes) + if(secondary_tastes.len) + flavor += ", with a hint of " + flavor += english_list(secondary_tastes) + taste_message = flavor + if(holder.my_atom) + holder.my_atom.on_reagent_change() diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 69030fafa74..e82dbda249d 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -95,7 +95,6 @@ spawn(5) reagents.clear_reagents() return else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. - if(target.reagents && !target.reagents.total_volume) to_chat(user, "[target] is empty and can't be refilled!") return @@ -107,7 +106,7 @@ var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) to_chat(user, "You fill [src] with [trans] unit\s of the contents of [target].") - else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it. + else if(target.is_refillable() && is_drainable()) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) to_chat(user, "[src] is empty.") return diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 1206aa48dfc7b2a8959a63515ed88b1b1b99191c..f9c13a5c3321841ec205f0efe2bccc3138e1eb33 100644 GIT binary patch delta 17797 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

0kCXmqt9yN`xnHxYB^ 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 Z{{hKj=(oB-(yjmi002ovPDHLkV1kg`TrU6s delta 16745 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 Date: Fri, 2 Nov 2018 00:46:08 -0700 Subject: [PATCH 06/32] Fixes Phazon movespeed, add radial menus to ctrl Ctrl Clicking on a mech while you're in it will now bring up a radial weapon selection --- code/_onclick/hud/radial.dm | 2 + code/datums/mutable_appearance.dm | 9 ++++- code/game/mecha/mecha.dm | 67 ++++++++++++++++++------------- 3 files changed, 50 insertions(+), 28 deletions(-) diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 284e095333c..cea30327af1 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -18,10 +18,12 @@ GLOBAL_LIST_EMPTY(radial_menus) /obj/screen/radial/slice/MouseEntered(location, control, params) . = ..() icon_state = "radial_slice_focus" + openToolTip(usr, src, params, title = name) /obj/screen/radial/slice/MouseExited(location, control, params) . = ..() icon_state = "radial_slice" + closeToolTip(usr) /obj/screen/radial/slice/Click(location, control, params) if(usr.client == parent.current_user) diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index ea94aa6407b..d8b893caaf9 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -10,4 +10,11 @@ MA.icon = icon MA.icon_state = icon_state MA.layer = layer - return MA \ No newline at end of file + return MA + +/mutable_appearance/clean +/mutable_appearance/clean/New() + . = ..() + alpha = 255 + opacity = 1 + transform = null \ No newline at end of file diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index c3c89231664..297e76cf19f 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -24,7 +24,7 @@ force = 5 armor = list(melee = 20, bullet = 10, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) var/initial_icon = null //Mech type for resetting icon. Only used for reskinning kits (see custom items) - var/can_move = 1 + var/can_move = 0 // time of next allowed movement var/mob/living/carbon/occupant = null var/step_in = 10 //make a step in step_in/10 sec. var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. @@ -96,8 +96,8 @@ hud_possible = list (DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD) -/obj/mecha/New() - ..() +/obj/mecha/Initialize() + . = ..() events = new icon_state += "-open" add_radio() @@ -124,13 +124,6 @@ //////////////////////// ////// Helpers ///////// //////////////////////// - -/obj/mecha/proc/removeVerb(verb_path) - verbs -= verb_path - -/obj/mecha/proc/addVerb(verb_path) - verbs += verb_path - /obj/mecha/proc/add_airtank() internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) return internal_tank @@ -159,7 +152,6 @@ radio.icon_state = icon_state radio.subspace_transmission = 1 - /obj/mecha/examine(mob/user) ..(user) var/integrity = health/initial(health)*100 @@ -179,13 +171,10 @@ for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment) to_chat(user, "[bicon(ME)] [ME]") - - /obj/mecha/hear_talk(mob/M, text) if(M == occupant && radio.broadcasting) radio.talk_into(M, text) - /obj/mecha/proc/click_action(atom/target, mob/user, params) if(!occupant || occupant != user ) return @@ -298,7 +287,7 @@ return domove(direction) /obj/mecha/proc/domove(direction) - if(!can_move) + if(can_move >= world.time) return 0 if(!Process_Spacemove(direction)) return 0 @@ -327,12 +316,9 @@ move_result = mechstep(direction) move_type = MECHAMOVE_STEP - can_move = FALSE - spawn(step_in) - can_move = TRUE - if(move_result && move_type) aftermove(move_type) + can_move = world.time + step_in return TRUE return FALSE @@ -354,7 +340,6 @@ step_energy_drain = initial(step_energy_drain) occupant_message("Leg actuators damage threshold exceded. Disabling overload.") - /obj/mecha/proc/mechturn(direction) dir = direction if(turnsound) @@ -365,15 +350,13 @@ . = step(src, direction) if(!.) if(phasing && get_charge() >= phasing_energy_drain) - if(can_move) - can_move = 0 - . = TRUE + if(can_move < world.time) + . = FALSE // We lie to mech code and say we didn't get to move, because we want to handle power usage + cooldown ourself flick("phazon-phase", src) forceMove(get_step(src, direction)) use_power(phasing_energy_drain) playsound(src, stepsound, 40, 1) - spawn(step_in * 3) - can_move = 1 + can_move = world.time + (step_in * 3) else if(stepsound) playsound(src, stepsound, 40, 1) @@ -382,8 +365,6 @@ if(. && stepsound) playsound(src, stepsound, 40, 1) - - /obj/mecha/Bump(var/atom/obstacle, bump_allowed) if(throwing) //high velocity mechas in your face! var/breakthrough = 0 @@ -1496,3 +1477,35 @@ else if(damtype == TOX) visual_effect_icon = ATTACK_EFFECT_MECHTOXIN ..() + +/obj/mecha/CtrlClick(mob/living/L) + if(occupant != L || !istype(L)) + return ..() + + var/list/choices = list("Cancel / No Change" = mutable_appearance(icon = 'icons/mob/screen_gen.dmi', icon_state = "x")) + var/list/choices_to_refs = list() + + for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment) + if(!MT.selectable || selected == MT) + continue + var/mutable_appearance/clean/MA = new(MT) + choices[MT.name] = MA + choices_to_refs[MT.name] = MT + + var/choice = show_radial_menu(L, src, choices, radius = 48, custom_check = CALLBACK(src, .proc/check_menu, L)) + if(!check_menu(L) || choice == "Cancel / No Change") + return + + var/obj/item/mecha_parts/mecha_equipment/new_sel = LAZYACCESS(choices_to_refs, choice) + if(istype(new_sel)) + selected = new_sel + occupant_message("You switch to [selected].") + visible_message("[src] raises [selected]") + send_byjax(occupant, "exosuit.browser", "eq_list", get_equipment_list()) + +/obj/mecha/proc/check_menu(mob/living/L) + if(L != occupant || !istype(L)) + return FALSE + if(L.incapacitated()) + return FALSE + return TRUE \ No newline at end of file From eea5233d82deed9edd50eb2a3a5ee0cefd5eab1a Mon Sep 17 00:00:00 2001 From: tigercat2000 Date: Fri, 2 Nov 2018 01:07:50 -0700 Subject: [PATCH 07/32] Convert phazon damtype to action button (missed thsi whoopsies) --- code/game/mecha/combat/phazon.dm | 29 +++-------------------------- code/game/mecha/mecha.dm | 4 ---- code/game/mecha/mecha_actions.dm | 26 +++++++++++++++++++++++++- 3 files changed, 28 insertions(+), 31 deletions(-) diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index af48fb1b6dc..d1092212761 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -24,10 +24,12 @@ /obj/mecha/combat/phazon/GrantActions(mob/living/user, human_occupant = 0) ..() phasing_action.Grant(user, src) + switch_damtype_action.Grant(user, src) /obj/mecha/combat/phazon/RemoveActions(mob/living/user, human_occupant = 0) ..() phasing_action.Remove(user) + switch_damtype_action.Remove(user) /obj/mecha/combat/phazon/New() ..() @@ -36,26 +38,6 @@ ME = new /obj/item/mecha_parts/mecha_equipment/gravcatapult ME.attach(src) -/obj/mecha/combat/phazon/verb/switch_damtype() - set category = "Exosuit Interface" - set name = "Reconfigure arm microtool arrays" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - var/new_damtype = alert(occupant, "Arm Tool Selection", null, "Fists", "Torch", "Toxic Injector") - switch(new_damtype) - if("Fists") - damtype = "brute" - occupant_message("Your exosuit's hands form into fists.") - if("Torch") - damtype = "fire" - occupant_message("A torch tip extends from your exosuit's hand, glowing red.") - if("Toxic Injector") - damtype = "tox" - occupant_message("A bone-chillingly thick plasteel needle protracts from the exosuit's palm.") - playsound(src, 'sound/mecha/mechmove01.ogg', 50, 1) - /obj/mecha/combat/phazon/get_commands() var/output = {"

Special
@@ -65,9 +47,4 @@
"} output += ..() - return output - -/obj/mecha/combat/phazon/Topic(href, href_list) - ..() - if(href_list["switch_damtype"]) - switch_damtype() \ No newline at end of file + return output \ No newline at end of file diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 297e76cf19f..2205a9f6a72 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1075,10 +1075,6 @@ /obj/mecha/portableConnectorReturnAir() return internal_tank.return_air() - -///////////////////////// -//////// Verbs //////// -///////////////////////// /obj/mecha/proc/toggle_lights() lights = !lights if(lights) diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm index 2db88a3b57b..db807634102 100644 --- a/code/game/mecha/mecha_actions.dm +++ b/code/game/mecha/mecha_actions.dm @@ -11,7 +11,7 @@ var/datum/action/innate/mecha/mech_smoke/smoke_action = new var/datum/action/innate/mecha/mech_zoom/zoom_action = new var/datum/action/innate/mecha/mech_toggle_phasing/phasing_action = new - // var/datum/action/innate/mecha/mech_switch_damtype/switch_damtype_action = new + var/datum/action/innate/mecha/mech_switch_damtype/switch_damtype_action = new /obj/mecha/proc/GrantActions(mob/living/user, human_occupant = 0) if(human_occupant) @@ -202,4 +202,28 @@ chassis.phasing = !chassis.phasing button_icon_state = "mech_phasing_[chassis.phasing ? "on" : "off"]" chassis.occupant_message("En":"#f00\">Dis"]abled phasing.") + UpdateButtonIcon() + + +/datum/action/innate/mecha/mech_switch_damtype + name = "Reconfigure arm microtool arrays" + button_icon_state = "mech_damtype_brute" + +/datum/action/innate/mecha/mech_switch_damtype/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + var/new_damtype + switch(chassis.damtype) + if("tox") + new_damtype = "brute" + chassis.occupant_message("Your exosuit's hands form into fists.") + if("brute") + new_damtype = "fire" + chassis.occupant_message("A torch tip extends from your exosuit's hand, glowing red.") + if("fire") + new_damtype = "tox" + chassis.occupant_message("A bone-chillingly thick plasteel needle protracts from the exosuit's palm.") + chassis.damtype = new_damtype + button_icon_state = "mech_damtype_[new_damtype]" + playsound(src, 'sound/mecha/mechmove01.ogg', 50, 1) UpdateButtonIcon() \ No newline at end of file From 7428362d2f5ead42a86f3638f6d5e5c1c3d168e8 Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Sat, 3 Nov 2018 20:30:52 +0800 Subject: [PATCH 08/32] Fixes typo --- code/modules/hydroponics/grown/ambrosia.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm index 47b2975ffa8..a2085eafaee 100644 --- a/code/modules/hydroponics/grown/ambrosia.dm +++ b/code/modules/hydroponics/grown/ambrosia.dm @@ -77,7 +77,7 @@ light_range = 3 seed = /obj/item/seeds/ambrosia/gaia wine_power = 0.7 - wine_flavor = "the earthmothert's blessing" + wine_flavor = "the earthmother's blessing" // Ambrosia Cruciatus /obj/item/seeds/ambrosia/cruciatus From c2f92bec5e67250dd55c2ec3cc8f4f4c5e7f2cae Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Sat, 3 Nov 2018 21:39:38 +0800 Subject: [PATCH 09/32] Make fermentation barrel a stack recipe, fixes koibean and soybean being OP --- code/game/objects/items/stacks/sheets/sheet_types.dm | 3 ++- code/modules/hydroponics/grown/beans.dm | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 376acfe20ac..3ab43d0793a 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -174,7 +174,8 @@ var/global/list/datum/stack_recipe/wood_recipes = list( new /datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), new /datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50), new /datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10), - new /datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15) + new /datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15), + new /datum/stack_recipe("fermenting barrel", /obj/structure/fermenting_barrel, 30, time = 50) ) /obj/item/stack/sheet/wood diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm index fa73e7cd45f..3649e84b869 100644 --- a/code/modules/hydroponics/grown/beans.dm +++ b/code/modules/hydroponics/grown/beans.dm @@ -25,7 +25,7 @@ icon_state = "soybeans" filling_color = "#F0E68C" bitesize_mod = 2 - wine_power = 20 + wine_power = 0.2 // Koibean /obj/item/seeds/soya/koi @@ -47,4 +47,4 @@ icon_state = "koibeans" filling_color = "#F0E68C" bitesize_mod = 2 - wine_power = 40 \ No newline at end of file + wine_power = 0.4 \ No newline at end of file From da469031c97ab3ede825faa0ab56ef3cd40c4ed5 Mon Sep 17 00:00:00 2001 From: Citinited Date: Sun, 4 Nov 2018 18:19:51 +0000 Subject: [PATCH 10/32] Conveyors switch between speedy and normal process now --- code/modules/recycling/conveyor2.dm | 32 ++++++++++++++++++----------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 4bbc25a8037..82c638fd43b 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -1,6 +1,7 @@ #define DIRECTION_FORWARDS 1 #define DIRECTION_OFF 0 #define DIRECTION_REVERSED -1 +#define IS_OPERATING (can_conveyor_run() && operating) GLOBAL_LIST_INIT(conveyor_belts, list()) //Saves us having to look through the entire machines list for our things GLOBAL_LIST_INIT(conveyor_switches, list()) @@ -22,7 +23,6 @@ GLOBAL_LIST_INIT(conveyor_switches, list()) var/operable = TRUE // Can this belt actually go? var/list/affecting // the list of all items that will be moved this ptick var/reversed = FALSE // set to TRUE to have the conveyor belt be reversed - speed_process = TRUE //gotta go fast var/id //ID of the connected lever // create a conveyor @@ -84,7 +84,7 @@ GLOBAL_LIST_INIT(conveyor_switches, list()) /obj/machinery/conveyor/update_icon() ..() - if(operating && can_conveyor_run()) + if(IS_OPERATING) icon_state = "conveyor_started_[clockwise ? "cw" : "ccw"]" if(reversed) icon_state += "_r" @@ -161,20 +161,27 @@ GLOBAL_LIST_INIT(conveyor_switches, list()) update_icon() /obj/machinery/conveyor/process() - if(!operating) - return - if(!can_conveyor_run()) + if(!IS_OPERATING) return use_power(100) affecting = loc.contents - src // moved items will be all in loc - if(!affecting) - return - sleep(1) - for(var/atom/movable/A in affecting) - if(!A.anchored) - if(A.loc == loc) // prevents the object from being affected if it's not currently here. - step(A,forwards) + var/still_stuff_to_move = FALSE + for(var/atom/movable/AM in affecting) + if(AM.anchored) + continue + still_stuff_to_move = TRUE + sleep(1) + if(AM.loc == loc) // prevents the object from being affected if it's not currently here. + step(A,forwards) CHECK_TICK + if(!still_stuff_to_move) + makeNormalProcess() + else + makeSpeedProcess() + +/obj/machinery/conveyor/Crossed(atom/movable/AM) + makeSpeedProcess() + ..() /obj/machinery/conveyor/proc/can_conveyor_run() if(stat & BROKEN) @@ -475,3 +482,4 @@ GLOBAL_LIST_INIT(conveyor_switches, list()) #undef DIRECTION_FORWARDS #undef DIRECTION_OFF #undef DIRECTION_REVERSED +#undef IS_OPERATING From 5fb3fb71a19457aed912fb7ebcdf125c11c30375 Mon Sep 17 00:00:00 2001 From: Citinited Date: Sun, 4 Nov 2018 18:31:48 +0000 Subject: [PATCH 11/32] oops --- code/modules/recycling/conveyor2.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 82c638fd43b..95234c850d5 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -172,7 +172,7 @@ GLOBAL_LIST_INIT(conveyor_switches, list()) still_stuff_to_move = TRUE sleep(1) if(AM.loc == loc) // prevents the object from being affected if it's not currently here. - step(A,forwards) + step(AM,forwards) CHECK_TICK if(!still_stuff_to_move) makeNormalProcess() From 383a331f4634b0963720129176854b0c21814a75 Mon Sep 17 00:00:00 2001 From: datlo Date: Tue, 6 Nov 2018 20:01:19 +0000 Subject: [PATCH 12/32] Adds the toxins payload casing to crafting Adds a new type of bomb payload : The toxins payload. Crafted with a matter bin, metal, and a remote signaller, it must be loaded with a tank transfer valve and put into a plasteel bomb casing in order to do anything. Once the bomb detonates, the toxins payload will open the TTV (causing an explosion if the mix is correct). As with syndicate bombs, a bomb with a toxin payload has a minimum 90 second timer, and will beep loudly to warn nearby crew to evacuate the area. It can be defused (or accidentally detonated early) in the same way a syndicate bomb can. This allows scientists a secure way to test their bombs (less chances of accidental detonations with this method, although it adds extra steps), and antagonists a way to craft their own syndicate bomb, which is better than a simple tank transfer valve if your objective is not killing crew but making sure a specific area is wiped off the station map with little to no casualties. --- code/game/machinery/syndicatebomb.dm | 36 ++++++++++++++++++++++++++++ code/modules/crafting/recipes.dm | 10 ++++++++ 2 files changed, 46 insertions(+) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index fda550217ad..26181fcd801 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -530,6 +530,42 @@ qdel(G) +/obj/item/bombcore/toxins + name = "toxins payload" + desc = "A payload casing designed to secure a gas based bomb. Must be loaded with a tank transfer valve and installed into a plasteel bomb frame in order to be detonated." + origin_tech = "materials=1;engineering=1" + icon_state = "chemcore" + var/obj/item/transfer_valve/ttv = null + +/obj/item/bombcore/toxins/attackby(obj/item/I, mob/user, params) + if(iscrowbar(I) && ttv != null) + playsound(loc, I.usesound, 50, 1) + ttv.loc = get_turf(src) + ttv = null + return + else if(istype(I, /obj/item/transfer_valve)) + if(!ttv) + if(!user.drop_item()) + return + to_chat(user, "You load [src] with [I].") + ttv = I + I.loc = src + else + to_chat(user, "Another tank transfer valve is already loaded.") + return + else + return ..() + +/obj/item/bombcore/toxins/ex_act(severity) //No chain reactions, the explosion only occurs when gas mixes + return + +/obj/item/bombcore/toxins/burn() + return + +/obj/item/bombcore/toxins/detonate() + if(ttv != null) + ttv.toggle_valve() + ///Syndicate Detonator (aka the big red button)/// /obj/item/syndicatedetonator diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 012c79bab06..47966bb5278 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -339,6 +339,16 @@ time = 50 category = CAT_WEAPON +/datum/crafting_recipe/toxins_payload + name = "Toxins Payload Casing" + result = /obj/item/bombcore/toxins + reqs = list( + /obj/item/stock_parts/matter_bin = 1, + /obj/item/assembly/signaler = 1, + /obj/item/stack/sheet/metal = 2 + ) + category = CAT_WEAPON + /datum/crafting_recipe/bonfire name = "Bonfire" time = 60 From 0a18490e16a623ba017a1bc5eec87cd079714950 Mon Sep 17 00:00:00 2001 From: datlo Date: Tue, 6 Nov 2018 20:12:33 +0000 Subject: [PATCH 13/32] removed useless nulls --- code/game/machinery/syndicatebomb.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 26181fcd801..35c5c1b6707 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -538,7 +538,7 @@ var/obj/item/transfer_valve/ttv = null /obj/item/bombcore/toxins/attackby(obj/item/I, mob/user, params) - if(iscrowbar(I) && ttv != null) + if(iscrowbar(I) && ttv) playsound(loc, I.usesound, 50, 1) ttv.loc = get_turf(src) ttv = null @@ -563,7 +563,7 @@ return /obj/item/bombcore/toxins/detonate() - if(ttv != null) + if(ttv) ttv.toggle_valve() ///Syndicate Detonator (aka the big red button)/// From 93c336d4318c12459451ea75d3e54a8e40ae6c26 Mon Sep 17 00:00:00 2001 From: datlo Date: Tue, 6 Nov 2018 20:26:33 +0000 Subject: [PATCH 14/32] thanks for reviewing my shit code fam --- code/game/machinery/syndicatebomb.dm | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 35c5c1b6707..15d232845fa 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -537,22 +537,20 @@ icon_state = "chemcore" var/obj/item/transfer_valve/ttv = null -/obj/item/bombcore/toxins/attackby(obj/item/I, mob/user, params) +/obj/item/bombcore/toxins/attackby(obj/item/I, mob/user) if(iscrowbar(I) && ttv) playsound(loc, I.usesound, 50, 1) - ttv.loc = get_turf(src) + ttv.forceMove(get_turf(src)) ttv = null - return else if(istype(I, /obj/item/transfer_valve)) if(!ttv) if(!user.drop_item()) return to_chat(user, "You load [src] with [I].") ttv = I - I.loc = src + I.forceMove(src) else to_chat(user, "Another tank transfer valve is already loaded.") - return else return ..() From 8404fc1d5a32a713e23505fa95f67f7dd1fb0861 Mon Sep 17 00:00:00 2001 From: datlo Date: Tue, 6 Nov 2018 22:42:03 +0000 Subject: [PATCH 15/32] Add check for attached component --- code/game/machinery/syndicatebomb.dm | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 15d232845fa..d70508e620b 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -543,17 +543,25 @@ ttv.forceMove(get_turf(src)) ttv = null else if(istype(I, /obj/item/transfer_valve)) - if(!ttv) + if(!ttv && !check_attached(I)) if(!user.drop_item()) return to_chat(user, "You load [src] with [I].") ttv = I I.forceMove(src) - else + else if (ttv) to_chat(user, "Another tank transfer valve is already loaded.") + else + to_chat(user, "Remove the attached assembly component first.") else return ..() +/obj/item/bombcore/toxins/proc/check_attached(obj/item/transfer_valve/ttv) + if (ttv.attached_device) + return TRUE + else + return FALSE + /obj/item/bombcore/toxins/ex_act(severity) //No chain reactions, the explosion only occurs when gas mixes return From 80e8b4ff19166c2ed3eb842e01c3d22b57518cc7 Mon Sep 17 00:00:00 2001 From: Spartan6 Date: Wed, 7 Nov 2018 00:52:36 +0000 Subject: [PATCH 16/32] Adds plastic bags and wet floor signs to loot maint --- code/game/objects/effects/spawners/lootdrop.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index b3e35ecfcaa..4d901261bbd 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -127,6 +127,8 @@ /obj/item/seeds/ambrosia = 20, /obj/item/clothing/under/color/black = 30, /obj/item/stack/tape_roll = 10, + /obj/item/storage/bag/plasticbag = 20, + /obj/item/caution = 10, ////////////////CONTRABAND STUFF////////////////// /obj/item/grenade/clown_grenade = 3, /obj/item/seeds/ambrosia/cruciatus = 3, From e6fcd8ce21c440b22da6d3eded7fa03312b94541 Mon Sep 17 00:00:00 2001 From: Spartan6 Date: Wed, 7 Nov 2018 01:10:48 +0000 Subject: [PATCH 17/32] Adds plastic bag to badass uplink --- code/datums/uplink_item.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 728ff93e281..fb22f8cfa25 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1401,6 +1401,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/storage/secure/briefcase/syndie cost = 1 +/datum/uplink_item/badass/plasticbag + name = "Plastic Bag" + desc = "A simple, plastic bag. Keep out of reach of small children, do not apply to head." + reference = "PBAG" + item = /obj/item/storage/bag/plasticbag + cost = 1 + excludefrom = list(/datum/game_mode/nuclear) + /datum/uplink_item/badass/balloon name = "For showing that you are The Boss" desc = "A useless red balloon with the syndicate logo on it, which can blow the deepest of covers." From 13b776b51cf561827cc9f535523225b3f7a50bd0 Mon Sep 17 00:00:00 2001 From: Citinited Date: Wed, 7 Nov 2018 18:20:05 +0000 Subject: [PATCH 18/32] Adds timer to conveyors; checks speed_process before trying to change to / from speed process --- code/modules/recycling/conveyor2.dm | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 95234c850d5..e5ca5fb0d28 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -170,19 +170,22 @@ GLOBAL_LIST_INIT(conveyor_switches, list()) if(AM.anchored) continue still_stuff_to_move = TRUE - sleep(1) - if(AM.loc == loc) // prevents the object from being affected if it's not currently here. - step(AM,forwards) + addtimer(CALLBACK(src, .proc/move_thing, AM), 1) CHECK_TICK - if(!still_stuff_to_move) + if(!still_stuff_to_move && speed_process) makeNormalProcess() - else + else if(still_stuff_to_move && !speed_process) makeSpeedProcess() /obj/machinery/conveyor/Crossed(atom/movable/AM) - makeSpeedProcess() + if(!speed_process) + makeSpeedProcess() ..() +/obj/machinery/conveyor/proc/move_thing(atom/movable/AM) + if(!AM.anchored && AM.loc == loc) + step(AM, forwards) + /obj/machinery/conveyor/proc/can_conveyor_run() if(stat & BROKEN) return FALSE From b03141861f1edd089db8ed074726edcfcae056e0 Mon Sep 17 00:00:00 2001 From: Eschess Date: Wed, 7 Nov 2018 19:24:28 +0100 Subject: [PATCH 19/32] Update code/modules/logic/dual_input.dm this should fix the broken logic gates --- code/modules/logic/dual_input.dm | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/code/modules/logic/dual_input.dm b/code/modules/logic/dual_input.dm index 03bfa4f1688..b8f915ff46d 100644 --- a/code/modules/logic/dual_input.dm +++ b/code/modules/logic/dual_input.dm @@ -45,9 +45,9 @@ /obj/machinery/logic_gate/nand/handle_logic() if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) && (input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER)) - output_state = LOGIC_OFF //This can only output continuous signals - else //At least one input was ON/FLICKER, so output is off - output_state = LOGIC_OFF + output_state = LOGIC_OFF //Both inputs are ON/FLICKER, so output is off + else + output_state = LOGIC_ON //This can only output continuous signals return // NOR Gate @@ -58,9 +58,9 @@ output_state = LOGIC_ON /obj/machinery/logic_gate/nor/handle_logic() - if(input1_state == LOGIC_OFF ||input2_state == LOGIC_OFF) + if(input1_state == LOGIC_OFF && input2_state == LOGIC_OFF) //Both inputs are OFF, so output is ON output_state = LOGIC_ON //This can only output continuous signals - else //Both inputs are ON, so output is OFF + else output_state = LOGIC_OFF return @@ -71,14 +71,15 @@ icon_state = "logic_xor" /obj/machinery/logic_gate/xor/handle_logic() - if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) || input2_state == LOGIC_OFF) //Only input1 is ON/FLICKER, so output matches input1 + if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) && (input2_state == LOGIC_OFF)) //Only input1 is ON/FLICKER, so output matches input1 output_state = input1_state - else if((input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER) || input1_state == LOGIC_OFF) //Only input2 is ON/FLICKER, so output matches input2 + else if((input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER) && (input1_state == LOGIC_OFF)) //Only input2 is ON/FLICKER, so output matches input2 output_state = input2_state else //Both inputs are ON or OFF, so output is OFF output_state = LOGIC_OFF return + // XNOR Gate /obj/machinery/logic_gate/xnor name = "XNOR Gate" From 469832b0d21849daf0579d4dbb8e6e8ce50ee73e Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Wed, 7 Nov 2018 20:23:46 +0100 Subject: [PATCH 20/32] Mining bots now work upon being health upgraded --- code/modules/mining/minebot.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 30e093633f5..7609131a36b 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -274,7 +274,9 @@ if(M.maxHealth != initial(M.maxHealth)) to_chat(user, "[M] already has a reinforced chassis!") return + var/previous = M.maxHealth M.maxHealth = 170 + M.health += M.maxHealth - previous to_chat(user, "You reinforce [M]'s chassis.") qdel(src) From bd6b06058fa81ac8cff898473e368a9cee11b579 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 7 Nov 2018 23:59:20 -0500 Subject: [PATCH 21/32] Automatic changelog generation for PR #10154 [ci skip] --- html/changelogs/AutoChangeLog-pr-10154.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10154.yml diff --git a/html/changelogs/AutoChangeLog-pr-10154.yml b/html/changelogs/AutoChangeLog-pr-10154.yml new file mode 100644 index 00000000000..63f637bb2e6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10154.yml @@ -0,0 +1,4 @@ +author: "Farie82" +delete-after: True +changes: + - bugfix: "Mining bots now function as expected when giving them a health upgrade. No more repairing without healing" From 878b5e7a890b8c6525aeb43ab140f7820dbf844d Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 8 Nov 2018 00:02:39 -0500 Subject: [PATCH 22/32] Automatic changelog generation for PR #10153 [ci skip] --- html/changelogs/AutoChangeLog-pr-10153.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10153.yml diff --git a/html/changelogs/AutoChangeLog-pr-10153.yml b/html/changelogs/AutoChangeLog-pr-10153.yml new file mode 100644 index 00000000000..e178d640a75 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10153.yml @@ -0,0 +1,4 @@ +author: "Eschess" +delete-after: True +changes: + - bugfix: "fixes the NOR, NAND and XOR logical gates" From 0ea2251cb710671ca9d32653fed14bd92dfec62d Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 8 Nov 2018 00:12:42 -0500 Subject: [PATCH 23/32] Automatic changelog generation for PR #10074 [ci skip] --- html/changelogs/AutoChangeLog-pr-10074.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10074.yml diff --git a/html/changelogs/AutoChangeLog-pr-10074.yml b/html/changelogs/AutoChangeLog-pr-10074.yml new file mode 100644 index 00000000000..bb7f9097531 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10074.yml @@ -0,0 +1,7 @@ +author: "tigercat2000" +delete-after: True +changes: + - rscadd: "Mecha now use action buttons instead of ugly verbs." + - rscadd: "Mecha weapons can now be selected through a radial menu brought up by Ctrl Clicking on the Mecha while you are piloting it." + - rscadd: "Tooltips now appear on radial menu buttons when you hover over them. Seriously, why wasn't this a thing in the first place?" + - tweak: "Action button icons are now located in their own file." From f9edd3e3359d6b5eeb820872c887e69a81ff67a4 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 8 Nov 2018 01:12:16 -0500 Subject: [PATCH 24/32] Automatic changelog generation for PR #10115 [ci skip] --- html/changelogs/AutoChangeLog-pr-10115.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10115.yml diff --git a/html/changelogs/AutoChangeLog-pr-10115.yml b/html/changelogs/AutoChangeLog-pr-10115.yml new file mode 100644 index 00000000000..bb0ed71b520 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10115.yml @@ -0,0 +1,4 @@ +author: "Citinited" +delete-after: True +changes: + - tweak: "Conveyors use less power now" From 2446e69459e5b3eaf579e3fdb9dbe5cfaa0e92c0 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 8 Nov 2018 01:14:54 -0500 Subject: [PATCH 25/32] Automatic changelog generation for PR #10147 [ci skip] --- html/changelogs/AutoChangeLog-pr-10147.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10147.yml diff --git a/html/changelogs/AutoChangeLog-pr-10147.yml b/html/changelogs/AutoChangeLog-pr-10147.yml new file mode 100644 index 00000000000..f2816c4343d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10147.yml @@ -0,0 +1,5 @@ +author: "Spartan" +delete-after: True +changes: + - tweak: "Plastic bags and wet floor signs can now spawn in maint." + - rscadd: "Plastic bags are now supplied to your syndicate uplink. Apply directly to head." From 90c06fc6ad85dfe9ca2309f4f5518716399109d4 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 8 Nov 2018 01:18:20 -0500 Subject: [PATCH 26/32] Automatic changelog generation for PR #10142 [ci skip] --- html/changelogs/AutoChangeLog-pr-10142.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10142.yml diff --git a/html/changelogs/AutoChangeLog-pr-10142.yml b/html/changelogs/AutoChangeLog-pr-10142.yml new file mode 100644 index 00000000000..281064d0527 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10142.yml @@ -0,0 +1,4 @@ +author: "datlo" +delete-after: True +changes: + - bugfix: "Added the Toxins Payload Casing to crafting recipes, a new method of activating tank transfer valve bombs." From 9a92836a27464aeeb2325c067aa888e81e6d9412 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 8 Nov 2018 01:45:19 -0500 Subject: [PATCH 27/32] Automatic changelog generation for PR #10073 [ci skip] --- html/changelogs/AutoChangeLog-pr-10073.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10073.yml diff --git a/html/changelogs/AutoChangeLog-pr-10073.yml b/html/changelogs/AutoChangeLog-pr-10073.yml new file mode 100644 index 00000000000..aeaaada3621 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10073.yml @@ -0,0 +1,4 @@ +author: "Wario4356" +delete-after: True +changes: + - bugfix: "Mecha can now drill other mecha" From 27df1b0ba4b1aba8e34ac9f57bd0e39193aed84a Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 8 Nov 2018 01:53:30 -0500 Subject: [PATCH 28/32] Automatic changelog generation for PR #10076 [ci skip] --- html/changelogs/AutoChangeLog-pr-10076.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10076.yml diff --git a/html/changelogs/AutoChangeLog-pr-10076.yml b/html/changelogs/AutoChangeLog-pr-10076.yml new file mode 100644 index 00000000000..e1c8de1ca31 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10076.yml @@ -0,0 +1,6 @@ +author: "variableundefined" +delete-after: True +changes: + - rscadd: "Baycard, including tarot cards to loadout" + - rscadd: "Baycard to prize machine" + - tweak: "All non-syndicate card deck on map has been replaced with bay card." From a4812dd4e79a1adec964f07788722b7f005ac2cf Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Thu, 8 Nov 2018 14:57:56 +0800 Subject: [PATCH 29/32] Update fermenting_barrel.dm --- code/modules/hydroponics/fermenting_barrel.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index ab9f9f82d3e..9f4dbb7315d 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -47,7 +47,7 @@ else if(!user.drop_item()) to_chat(user, "[G] is stuck to your hand!") return FALSE - G.loc = src + G.forceMove(src) to_chat(user, "You place [G] into [src] to start the fermentation process.") addtimer(CALLBACK(src, .proc/makeWine, G), rand(80, 120) * speed_multiplier) else if(I.is_refillable()) From 69d5a6ba755e517939487c64dba4634c0f7ea693 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 8 Nov 2018 02:09:10 -0500 Subject: [PATCH 30/32] Automatic changelog generation for PR #10078 [ci skip] --- html/changelogs/AutoChangeLog-pr-10078.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10078.yml diff --git a/html/changelogs/AutoChangeLog-pr-10078.yml b/html/changelogs/AutoChangeLog-pr-10078.yml new file mode 100644 index 00000000000..5588f25e7c4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10078.yml @@ -0,0 +1,6 @@ +author: "Fel" +delete-after: True +changes: + - rscadd: "You can now craft wooden barrels with 30 pieces of wood! They can hold up to 300u of reagents." + - rscadd: "Putting hydroponics-grown plants into the barrel lets you ferment them for alcohol! Some give bar drinks, while others simply give plain fruit wine." + - tweak: "Reagent containers like bottle & glass should be more consistent now." From 527b6b1a7f7a00ed6773ec2483b4b48e5ae6a84a Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 8 Nov 2018 04:41:05 -0500 Subject: [PATCH 31/32] Automatic changelog generation for PR #10072 [ci skip] --- html/changelogs/AutoChangeLog-pr-10072.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10072.yml diff --git a/html/changelogs/AutoChangeLog-pr-10072.yml b/html/changelogs/AutoChangeLog-pr-10072.yml new file mode 100644 index 00000000000..f1aab63060d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10072.yml @@ -0,0 +1,4 @@ +author: "Warior4356" +delete-after: True +changes: + - bugfix: "Mecha drills now tell you when they can't drill" From 7877af327c66f80f3a34f46f1ff5a4683b3f5041 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 8 Nov 2018 13:55:52 +0000 Subject: [PATCH 32/32] Automatic changelog compile, [ci skip] --- html/changelog.html | 50 ++++++++++++++++++++++ html/changelogs/.all_changelog.yml | 36 ++++++++++++++++ html/changelogs/AutoChangeLog-pr-10072.yml | 4 -- html/changelogs/AutoChangeLog-pr-10073.yml | 4 -- html/changelogs/AutoChangeLog-pr-10074.yml | 7 --- html/changelogs/AutoChangeLog-pr-10076.yml | 6 --- html/changelogs/AutoChangeLog-pr-10078.yml | 6 --- html/changelogs/AutoChangeLog-pr-10115.yml | 4 -- html/changelogs/AutoChangeLog-pr-10142.yml | 4 -- html/changelogs/AutoChangeLog-pr-10147.yml | 5 --- html/changelogs/AutoChangeLog-pr-10153.yml | 4 -- html/changelogs/AutoChangeLog-pr-10154.yml | 4 -- 12 files changed, 86 insertions(+), 48 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-10072.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-10073.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-10074.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-10076.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-10078.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-10115.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-10142.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-10147.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-10153.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-10154.yml diff --git a/html/changelog.html b/html/changelog.html index d6b2805b8c9..ea7c6c1725e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,56 @@ -->
+

08 November 2018

+

Citinited updated:

+
    +
  • Conveyors use less power now
  • +
+

Eschess updated:

+
    +
  • fixes the NOR, NAND and XOR logical gates
  • +
+

Farie82 updated:

+
    +
  • Mining bots now function as expected when giving them a health upgrade. No more repairing without healing
  • +
+

Fel updated:

+
    +
  • You can now craft wooden barrels with 30 pieces of wood! They can hold up to 300u of reagents.
  • +
  • Putting hydroponics-grown plants into the barrel lets you ferment them for alcohol! Some give bar drinks, while others simply give plain fruit wine.
  • +
  • Reagent containers like bottle & glass should be more consistent now.
  • +
+

Spartan updated:

+
    +
  • Plastic bags and wet floor signs can now spawn in maint.
  • +
  • Plastic bags are now supplied to your syndicate uplink. Apply directly to head.
  • +
+

Wario4356 updated:

+
    +
  • Mecha can now drill other mecha
  • +
+

Warior4356 updated:

+
    +
  • Mecha drills now tell you when they can't drill
  • +
+

datlo updated:

+
    +
  • Added the Toxins Payload Casing to crafting recipes, a new method of activating tank transfer valve bombs.
  • +
+

tigercat2000 updated:

+
    +
  • Mecha now use action buttons instead of ugly verbs.
  • +
  • Mecha weapons can now be selected through a radial menu brought up by Ctrl Clicking on the Mecha while you are piloting it.
  • +
  • Tooltips now appear on radial menu buttons when you hover over them. Seriously, why wasn't this a thing in the first place?
  • +
  • Action button icons are now located in their own file.
  • +
+

variableundefined updated:

+
    +
  • Baycard, including tarot cards to loadout
  • +
  • Baycard to prize machine
  • +
  • All non-syndicate card deck on map has been replaced with bay card.
  • +
+

07 November 2018

Spartan updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index b656e8bc899..fdb39fc9235 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -7905,3 +7905,39 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: objective lists are now sorted for admins. uc_guy: - bugfix: IPCs and slimes now have an effect on the floor when bleeding. +2018-11-08: + Citinited: + - tweak: Conveyors use less power now + Eschess: + - bugfix: fixes the NOR, NAND and XOR logical gates + Farie82: + - bugfix: Mining bots now function as expected when giving them a health upgrade. + No more repairing without healing + Fel: + - rscadd: You can now craft wooden barrels with 30 pieces of wood! They can hold + up to 300u of reagents. + - rscadd: Putting hydroponics-grown plants into the barrel lets you ferment them + for alcohol! Some give bar drinks, while others simply give plain fruit wine. + - tweak: Reagent containers like bottle & glass should be more consistent now. + Spartan: + - tweak: Plastic bags and wet floor signs can now spawn in maint. + - rscadd: Plastic bags are now supplied to your syndicate uplink. Apply directly + to head. + Wario4356: + - bugfix: Mecha can now drill other mecha + Warior4356: + - bugfix: Mecha drills now tell you when they can't drill + datlo: + - bugfix: Added the Toxins Payload Casing to crafting recipes, a new method of activating + tank transfer valve bombs. + tigercat2000: + - rscadd: Mecha now use action buttons instead of ugly verbs. + - rscadd: Mecha weapons can now be selected through a radial menu brought up by + Ctrl Clicking on the Mecha while you are piloting it. + - rscadd: Tooltips now appear on radial menu buttons when you hover over them. Seriously, + why wasn't this a thing in the first place? + - tweak: Action button icons are now located in their own file. + variableundefined: + - rscadd: Baycard, including tarot cards to loadout + - rscadd: Baycard to prize machine + - tweak: All non-syndicate card deck on map has been replaced with bay card. diff --git a/html/changelogs/AutoChangeLog-pr-10072.yml b/html/changelogs/AutoChangeLog-pr-10072.yml deleted file mode 100644 index f1aab63060d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10072.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Warior4356" -delete-after: True -changes: - - bugfix: "Mecha drills now tell you when they can't drill" diff --git a/html/changelogs/AutoChangeLog-pr-10073.yml b/html/changelogs/AutoChangeLog-pr-10073.yml deleted file mode 100644 index aeaaada3621..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10073.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Wario4356" -delete-after: True -changes: - - bugfix: "Mecha can now drill other mecha" diff --git a/html/changelogs/AutoChangeLog-pr-10074.yml b/html/changelogs/AutoChangeLog-pr-10074.yml deleted file mode 100644 index bb7f9097531..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10074.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "tigercat2000" -delete-after: True -changes: - - rscadd: "Mecha now use action buttons instead of ugly verbs." - - rscadd: "Mecha weapons can now be selected through a radial menu brought up by Ctrl Clicking on the Mecha while you are piloting it." - - rscadd: "Tooltips now appear on radial menu buttons when you hover over them. Seriously, why wasn't this a thing in the first place?" - - tweak: "Action button icons are now located in their own file." diff --git a/html/changelogs/AutoChangeLog-pr-10076.yml b/html/changelogs/AutoChangeLog-pr-10076.yml deleted file mode 100644 index e1c8de1ca31..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10076.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "variableundefined" -delete-after: True -changes: - - rscadd: "Baycard, including tarot cards to loadout" - - rscadd: "Baycard to prize machine" - - tweak: "All non-syndicate card deck on map has been replaced with bay card." diff --git a/html/changelogs/AutoChangeLog-pr-10078.yml b/html/changelogs/AutoChangeLog-pr-10078.yml deleted file mode 100644 index 5588f25e7c4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10078.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Fel" -delete-after: True -changes: - - rscadd: "You can now craft wooden barrels with 30 pieces of wood! They can hold up to 300u of reagents." - - rscadd: "Putting hydroponics-grown plants into the barrel lets you ferment them for alcohol! Some give bar drinks, while others simply give plain fruit wine." - - tweak: "Reagent containers like bottle & glass should be more consistent now." diff --git a/html/changelogs/AutoChangeLog-pr-10115.yml b/html/changelogs/AutoChangeLog-pr-10115.yml deleted file mode 100644 index bb0ed71b520..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10115.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Citinited" -delete-after: True -changes: - - tweak: "Conveyors use less power now" diff --git a/html/changelogs/AutoChangeLog-pr-10142.yml b/html/changelogs/AutoChangeLog-pr-10142.yml deleted file mode 100644 index 281064d0527..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10142.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "datlo" -delete-after: True -changes: - - bugfix: "Added the Toxins Payload Casing to crafting recipes, a new method of activating tank transfer valve bombs." diff --git a/html/changelogs/AutoChangeLog-pr-10147.yml b/html/changelogs/AutoChangeLog-pr-10147.yml deleted file mode 100644 index f2816c4343d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10147.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Spartan" -delete-after: True -changes: - - tweak: "Plastic bags and wet floor signs can now spawn in maint." - - rscadd: "Plastic bags are now supplied to your syndicate uplink. Apply directly to head." diff --git a/html/changelogs/AutoChangeLog-pr-10153.yml b/html/changelogs/AutoChangeLog-pr-10153.yml deleted file mode 100644 index e178d640a75..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10153.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Eschess" -delete-after: True -changes: - - bugfix: "fixes the NOR, NAND and XOR logical gates" diff --git a/html/changelogs/AutoChangeLog-pr-10154.yml b/html/changelogs/AutoChangeLog-pr-10154.yml deleted file mode 100644 index 63f637bb2e6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10154.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Farie82" -delete-after: True -changes: - - bugfix: "Mining bots now function as expected when giving them a health upgrade. No more repairing without healing"