From bf5200daf87955af312b6781908ccb8f918c7678 Mon Sep 17 00:00:00 2001 From: ikarrus Date: Sun, 15 Jun 2014 21:24:07 -0600 Subject: [PATCH 01/41] [Config] Security Officer Scaling Intended for high-population servers Open security officer positions scale with population, between 5 slots at ~40 players to 12 slots at ~96 players Default coefficient is 8, but may be modified (or disabled) in the config. Extra lockers will spawn if there aren't enough lockers. --- _maps/map_files/tgstation.2.1.3.dmm | 57 +++++++++++++------------- code/_globalvars/lists/mapping.dm | 1 + code/controllers/configuration.dm | 3 ++ code/game/jobs/job/security.dm | 4 +- code/game/jobs/job_controller.dm | 21 ++++++++++ code/game/objects/effects/landmarks.dm | 5 ++- config/game_options.txt | 5 +++ 7 files changed, 65 insertions(+), 31 deletions(-) diff --git a/_maps/map_files/tgstation.2.1.3.dmm b/_maps/map_files/tgstation.2.1.3.dmm index 2cd7fe99609..588f6c4f6a3 100644 --- a/_maps/map_files/tgstation.2.1.3.dmm +++ b/_maps/map_files/tgstation.2.1.3.dmm @@ -65,7 +65,7 @@ "abm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig) "abn" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) "abo" = (/turf/simulated/floor/carpet,/area/security/hos) -"abp" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor{icon_state = "red"},/area/security/main) +"abp" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor{icon_state = "red"},/area/security/main) "abq" = (/obj/structure/sign/securearea{pixel_y = -32},/turf/space,/area/space) "abr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) "abs" = (/obj/structure/stool/bed,/obj/machinery/camera{c_tag = "Prison Cell 3"; network = list("SS13","Prison")},/obj/item/device/radio/intercom{desc = "Talk through this. It looks like it has been modified to not broadcast."; dir = 2; name = "Prison Intercom (General)"; pixel_x = 0; pixel_y = 24; prison_radio = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) @@ -103,11 +103,11 @@ "abY" = (/obj/structure/rack,/obj/item/weapon/shield/riot{pixel_x = -3; pixel_y = 3},/obj/item/weapon/shield/riot,/obj/item/weapon/shield/riot{pixel_x = 3; pixel_y = -3},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/security/armory) "abZ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig) "aca" = (/obj/structure/closet/l3closet/security,/obj/machinery/camera{c_tag = "Brig Equipment Room"; dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/main) -"acb" = (/obj/structure/table,/obj/item/weapon/packageWrap,/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "red"},/area/security/main) -"acc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 7},/turf/simulated/floor,/area/security/main) +"acb" = (/obj/effect/landmark{name = "secequipment"},/turf/simulated/floor{icon_state = "red"},/area/security/main) +"acc" = (/obj/machinery/light,/obj/effect/landmark{name = "secequipment"},/turf/simulated/floor{icon_state = "red"},/area/security/main) "acd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/security/hos) "ace" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/carpet,/area/security/hos) -"acf" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "red"},/area/security/main) +"acf" = (/obj/machinery/light_switch{pixel_y = -23},/obj/effect/landmark{name = "secequipment"},/turf/simulated/floor{icon_state = "red"},/area/security/main) "acg" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/computer/security,/turf/simulated/floor{icon_state = "red"},/area/security/main) "ach" = (/obj/machinery/camera{c_tag = "Security Office"; dir = 1; network = list("SS13")},/obj/machinery/computer/secure_data,/turf/simulated/floor{icon_state = "red"},/area/security/main) "aci" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint) @@ -122,7 +122,7 @@ "acr" = (/obj/machinery/power/apc{dir = 1; name = "Labor Shuttle Dock APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig) "acs" = (/obj/machinery/vending/security,/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/main) "act" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-y"; dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/stool/bed/chair,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/security/main) -"acu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/main) +"acu" = (/obj/structure/noticeboard{dir = 1; pixel_y = -27},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/landmark{name = "secequipment"},/turf/simulated/floor{icon_state = "red"},/area/security/main) "acv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/security/hos) "acw" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/carpet,/area/security/hos) "acx" = (/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor/carpet,/area/security/hos) @@ -164,9 +164,9 @@ "adh" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/security/hos) "adi" = (/obj/machinery/door/airlock/glass_command{name = "Head of Security"; req_access_txt = "58"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/carpet,/area/security/hos) "adj" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/security/hos) -"adk" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/main) +"adk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/main) "adl" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/main) -"adm" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/security/main) +"adm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j2s"; sortType = 7},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/main) "adn" = (/obj/machinery/camera{c_tag = "Security Escape Pod"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "ado" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/escape_pod3/station) "adp" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape_pod3/station) @@ -198,11 +198,11 @@ "adP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 9},/area/security/brig) "adQ" = (/turf/simulated/floor,/area/security/main) "adR" = (/obj/effect/landmark/start{name = "Head of Security"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/main) -"adS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor{icon_state = "red"; dir = 9},/area/security/main) -"adT" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/main) -"adU" = (/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/main) +"adS" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/main) +"adT" = (/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_y = 30},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/effect/landmark{name = "secequipment"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/main) +"adU" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/effect/landmark{name = "secequipment"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/main) "adV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/table,/obj/machinery/recharger,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/main) -"adW" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/security/main) +"adW" = (/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/main) "adX" = (/obj/machinery/door/airlock/external{name = "Security Escape Pod"; req_access_txt = "63"},/turf/simulated/floor/plating,/area/security/main) "adY" = (/turf/simulated/floor/plating,/area/maintenance/fsmaint) "adZ" = (/obj/machinery/door/airlock/shuttle{name = "Escape Pod Airlock"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod3/station) @@ -218,16 +218,16 @@ "aej" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating/airless,/area/solar/auxport) "aek" = (/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/security/prison) "ael" = (/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/security/prison) -"aem" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/main) +"aem" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor{icon_state = "red"; dir = 9},/area/security/main) "aen" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/landmark/start{name = "Security Officer"},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor,/area/security/main) "aeo" = (/obj/structure/table,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/item/weapon/razor{pixel_x = -6},/obj/item/stack/medical/ointment{pixel_y = 4},/obj/item/stack/medical/bruise_pack{pixel_x = 10; pixel_y = 2},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = 5; pixel_y = -2},/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/security/prison) -"aep" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/main) +"aep" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/main) "aeq" = (/obj/structure/closet/secure_closet/brig{anchored = 1},/turf/simulated/floor{icon_state = "red"},/area/security/prison) "aer" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "red"; dir = 9},/area/security/prison) "aes" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/prison) "aet" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/security/processing) "aeu" = (/obj/machinery/flasher/portable,/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/security/armory) -"aev" = (/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/main) +"aev" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/main) "aew" = (/obj/structure/rack,/obj/item/weapon/gun/energy/laser{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser{pixel_x = 3; pixel_y = -3},/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/security/armory) "aex" = (/obj/structure/rack,/obj/item/weapon/gun/energy/gun{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun{pixel_x = 3; pixel_y = -3},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/security/armory) "aey" = (/obj/structure/table/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/door/window/brigdoor{dir = 1; name = "Armory Desk"; req_access_txt = "3"},/obj/machinery/door/window/southleft{name = "Reception Desk"; req_access_txt = "63"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) @@ -241,7 +241,7 @@ "aeG" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) "aeH" = (/obj/structure/table,/obj/item/weapon/handcuffs,/obj/item/device/assembly/timer,/turf/simulated/floor,/area/security/main) "aeI" = (/obj/structure/table,/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/turf/simulated/floor,/area/security/main) -"aeJ" = (/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/main) +"aeJ" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/main) "aeK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/main) "aeL" = (/obj/structure/sign/pods{pixel_x = 32; pixel_y = 0},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/security/main) "aeM" = (/obj/structure/closet/emcloset,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint) @@ -277,7 +277,7 @@ "afq" = (/obj/item/weapon/cigbutt,/turf/simulated/floor{icon_state = "dark"},/area/security/brig) "afr" = (/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/brig) "afs" = (/turf/simulated/floor{icon_state = "red"; dir = 8},/area/hallway/secondary/exit) -"aft" = (/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor{icon_state = "red"},/area/security/main) +"aft" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/main) "afu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "red"; dir = 9},/area/security/brig) "afv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/brig) "afw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/warden) @@ -360,7 +360,7 @@ "agV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{icon_state = "barber"},/area/security/prison) "agW" = (/obj/structure/bookcase,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "agX" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/main) -"agY" = (/obj/structure/closet/secure_closet/security/sec,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/main) +"agY" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/security/main) "agZ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor{icon_state = "red"},/area/security/main) "aha" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 6},/area/security/main) "ahb" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "63"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/security/main) @@ -466,7 +466,7 @@ "aiX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 9},/area/security/brig) "aiY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/brig) "aiZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door_timer/cell_4,/obj/machinery/light,/turf/simulated/floor{icon_state = "red"},/area/security/brig) -"aja" = (/obj/structure/noticeboard{dir = 1; pixel_y = -27},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "red"},/area/security/main) +"aja" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/main) "ajb" = (/turf/simulated/floor,/area/security/brig) "ajc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = "0"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/brig) "ajd" = (/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/courtroom) @@ -492,8 +492,8 @@ "ajx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/security/brig) "ajy" = (/obj/machinery/door/airlock/glass_security{id_tag = "innerbrig"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor{icon_state = "red"; dir = 9},/area/security/brig) "ajz" = (/obj/machinery/door/airlock/glass_security{id_tag = "innerbrig"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/brig) -"ajA" = (/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_y = 30},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/main) -"ajB" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/main) +"ajA" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/security/main) +"ajB" = (/obj/structure/table,/obj/item/weapon/packageWrap,/obj/item/weapon/pen,/turf/simulated/floor,/area/security/main) "ajC" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/pen,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light/small{dir = 1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/prison) "ajD" = (/obj/structure/stool/bed/chair{dir = 4; name = "Prosecution"},/turf/simulated/floor{icon_state = "red"; dir = 9},/area/crew_quarters/courtroom) "ajE" = (/obj/structure/table/woodentable,/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/courtroom) @@ -8921,6 +8921,7 @@ "dpC" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/medical/virology) "dpD" = (/obj/machinery/atmospherics/valve{dir = 4; icon_state = "valve1"; open = 1; openDuringInit = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/medical/virology) "dpE" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/item/weapon/wrench,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/medical/virology) +"dpF" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/closet/secure_closet/security/sec,/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/main) "dpH" = (/turf/simulated/wall,/area/aisat) "dpI" = (/obj/effect/landmark/start{name = "Cyborg"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior) "dpJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/aisat) @@ -9216,18 +9217,18 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdabdabdabdabdabdaagaaiaaiamHaaxaaqaaqaayaazaaxaaqaataaAaaiahlaahaafaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdagqagvaikajCamGabdabdaaiaaBaaqaaqaaqaaxaaCafYaaqaaqaaEaaFaaiaaiaaiaafaaaaaaaaaaaaaaaaafaaaaahaaaaaaaaaaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaaGaaGaaHaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatuagSaiJaiMaiKaiLagJaiIaaiaaIaaqaaJaaqaaqaaqaaqaaqaaqaaKaaqaaLaaMaaiaafaafaafaafaafaafaafaafabkabkablabkabkaaNaaNaaOaaPaaQaaNaaNaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaaaaafaaaaaRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabddoVdoWaojdoYdpoabddppaaiaaSaaqaaqaaTaaqaaqaaqaaUaaqaaKaaqaaVaaWaaiaafaaaaaaaaaaaaaaaaaaaaaablafmabBagXagYaaNdpcaaYaaZdpbdpdaaNaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafabcaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabddoVdoWaojdoYdpoabddppaaiaaSaaqaaqaaTaaqaaqaaqaaUaaqaaKaaqaaVaaWaaiaafaaaaaaaaaaaaaaaaaaaaaablafmabBagXdpFaaNdpcaaYaaZdpbdpdaaNaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafabcaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaHaaHaaGaaHaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabddpedpqdphdoLabddpgaaiabdabeabdabfabdabgabdabhabdabiabdabdabjaaiaafaaaaafaafaafaafaaaaafabkabCabBaNpafmaaNdpjabodpkabobmDaaNaaaaafabqaafaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaaGaaGaaGaaGaaaaaaaaaabraaaaaaaaaaaGaaGaaHaaHaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaafaaaaaRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafdpmdoLdpfdoLabddpiaaiabsaaqabtabfabuaaqabvabhabwaaKabxabdabyaaiabzabzabzabzabzabzabzabzabzabAabBaeKafmabDabodoJdoIabEagpaaNaaaaafabIabJabIaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRaaaaaaaafaafaafaaaaaaabraafaafaaaaafaafaaaaaaaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafabKaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafdpmdoTdoRdoSagjdpnaaiabLaaqabMabNabOaaqabPabhabQaaKabPabdabRaaiabSabTabVabVabWabXabYdoOabzacaabBaeKafmacdaceabodoPabodoUaaNaafaafabIaciabIaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafacjacjacjacjacjaafackaafacjacjacjacjacjaafaaGaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaHaaHaaGaaGaaaaaaaaaaclaaaaaaaaaaaGaaGaaHaaHaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlabddowdoxdosdoydozaaiabhacmabdabfabhacnabfabhabhacoabfabdabdaaiabSacpacqacqacqacqdoCdoAabzacsabBaeKafmaaNdoBacvacwacxacyaaNafOabkacBabJabIabIacCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafacDacEacEacEacEacFacGacHacIacIacIacIacJaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaaaaafaafaaaaaaaaaaclaafaafaaaaafaafaaaaaaaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahldoMdoKdoDdoHacPacMacNdpaacPacQacRacSacPacTacUacVacWaaiacXacYdoEdoFadbdoGdoQdoZbYgabBadfadgabkaaNadhaaNadiaaNadjaaNadQadmabkadnadoadpadpadqaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafadradradradradraafacGaafadradradradradraafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafadsadsadsadsadsaafadtaafadsadsadsadsadsaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlaKubRDcdladzamJadwaliadBadzadAadBadzadzadCajwadEadFaaiadGamfadIadJadJadKalbakZalaajQaksadVabkadSadTadUadRaemaepadUaevadWadXadYadZaeaaohaecaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaaaaaaaafaaaaaaaafacGaaaaaaaaaaafaaaaaaaaaaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafaedaeeaeeaeeaeeaefaegaehaeiaeiaeiaeiaejaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlaaaahlahlahlahldoraaiaaiaaiaaidoidoudotdbydbjaeodaZaeqaeqaeqabdaeraesaaiaoiaeudbaaewaexbEBcuwaeAabzaeBchVaeDabkcuGaeHadQcuUaeEaeIdovaeJaeLabkaeMaeNadpadpaeOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafacjacjacjacjacjaafacGaafacjacjacjacjacjaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafaePaePaePaePaePaafaegaafaePaePaePaePaePaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaiaaiabdafaabdaeSaeSaeSaeSaeSaeSaeSaeTaeUaeVafhaeXaeYaeZagdafbagkafdaeVafeagoajBajAaeWafjadQadlaeEafkaeFadkabkacBabIabIabIacCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafacDacEacEacEacEacFacGacHacIacIacIacIacJaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaaaaaaaafaaaaaaaafaegaaaaaaaaaaafaaaaaaaaaaaRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaafaaaaaaaaiadHaekaelaeSafnafoafpafqafoaeSafuafvafwagMafxafyafcahmafBafMafXafNagbagaafHafIaenaczafIacAadyadxadvacuafPafQafRafSabIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafadradradradradraafacGaafadradradradradraafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafadsadsadsadsadsaafaegaafadsadsadsadsadsaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaafaafaafaafaaiadaaaDafKaeSafTafUafVafWafoaeSafuafLagGagHagiageagfaggaghafEagMafDafGafFagmagnacKagnagnactagraccagsagtabkabkadYaguabIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaaaaaaaafaaaaaaaaaacGaaaaaaaaaaafaaaaaaaaaaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafaedaeeaeeaeeaeeaefaegaehaeiaeiaeiaeiaejaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaiabFaaDadOagAabnagwagxagyagzagAadPaeCafwafCagcafiaflagKabGaeGagNaeQagPahsajaaftacfagUachacgacbabpagZahaahbahcahdaheahfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafacjacjacjacjacjaafacGaafacjacjacjacjacjaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaaaaafaafaaaaaaaaaaclaafaafaaaaafaafaaaaaaaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahldoMdoKdoDdoHacPacMacNdpaacPacQacRacSacPacTacUacVacWaaiacXacYdoEdoFadbdoGdoQdoZbYgabBadfadgabkaaNadhaaNadiaaNadjaaNajBajAabkadnadoadpadpadqaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafadradradradradraafacGaafadradradradradraafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafadsadsadsadsadsaafadtaafadsadsadsadsadsaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlaKubRDcdladzamJadwaliadBadzadAadBadzadzadCajwadEadFaaiadGamfadIadJadJadKalbakZalaajQaksadVabkaemaepadWadRaevaeJadWaftagYadXadYadZaeaaohaecaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaaaaaaaafaaaaaaaafacGaaaaaaaaaaafaaaaaaaaaaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafaedaeeaeeaeeaeeaefaegaehaeiaeiaeiaeiaejaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlaaaahlahlahlahldoraaiaaiaaiaaidoidoudotdbydbjaeodaZaeqaeqaeqabdaeraesaaiaoiaeudbaaewaexbEBcuwaeAabzaeBchVaeDabkcuGaeHadQcuUaeEaeIdovajaaeLabkaeMaeNadpadpaeOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafacjacjacjacjacjaafacGaafacjacjacjacjacjaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafaePaePaePaePaePaafaegaafaePaePaePaePaePaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaiaaiabdafaabdaeSaeSaeSaeSaeSaeSaeSaeTaeUaeVafhaeXaeYaeZagdafbagkafdaeVafeagoadUadTaeWafjadQadlaeEafkaeFadSabkacBabIabIabIacCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafacDacEacEacEacEacFacGacHacIacIacIacIacJaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaaaaaaaafaaaaaaaafaegaaaaaaaaaaafaaaaaaaaaaaRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaafaaaaaaaaiadHaekaelaeSafnafoafpafqafoaeSafuafvafwagMafxafyafcahmafBafMafXafNagbagaafHafIaenaczafIacAadyadxadvadmafPafQafRafSabIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafadradradradradraafacGaafadradradradradraafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafadsadsadsadsadsaafaegaafadsadsadsadsadsaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaafaafaafaafaaiadaaaDafKaeSafTafUafVafWafoaeSafuafLagGagHagiageagfaggaghafEagMafDafGafFagmagnacKagnagnactagradkagsagtabkabkadYaguabIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaaaaaaaafaaaaaaaaaacGaaaaaaaaaaafaaaaaaaaaaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafaedaeeaeeaeeaeeaefaegaehaeiaeiaeiaeiaejaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaiabFaaDadOagAabnagwagxagyagzagAadPaeCafwafCagcafiaflagKabGaeGagNaeQagPahsacuacfaccacbachacgagUabpagZahaahbahcahdaheahfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafacjacjacjacjacjaafacGaafacjacjacjacjacjaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafaePaePaePaePaePaafaegaafaePaePaePaePaePaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaaaaafaaaaaaaaiadLadMadNaeSahgahhahhahhahhahiadDagFaeVafAaezaeyahpahqaduafzaeVaeVacBagRahtacBacBabkabkabkabkabkabkabkabkahuahvahwahxaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaafacDacEacEacEacEacFacGacHacIacIacIacIacJaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaaaaaaaafaaaaaaaaaaegaaaaaaaaaaafaaaaaaaaaaaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafahyahyakWahyadcaeRaddaeSaeSaeSaeSaeSaeSahzaeSahFahGahDahDahDahDahDahHahIahDahJahKahLagQahIagFaeRahMahNahOaawahQahRahSahTahUahVahWahXaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaadradradradradraafacGaafadradradradradraaaaaRaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaafadsadsadsadsadsaafaegaafadsadsadsadsadsaafaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaahYahZahZahZaiaaaaaafahyabbabaacOacZaeRacLacraigahDabZabmabHailaimainaioaipaipaipaioaipaiqairaipairaipaipaglairaisaitaiuaivaiwaixaiyaizaiAaiBahuahvahwabIaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaaafaaaaafaafaaaaaaacGaaaaaaaafaaaaaaaafaaaaaGaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index 9a746a952f6..ca4c3bb6d91 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -37,6 +37,7 @@ var/list/tdomeadmin = list() var/list/prisonsecuritywarp = list() //prison security goes to these var/list/prisonwarped = list() //list of players already warped var/list/blobstart = list() +var/list/secequipment = list() var/list/global_activeturfs //away missions diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index a4c1fac1f53..38eb5e8abc0 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -76,6 +76,7 @@ var/traitor_scaling_coeff = 6 //how much does the amount of players get divided by to determine traitors var/changeling_scaling_coeff = 7 //how much does the amount of players get divided by to determine changelings + var/security_scaling_coeff = 8 //how much does the amount of players get divided by to determine open security officer positions var/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other var/allow_latejoin_antagonists = 0 // If late-joining players can be traitor/changeling @@ -344,6 +345,8 @@ config.traitor_scaling_coeff = text2num(value) if("changeling_scaling_coeff") config.changeling_scaling_coeff = text2num(value) + if("security_scaling_coeff") + config.security_scaling_coeff = text2num(value) if("probability") var/prob_pos = findtext(value, " ") var/prob_name = null diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 960908c55f5..df404d38fc1 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -152,8 +152,8 @@ Security Officer department_head = list("Head of Security") department_flag = ENGSEC faction = "Station" - total_positions = 5 - spawn_positions = 5 + total_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() + spawn_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() supervisors = "the head of security, and the head of your assigned department (if applicable)" selection_color = "#ffeeee" minimal_player_age = 7 diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index dc1088e55a3..c01c0a08ba3 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -189,6 +189,9 @@ var/global/datum/controller/occupations/job_master Debug("DO, Len: [unassigned.len]") if(unassigned.len == 0) return 0 + //Scale number of open security officer slots to population + setup_officer_positions() + //Shuffle players and jobs unassigned = shuffle(unassigned) @@ -308,6 +311,24 @@ var/global/datum/controller/occupations/job_master return 1 +/datum/controller/occupations/proc/setup_officer_positions() + var/officer_positions = 5 //Number of open security officer positions at round start + + if(config.security_scaling_coeff > 0) + officer_positions = min(12, max(5, (unassigned.len/config.security_scaling_coeff))) + var/datum/job/J = job_master.GetJob("Security Officer") + if(J || J.spawn_positions > 0) + Debug("Setting open security officer positions to [officer_positions]") + J.total_positions = officer_positions + J.spawn_positions = officer_positions + for(var/i=officer_positions-5, i>1, i--) //Spawn some extra lockers if we don't have enough + if(secequipment.len) + var/spawnloc = secequipment[1] + new /obj/structure/closet/secure_closet/security(spawnloc) + secequipment -= spawnloc + else //We ran out of spare locker spawns! + break + /datum/controller/occupations/proc/LoadJobs(jobsfile) //ran during round setup, reads info from jobs.txt -- Urist if(!config.load_jobs_from_txt) return 0 diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index bd605edfc5a..377d7777b0f 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -55,7 +55,10 @@ blobstart += loc qdel(src) return - + if("secequipment") + secequipment += loc + qdel(src) + return if("xeno_spawn") xeno_spawn += loc qdel(src) diff --git a/config/game_options.txt b/config/game_options.txt index b9ca7e763ca..44b3b968ccf 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -114,6 +114,11 @@ SHUTTLE_REFUEL_DELAY 12000 TRAITOR_SCALING_COEFF 6 CHANGELING_SCALING_COEFF 7 +## Variables calculate how number of open security officer positions will scale to population. +## Used as (Officers = Population / Coeff) +## Set to 0 to disable scaling and use default numbers instead. +SECURITY_SCALING_COEFF 8 + ## Uncomment to prohibit jobs that start with loyalty ## implants from being most antagonists. #PROTECT_ROLES_FROM_ANTAGONIST From 1d2ae48cf3854cc9dcddaaac38430024cc6f9b41 Mon Sep 17 00:00:00 2001 From: paprka Date: Fri, 20 Jun 2014 03:13:27 -0700 Subject: [PATCH 02/41] initial --- code/modules/mining/equipment_locker.dm | 20 +++++++++--------- code/modules/mining/mine_turfs.dm | 27 +++++++++++++++++-------- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index f86ed7fce72..c9b5261763f 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -160,18 +160,18 @@ new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 100), new /datum/data/mining_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 150), new /datum/data/mining_equipment("Soap", /obj/item/weapon/soap/nanotrasen, 150), - new /datum/data/mining_equipment("Stimulant pills", /obj/item/weapon/storage/pill_bottle/stimulant, 350), - new /datum/data/mining_equipment("Alien toy", /obj/item/clothing/mask/facehugger/toy, 250), - new /datum/data/mining_equipment("Laser pointer", /obj/item/device/laser_pointer, 500), - new /datum/data/mining_equipment("Point card", /obj/item/weapon/card/mining_point_card, 500), - new /datum/data/mining_equipment("Lazarus injector", /obj/item/weapon/lazarus_injector, 1000), - new /datum/data/mining_equipment("Space cash", /obj/item/weapon/spacecash/c1000, 5000), - new /datum/data/mining_equipment("Sonic jackhammer", /obj/item/weapon/pickaxe/jackhammer, 500), - new /datum/data/mining_equipment("Mining drone", /mob/living/simple_animal/hostile/mining_drone/, 500), - new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 200), + new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 500), + new /datum/data/mining_equipment("Laser Pointer", /obj/item/device/laser_pointer, 500), + new /datum/data/mining_equipment("Stimulant Pills", /obj/item/weapon/storage/pill_bottle/stimulant, 350), + new /datum/data/mining_equipment("Sonic Jackhammer", /obj/item/weapon/pickaxe/jackhammer, 500), + new /datum/data/mining_equipment("Mining Drone", /mob/living/simple_animal/hostile/mining_drone/, 500), new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 750), - new /datum/data/mining_equipment("Kinetic accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 1000), + new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 1000), new /datum/data/mining_equipment("Jetpack", /obj/item/weapon/tank/jetpack/carbondioxide/mining, 2000), + new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 200), + new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000), + new /datum/data/mining_equipment("Point Card", /obj/item/weapon/card/mining_point_card, 500), + new /datum/data/mining_equipment("Space Cash", /obj/item/weapon/spacecash/c1000, 5000), ) /datum/data/mining_equipment/ diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 846ec298675..79e2153eccb 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -72,8 +72,8 @@ /turf/simulated/mineral/random name = "Mineral deposit" icon_state = "rock" - var/mineralSpawnChanceList = list("Uranium" = 1, "Diamond" = 1, "Gold" = 1, "Silver" = 1, "Plasma" = 1, "Iron" = 50, "Gibtonite" = 4/*, "Adamantine" =5*/, "Cave" = 2)//Currently, Adamantine won't spawn as it has no uses. -Durandan - var/mineralChance = 10 //means 10% chance of this plot changing to a mineral deposit + var/mineralSpawnChanceList = list("Uranium" = 18, "Diamond" = 5, "Gold" = 12, "Silver" = 18, "Plasma" = 25, "Iron" = 40, "Gibtonite" = 2/*, "Adamantine" =5*/, "Cave" = 2)//Currently, Adamantine won't spawn as it has no uses. -Durandan + var/mineralChance = 17 /turf/simulated/mineral/random/New() ..() @@ -99,6 +99,8 @@ new/turf/simulated/floor/plating/asteroid/airless/cave(src) if("Gibtonite") M = new/turf/simulated/mineral/gibtonite(src) + if("Clown") + M = new/turf/simulated/mineral/clown(src) /*if("Adamantine") M = new/turf/simulated/mineral/adamantine(src)*/ if(M) @@ -109,16 +111,25 @@ /turf/simulated/mineral/random/high_chance icon_state = "rock_highchance" mineralChance = 25 - mineralSpawnChanceList = list("Uranium" = 35, "Diamond" = 10, "Gold" = 35, "Silver" = 35, "Plasma" = 35, "Iron" = 50) + mineralSpawnChanceList = list("Uranium" = 35, "Diamond" = 30, "Gold" = 45, "Silver" = 50, "Plasma" = 30) /turf/simulated/mineral/random/high_chance/New() icon_state = "rock" ..() +/turf/simulated/mineral/random/clown + icon_state = "rock_highchance" + mineralChance = 25 + mineralSpawnChanceList = list("Clown" = 50) + +/turf/simulated/mineral/random/clown/New() + icon_state = "rock" + ..() + /turf/simulated/mineral/random/low_chance icon_state = "rock_lowchance" - mineralChance = 5 - mineralSpawnChanceList = list("Uranium" = 1, "Diamond" = 1, "Gold" = 1, "Silver" = 1, "Plasma" = 1, "Iron" = 50, "Gibtonite" = 4) + mineralChance = 8 + mineralSpawnChanceList = list("Uranium" = 8, "Diamond" = 2, "Gold" = 4, "Silver" = 8, "Plasma" = 20, "Iron" = 40, "Gibtonite" = 1) /turf/simulated/mineral/random/low_chance/New() icon_state = "rock" @@ -168,7 +179,7 @@ name = "Plasma deposit" icon_state = "rock_Plasma" mineralName = "Plasma" - spreadChance = 5 + spreadChance = 8 spread = 1 hidden = 1 scan_state = "rock_Plasma" @@ -353,7 +364,7 @@ if(prob(30)) if(istype(loc, /area/mine/explored)) return - for(var/atom/A in range(15,T))//Lowers chance of mob clumps + for(var/atom/A in range(30,T))//Lowers chance of mob clumps if(istype(A, /mob/living/simple_animal/hostile/asteroid)) return var/randumb = pickweight(mob_spawn_list) @@ -613,4 +624,4 @@ else if(istype(R.module_state_3,/obj/item/weapon/storage/bag/ore)) src.attackby(R.module_state_3,R) else - return \ No newline at end of file + return From 2161273c797ba4c3ffeece3aab762928a26a59e8 Mon Sep 17 00:00:00 2001 From: paprka Date: Fri, 20 Jun 2014 03:17:57 -0700 Subject: [PATCH 03/41] better --- code/modules/mining/mine_turfs.dm | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 79e2153eccb..97cc7e47ba6 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -72,8 +72,8 @@ /turf/simulated/mineral/random name = "Mineral deposit" icon_state = "rock" - var/mineralSpawnChanceList = list("Uranium" = 18, "Diamond" = 5, "Gold" = 12, "Silver" = 18, "Plasma" = 25, "Iron" = 40, "Gibtonite" = 2/*, "Adamantine" =5*/, "Cave" = 2)//Currently, Adamantine won't spawn as it has no uses. -Durandan - var/mineralChance = 17 + var/mineralSpawnChanceList = list("Uranium" = 18, "Diamond" = 3, "Gold" = 12, "Silver" = 16, "Plasma" = 25, "Iron" = 40, "Gibtonite" = 2/*, "Adamantine" =5*/, "Cave" = 2)//Currently, Adamantine won't spawn as it has no uses. -Durandan + var/mineralChance = 16 /turf/simulated/mineral/random/New() ..() @@ -117,19 +117,10 @@ icon_state = "rock" ..() -/turf/simulated/mineral/random/clown - icon_state = "rock_highchance" - mineralChance = 25 - mineralSpawnChanceList = list("Clown" = 50) - -/turf/simulated/mineral/random/clown/New() - icon_state = "rock" - ..() - /turf/simulated/mineral/random/low_chance icon_state = "rock_lowchance" mineralChance = 8 - mineralSpawnChanceList = list("Uranium" = 8, "Diamond" = 2, "Gold" = 4, "Silver" = 8, "Plasma" = 20, "Iron" = 40, "Gibtonite" = 1) + mineralSpawnChanceList = list("Uranium" = 8, "Diamond" = 2, "Gold" = 4, "Silver" = 6, "Plasma" = 20, "Iron" = 40, "Gibtonite" = 1) /turf/simulated/mineral/random/low_chance/New() icon_state = "rock" @@ -364,7 +355,7 @@ if(prob(30)) if(istype(loc, /area/mine/explored)) return - for(var/atom/A in range(30,T))//Lowers chance of mob clumps + for(var/atom/A in range(20,T))//Lowers chance of mob clumps if(istype(A, /mob/living/simple_animal/hostile/asteroid)) return var/randumb = pickweight(mob_spawn_list) From c21b6b0e55058ca66bd4730532b3887adbc018ce Mon Sep 17 00:00:00 2001 From: paprka Date: Fri, 20 Jun 2014 11:28:48 -0700 Subject: [PATCH 04/41] sample text --- code/modules/clothing/glasses/glasses.dm | 7 ++----- code/modules/research/designs.dm | 15 +++------------ 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 71dfa65a386..41c2835cdc5 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -1,14 +1,11 @@ /obj/item/clothing/glasses/meson name = "Optical Meson Scanner" - desc = "Used for seeing walls, floors, and stuff through anything." + desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." icon_state = "meson" item_state = "glasses" origin_tech = "magnets=2;engineering=2" + darkness_view = 1 vision_flags = SEE_TURFS - -/obj/item/clothing/glasses/meson/advanced - name = "Advanced Optical Meson Scanner" - desc = "More powerful than your standard mesons, these ones make everything appear to be lit extremely brightly." invis_view = SEE_INVISIBLE_MINIMUM /obj/item/clothing/glasses/science diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 5e126658836..e241784124c 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1880,22 +1880,13 @@ datum/design/welding_mask datum/design/mesons name = "Optical Meson Scanners" - desc = "Used for seeing walls, floors, and stuff through anything." + desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." id = "mesons" - req_tech = list("magnets" = 2, "engineering" = 2) + req_tech = list("materials" = 3, "magnets" = 3, "engineering" = 3) build_type = PROTOLATHE - materials = list("$metal" = 50, "$glass" = 50) + materials = list("$metal" = 200, "$glass" = 300, "$plasma" = 100) build_path = /obj/item/clothing/glasses/meson -datum/design/advanced_mesons - name = "Advanced Optical Meson Scanner" - desc = "More powerful than your standard mesons, these ones make everything appear to be lit extremely brightly." - id = "advanced_mesons" - req_tech = list("magnets" = 4, "engineering" = 4) - build_type = PROTOLATHE - materials = list("$metal" = 100, "$glass" = 100) - build_path = /obj/item/clothing/glasses/meson/advanced - datum/design/night_vision_goggles name = "Night Vision Goggles" desc = "Goggles that let you see through darkness unhindered." From c6c8c58ef7d829fb1f66cbc3a71403a1e39841c8 Mon Sep 17 00:00:00 2001 From: Menshin Date: Tue, 1 Jul 2014 18:54:41 +0200 Subject: [PATCH 05/41] Machines de/connecting from/to a powernet will now always call the connect_to_network/disconnect_from_network procs instead of de/connecting directly. --- code/modules/power/cable.dm | 6 ++++-- code/modules/power/power.dm | 22 +++++++--------------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 19ebe4a5600..7e416681d5a 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -341,7 +341,8 @@ obj/structure/cable/proc/avail() if(N.terminal.powernet) merge_powernets(powernet, N.terminal.powernet) else - powernet.add_machine(N.terminal) + if(!N.terminal.connect_to_network()) + N.terminal.disconnect_from_network() else if(istype(AM,/obj/machinery/power)) //other power machines var/obj/machinery/power/M = AM @@ -349,7 +350,8 @@ obj/structure/cable/proc/avail() if(M.powernet) merge_powernets(powernet, M.powernet) else - powernet.add_machine(M) + if(!M.connect_to_network()) + M.disconnect_from_network() ////////////////////////////////////////////// // Powernets handling helpers diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 56adc205042..48f66f0191b 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -267,21 +267,13 @@ net1 = net2 net2 = temp - //we don't use add_cable and add_machine here, because that could - //change the size of net2.nodes or net2.cables while in the loop (runtime galore) - for(var/i=1,i<=net2.nodes.len,i++) //merge net2 into net1 - var/obj/machinery/power/Node = net2.nodes[i] //merge power machines - if(Node) - Node.powernet = net1 - net1.nodes[Node] = Node + //merge net2 into net1 + for(var/obj/structure/cable/Cable in net2.cables) //merge cables + net1.add_cable(Cable) - for(var/i=1,i<=net2.cables.len,i++) - var/obj/structure/cable/Cable = net2.cables[i] //merge cables - if(Cable) - Cable.powernet = net1 - net1.cables += Cable - - qdel(net2) //garbage collect the now empty powernet + for(var/obj/machinery/power/Node in net2.nodes) //merge power machines + if(!Node.connect_to_network()) + Node.disconnect_from_network() //if somehow we can't connect the machine to the new powernet, disconnect it from the old nonetheless return net1 @@ -401,7 +393,7 @@ if(M.powernet == src) return else - M.powernet.remove_machine(M) //..remove it + M.disconnect_from_network()//..remove it M.powernet = src nodes[M] = M From aecbf2b0b535913a9ff8c71d46514a7dc4713275 Mon Sep 17 00:00:00 2001 From: ikarrus Date: Tue, 1 Jul 2014 13:46:11 -0600 Subject: [PATCH 06/41] Re-adding missing files from the last merge attempt (+2 squashed commit) Squashed commit: [30c5e29] Re-adding missing files from the last merge attempt [53bcfea] Re-adding missing files from the last merge attempt --- code/game/gamemodes/monkey/monkey.dm | 85 ++ .../mob/living/carbon/human/mutantrace.dm | 22 + .../mob/living/carbon/human/species.dm | 1330 +++++++++++++++++ .../mob/living/carbon/human/species_types.dm | 221 +++ sound/machines/airlockforced.ogg | Bin 0 -> 16204 bytes 5 files changed, 1658 insertions(+) create mode 100644 code/game/gamemodes/monkey/monkey.dm create mode 100644 code/modules/mob/living/carbon/human/mutantrace.dm create mode 100644 code/modules/mob/living/carbon/human/species.dm create mode 100644 code/modules/mob/living/carbon/human/species_types.dm create mode 100644 sound/machines/airlockforced.ogg diff --git a/code/game/gamemodes/monkey/monkey.dm b/code/game/gamemodes/monkey/monkey.dm new file mode 100644 index 00000000000..ef737a86621 --- /dev/null +++ b/code/game/gamemodes/monkey/monkey.dm @@ -0,0 +1,85 @@ +/datum/game_mode/monkey + name = "monkey" + config_tag = "monkey" + antag_flag = BE_REV + + required_players = 20 + required_enemies = 1 + recommended_enemies = 1 + + restricted_jobs = list("Cyborg", "AI") + + var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) + var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) + + var/carriers_to_make = 1 + var/list/carriers = list() + + var/monkeys_to_win = 0 + var/escaped_monkies = 0 + + var/players_per_carrier = 30 + + +/datum/game_mode/monkey/pre_setup() + carriers_to_make = max(round(num_players()/players_per_carrier, 1), 1) + for(var/datum/mind/player in antag_candidates) + for(var/job in restricted_jobs)//Removing robots from the list + if(player.assigned_role == job) + antag_candidates -= player + for(var/j = 0, j < carriers, j++) + if (!antag_candidates.len) + break + var/datum/mind/carrier = pick(antag_candidates) + carriers += carrier + carrier.special_role = "monkey" + log_game("[carrier.key] (ckey) has been selected as a Jungle Fever carrier") + antag_candidates -= carrier + if(!carriers.len) + return 0 + return 1 + + +/datum/game_mode/monkey/announce() + world << "The current game mode is - Monkey!" + world << "One or more crewmembers have been infected with Jungle Fever! Crew: Contain the outbreak. None of the infected monkeys may escape alive to Centcom. \ + Monkeys: Ensure that your kind lives on! Rise up against your captors!" + + +/datum/game_mode/monkey/proc/greet_carrier(var/datum/mind/carrier) + carrier.current << "You are infected by the Jungle Fever patient zero!!" + carrier.current << "You have been planted onto this station by the Animal Rights Consortium." + carrier.current << "Soon the disease will transform you into an ape. Afterwards, you will be able spread the infection to others with a bite." + carrier.current << "While your infection is undetectable, any other infectees will show up on medical equipment." + carrier.current << "Your mission will be deemed a success if any of the live infected monkeys reach Centcom." + return + +/datum/game_mode/monkey/post_setup() + for(var/datum/mind/carriermind in carriers) + greet_carrier(carriermind) + var/datum/disease/transformation/jungle_fever/J = new /datum/disease/transformation/jungle_fever + J.hidden = list(1, 1)//Starting disease is hidden from medical equipment + carriermind.current.contract_disease(J, 1, 0) + ..() + +/datum/game_mode/monkey/proc/check_monkey_victory() + for(var/mob/living/carbon/monkey/M in living_mob_list) + if (M.has_disease(/datum/disease/transformation/jungle_fever)) + var/area/A = get_area(M) + if(is_type_in_list(A, centcom_areas)) + escaped_monkies++ + if(escaped_monkies >= monkeys_to_win) + return 0 + else + return 1 + + +/datum/game_mode/monkey/declare_completion() + if(!check_monkey_victory()) + feedback_set_details("round_end_result","win - monkey win") + feedback_set("round_end_result",escaped_monkies) + world << "\red The monkies have overthrown their captors! Eeek eeeek!!" + else + feedback_set_details("round_end_result","loss - staff stopped the monkies") + feedback_set("round_end_result",escaped_monkies) + world << "\red The staff managed to contain the monkey infestation!" diff --git a/code/modules/mob/living/carbon/human/mutantrace.dm b/code/modules/mob/living/carbon/human/mutantrace.dm new file mode 100644 index 00000000000..30615bb624c --- /dev/null +++ b/code/modules/mob/living/carbon/human/mutantrace.dm @@ -0,0 +1,22 @@ +var/global/list/colored_mutraces = list( // these mutantraces are affected by mutant color + "lizard", + "plant", + "pod", + "slime", + "jelly", + "golem" +) + +var/global/list/mutants_with_eyes = list( // these mutantraces have eyes + "lizard", + "plant", + "pod", + "jelly", +) + +/mob/living/carbon/human/proc/check_mutrace(var/mutneeded = "mut1", var/mutneededalt = "mut2") + if(dna) + if(dna.mutantrace == mutneeded || dna.mutantrace == mutneededalt) + return 1 + + return 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm new file mode 100644 index 00000000000..97143b147b1 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species.dm @@ -0,0 +1,1330 @@ +// This code handles different species in the game. + +#define SPECIES_LAYER 23 +#define BODY_LAYER 22 +#define HAIR_LAYER 8 + +#define TINT_IMPAIR 2 +#define TINT_BLIND 3 + +#define HUMAN_MAX_OXYLOSS 3 +#define HUMAN_CRIT_MAX_OXYLOSS ( (last_tick_duration) /3) + +#define HEAT_DAMAGE_LEVEL_1 2 +#define HEAT_DAMAGE_LEVEL_2 3 +#define HEAT_DAMAGE_LEVEL_3 8 + +#define COLD_DAMAGE_LEVEL_1 0.5 +#define COLD_DAMAGE_LEVEL_2 1.5 +#define COLD_DAMAGE_LEVEL_3 3 + +#define HEAT_GAS_DAMAGE_LEVEL_1 2 +#define HEAT_GAS_DAMAGE_LEVEL_2 4 +#define HEAT_GAS_DAMAGE_LEVEL_3 8 + +#define COLD_GAS_DAMAGE_LEVEL_1 0.5 +#define COLD_GAS_DAMAGE_LEVEL_2 1.5 +#define COLD_GAS_DAMAGE_LEVEL_3 3 + +/datum/species + var/id = null // if the game needs to manually check your race to do something not included in a proc here, it will use this + var/name = null // this is the fluff name. these will be left generic (such as 'Lizardperson' for the lizard race) so servers can change them to whatever + var/roundstart = 0 // can this mob be chosen at roundstart? (assuming the config option is checked?) + var/default_color = "#FFF" // if alien colors are disabled, this is the color that will be used by that race + + var/eyes = "eyes" // which eyes the race uses. at the moment, the only types of eyes are "eyes" (regular eyes) and "jelleyes" (three eyes) + var/sexes = 1 // whether or not the race has sexual characteristics. at the moment this is only 0 for skeletons and shadows + var/hair_color = null // this allows races to have specific hair colors... if null, it uses the H's hair/facial hair colors. if "mutcolor", it uses the H's mutant_color + var/hair_alpha = 255 // the alpha used by the hair. 255 is completely solid, 0 is transparent. + var/use_skintones = 0 // does it use skintones or not? (spoiler alert this is only used by humans) + + var/list/no_equip = list() // slots the race can't equip stuff to + var/nojumpsuit = 0 // this is sorta... weird. it basically lets you equip stuff that usually needs jumpsuits without one, like belts and pockets and ids + + var/say_mod = "says" // affects the speech message + + var/speedmod = 0 // this affects the race's speed. positive numbers make it move slower, negative numbers make it move faster + var/armor = 0 // overall defense for the race... or less defense, if it's negative. + var/brutemod = 1 // multiplier for brute damage + var/burnmod = 1 // multiplier for burn damage + var/coldmod = 1 // multiplier for cold damage + var/heatmod = 1 // multiplier for heat damage + var/punchmod = 0 // adds to the punch damage + + var/invis_sight = SEE_INVISIBLE_LIVING + var/darksight = 2 + + // species flags. these can be found in flags.dm + var/list/specflags = list() + + var/attack_verb = "punch" // punch-specific attack verb + var/sound/attack_sound = 'sound/weapons/punch1.ogg' + var/sound/miss_sound = 'sound/weapons/punchmiss.ogg' + + var/mob/living/list/ignored_by = list() // list of mobs that will ignore this species + + /////////// + // PROCS // + /////////// + + proc/update_base_icon_state(var/mob/living/carbon/human/H) + if(HUSK in H.mutations) + H.remove_overlay(SPECIES_LAYER) // races lose their color + return "husk" + else if(sexes) + if(use_skintones) + return "[H.skin_tone]_[(H.gender == FEMALE) ? "f" : "m"]" + else + return "[id]_[(H.gender == FEMALE) ? "f" : "m"]" + else + return "[id]" + + proc/update_color(var/mob/living/carbon/human/H) + H.remove_overlay(SPECIES_LAYER) + + var/image/standing + + var/g = (H.gender == FEMALE) ? "f" : "m" + + if(MUTCOLORS in specflags) + var/image/spec_base + if(sexes) + spec_base = image("icon" = 'icons/mob/human.dmi', "icon_state" = "[id]_[g]_s", "layer" = -SPECIES_LAYER) + else + spec_base = image("icon" = 'icons/mob/human.dmi', "icon_state" = "[id]_s", "layer" = -SPECIES_LAYER) + if(!config.mutant_colors) + H.dna.mutant_color = default_color + spec_base.color = "#[H.dna.mutant_color]" + standing = spec_base + + if(standing) + H.overlays_standing[SPECIES_LAYER] = standing + + H.apply_overlay(SPECIES_LAYER) + + proc/handle_hair(var/mob/living/carbon/human/H) + H.remove_overlay(HAIR_LAYER) + + var/datum/sprite_accessory/S + var/list/standing = list() + + if(H.facial_hair_style && FACEHAIR in specflags) + S = facial_hair_styles_list[H.facial_hair_style] + if(S) + var/image/img_facial_s + + img_facial_s = image("icon" = S.icon, "icon_state" = "[S.icon_state]_s", "layer" = -HAIR_LAYER) + + if(hair_color) + if(hair_color == "mutcolor") + if(!config.mutant_colors) + img_facial_s.color = "#" + default_color + else + img_facial_s.color = "#" + H.dna.mutant_color + else + img_facial_s.color = "#" + hair_color + else + img_facial_s.color = "#" + H.facial_hair_color + img_facial_s.alpha = hair_alpha + + standing += img_facial_s + + //Applies the debrained overlay if there is no brain + if(!H.getorgan(/obj/item/organ/brain)) + standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained_s", "layer" = -HAIR_LAYER) + + else if(H.hair_style && HAIR in specflags) + S = hair_styles_list[H.hair_style] + if(S) + var/image/img_hair_s = image("icon" = S.icon, "icon_state" = "[S.icon_state]_s", "layer" = -HAIR_LAYER) + + img_hair_s = image("icon" = S.icon, "icon_state" = "[S.icon_state]_s", "layer" = -HAIR_LAYER) + + if(hair_color) + if(hair_color == "mutcolor") + if(!config.mutant_colors) + img_hair_s.color = "#" + default_color + else + img_hair_s.color = "#" + H.dna.mutant_color + else + img_hair_s.color = "#" + hair_color + else + img_hair_s.color = "#" + H.hair_color + img_hair_s.alpha = hair_alpha + + standing += img_hair_s + + if(standing.len) + H.overlays_standing[HAIR_LAYER] = standing + + H.apply_overlay(HAIR_LAYER) + + return + + proc/handle_body(var/mob/living/carbon/human/H) + H.remove_overlay(BODY_LAYER) + + var/list/standing = list() + + // lipstick + if(H.lip_style && LIPS in specflags) + standing += image("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[H.lip_style]_s", "layer" = -BODY_LAYER) + + // eyes + if(EYECOLOR in specflags) + var/image/img_eyes_s = image("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[eyes]_s", "layer" = -BODY_LAYER) + img_eyes_s.color = "#" + H.eye_color + standing += img_eyes_s + + //Underwear + if(H.underwear) + var/datum/sprite_accessory/underwear/U = underwear_all[H.underwear] + if(U) + standing += image("icon"=U.icon, "icon_state"="[U.icon_state]_s", "layer"=-BODY_LAYER) + + if(standing.len) + H.overlays_standing[BODY_LAYER] = standing + + H.apply_overlay(BODY_LAYER) + + return + + proc/spec_life(var/mob/living/carbon/human/H) + return + + proc/spec_death(var/gibbed, var/mob/living/carbon/human/H) + return + + proc/auto_equip(var/mob/living/carbon/human/H) + // handles the equipping of species-specific gear + return + + proc/can_equip(var/obj/item/I, var/slot, var/disable_warning, var/mob/living/carbon/human/H) + if(slot in no_equip) + if(!(type in I.species_exception)) + return 0 + + switch(slot) + if(slot_l_hand) + if(H.l_hand) + return 0 + return 1 + if(slot_r_hand) + if(H.r_hand) + return 0 + return 1 + if(slot_wear_mask) + if(H.wear_mask) + return 0 + if( !(I.slot_flags & SLOT_MASK) ) + return 0 + return 1 + if(slot_back) + if(H.back) + return 0 + if( !(I.slot_flags & SLOT_BACK) ) + return 0 + return 1 + if(slot_wear_suit) + if(H.wear_suit) + return 0 + if( !(I.slot_flags & SLOT_OCLOTHING) ) + return 0 + return 1 + if(slot_gloves) + if(H.gloves) + return 0 + if( !(I.slot_flags & SLOT_GLOVES) ) + return 0 + return 1 + if(slot_shoes) + if(H.shoes) + return 0 + if( !(I.slot_flags & SLOT_FEET) ) + return 0 + return 1 + if(slot_belt) + if(H.belt) + return 0 + if(!H.w_uniform && !nojumpsuit) + if(!disable_warning) + H << "You need a jumpsuit before you can attach this [I.name]." + return 0 + if( !(I.slot_flags & SLOT_BELT) ) + return + return 1 + if(slot_glasses) + if(H.glasses) + return 0 + if( !(I.slot_flags & SLOT_EYES) ) + return 0 + return 1 + if(slot_head) + if(H.head) + return 0 + if( !(I.slot_flags & SLOT_HEAD) ) + return 0 + return 1 + if(slot_ears) + if(H.ears) + return 0 + if( !(I.slot_flags & SLOT_EARS) ) + return 0 + return 1 + if(slot_w_uniform) + if(H.w_uniform) + return 0 + if( !(I.slot_flags & SLOT_ICLOTHING) ) + return 0 + return 1 + if(slot_wear_id) + if(H.wear_id) + return 0 + if(!H.w_uniform && !nojumpsuit) + if(!disable_warning) + H << "You need a jumpsuit before you can attach this [I.name]." + return 0 + if( !(I.slot_flags & SLOT_ID) ) + return 0 + return 1 + if(slot_l_store) + if(I.flags & NODROP) //Pockets aren't visible, so you can't move NODROP items into them. + return 0 + if(H.l_store) + return 0 + if(!H.w_uniform && !nojumpsuit) + if(!disable_warning) + H << "You need a jumpsuit before you can attach this [I.name]." + return 0 + if(I.slot_flags & SLOT_DENYPOCKET) + return + if( I.w_class <= 2 || (I.slot_flags & SLOT_POCKET) ) + return 1 + if(slot_r_store) + if(I.flags & NODROP) + return 0 + if(H.r_store) + return 0 + if(!H.w_uniform && !nojumpsuit) + if(!disable_warning) + H << "You need a jumpsuit before you can attach this [I.name]." + return 0 + if(I.slot_flags & SLOT_DENYPOCKET) + return 0 + if( I.w_class <= 2 || (I.slot_flags & SLOT_POCKET) ) + return 1 + return 0 + if(slot_s_store) + if(I.flags & NODROP) + return 0 + if(H.s_store) + return 0 + if(!H.wear_suit) + if(!disable_warning) + H << "You need a suit before you can attach this [I.name]." + return 0 + if(!H.wear_suit.allowed) + if(!disable_warning) + H << "You somehow have a suit with no defined allowed items for suit storage, stop that." + return 0 + if(I.w_class > 4) + if(!disable_warning) + H << "The [I.name] is too big to attach." //should be src? + return 0 + if( istype(I, /obj/item/device/pda) || istype(I, /obj/item/weapon/pen) || is_type_in_list(I, H.wear_suit.allowed) ) + return 1 + return 0 + if(slot_handcuffed) + if(H.handcuffed) + return 0 + if(!istype(I, /obj/item/weapon/handcuffs)) + return 0 + return 1 + if(slot_legcuffed) + if(H.legcuffed) + return 0 + if(!istype(I, /obj/item/weapon/legcuffs)) + return 0 + return 1 + if(slot_in_backpack) + if (H.back && istype(H.back, /obj/item/weapon/storage/backpack)) + var/obj/item/weapon/storage/backpack/B = H.back + if(B.contents.len < B.storage_slots && I.w_class <= B.max_w_class) + return 1 + return 0 + return 0 //Unsupported slot + + proc/before_equip_job(var/datum/job/J, var/mob/living/carbon/human/H) + return + + proc/after_equip_job(var/datum/job/J, var/mob/living/carbon/human/H) + return + + proc/handle_chemicals(var/datum/reagent/chem, var/mob/living/carbon/human/H) + return 0 + + proc/handle_speech(var/message, var/mob/living/carbon/human/H) + return message + + //////// + //LIFE// + //////// + + proc/handle_chemicals_in_body(var/mob/living/carbon/human/H) + if(H.reagents) H.reagents.metabolize(H) + + //The fucking FAT mutation is the dumbest shit ever. It makes the code so difficult to work with + if(FAT in H.mutations) + if(H.overeatduration < 100) + H << "You feel fit again!" + H.mutations -= FAT + H.update_inv_w_uniform(0) + H.update_inv_wear_suit() + else + if(H.overeatduration > 500) + H << "You suddenly feel blubbery!" + H.mutations |= FAT + H.update_inv_w_uniform(0) + H.update_inv_wear_suit() + + // nutrition decrease + if (H.nutrition > 0 && H.stat != 2) + H.nutrition = max (0, H.nutrition - HUNGER_FACTOR) + + if (H.nutrition > 450) + if(H.overeatduration < 600) //capped so people don't take forever to unfat + H.overeatduration++ + else + if(H.overeatduration > 1) + H.overeatduration -= 2 //doubled the unfat rate + + if (H.drowsyness) + H.drowsyness-- + H.eye_blurry = max(2, H.eye_blurry) + if (prob(5)) + H.sleeping += 1 + H.Paralyse(5) + + H.confused = max(0, H.confused - 1) + // decrement dizziness counter, clamped to 0 + if(H.resting) + H.dizziness = max(0, H.dizziness - 15) + H.jitteriness = max(0, H.jitteriness - 15) + else + H.dizziness = max(0, H.dizziness - 3) + H.jitteriness = max(0, H.jitteriness - 3) + + H.updatehealth() + + return + + proc/handle_vision(var/mob/living/carbon/human/H) + if( H.stat == DEAD ) + H.sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) + H.see_in_dark = 8 + if(!H.druggy) H.see_invisible = SEE_INVISIBLE_LEVEL_TWO + else + H.sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS) + var/see_temp = H.see_invisible + H.see_invisible = invis_sight + H.see_in_dark = darksight + + if(XRAY in H.mutations) + H.sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS + H.see_in_dark = 8 + H.see_invisible = SEE_INVISIBLE_LEVEL_TWO + + if(H.seer) + H.see_invisible = SEE_INVISIBLE_OBSERVER + + if(H.mind && H.mind.changeling) + H.hud_used.lingchemdisplay.invisibility = 0 + H.hud_used.lingchemdisplay.maptext = "
[H.mind.changeling.chem_charges]
" + else + H.hud_used.lingchemdisplay.invisibility = 101 + + if(istype(H.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)) + var/obj/item/clothing/mask/gas/voice/space_ninja/O = H.wear_mask + switch(O.mode) + if(0) + var/target_list[] = list() + for(var/mob/living/target in oview(H)) + if( target.mind&&(target.mind.special_role||issilicon(target)) )//They need to have a mind. + target_list += target + if(target_list.len)//Everything else is handled by the ninja mask proc. + O.assess_targets(target_list, H) + H.see_invisible = SEE_INVISIBLE_LIVING + if(1) + H.see_in_dark = 5 + H.see_invisible = SEE_INVISIBLE_LIVING + if(2) + H.sight |= SEE_MOBS + H.see_invisible = SEE_INVISIBLE_LEVEL_TWO + if(3) + H.sight |= SEE_TURFS + H.see_invisible = SEE_INVISIBLE_LIVING + + if(H.glasses) + if(istype(H.glasses, /obj/item/clothing/glasses)) + var/obj/item/clothing/glasses/G = H.glasses + H.sight |= G.vision_flags + H.see_in_dark = G.darkness_view + H.see_invisible = G.invis_view + if(G.hud) + G.process_hud(H) + + if(H.druggy) //Override for druggy + H.see_invisible = see_temp + + if(H.see_override) //Override all + H.see_invisible = H.see_override + + // This checks how much the mob's eyewear impairs their vision + if(H.tinttotal >= TINT_IMPAIR) + if(tinted_weldhelh) + if(H.tinttotal >= TINT_BLIND) + H.blinded = 1 // You get the sudden urge to learn to play keyboard + H.client.screen += global_hud.darkMask + else + H.client.screen += global_hud.darkMask + + if(H.blind) + if(H.blinded) H.blind.layer = 18 + else H.blind.layer = 0 + + if( H.disabilities & NEARSIGHTED && !istype(H.glasses, /obj/item/clothing/glasses/regular) ) + H.client.screen += global_hud.vimpaired + if(H.eye_blurry) H.client.screen += global_hud.blurry + if(H.druggy) H.client.screen += global_hud.druggy + + + if(H.eye_stat > 20) + if(H.eye_stat > 30) H.client.screen += global_hud.darkMask + else H.client.screen += global_hud.vimpaired + + return 1 + + proc/handle_hud_icons(var/mob/living/carbon/human/H) + if(H.healths) + if(H.stat == DEAD) + H.healths.icon_state = "health7" + else + switch(H.hal_screwyhud) + if(1) H.healths.icon_state = "health6" + if(2) H.healths.icon_state = "health7" + else + switch(H.health - H.staminaloss) + if(100 to INFINITY) H.healths.icon_state = "health0" + if(80 to 100) H.healths.icon_state = "health1" + if(60 to 80) H.healths.icon_state = "health2" + if(40 to 60) H.healths.icon_state = "health3" + if(20 to 40) H.healths.icon_state = "health4" + if(0 to 20) H.healths.icon_state = "health5" + else H.healths.icon_state = "health6" + + if(H.nutrition_icon) + switch(H.nutrition) + if(450 to INFINITY) H.nutrition_icon.icon_state = "nutrition0" + if(350 to 450) H.nutrition_icon.icon_state = "nutrition1" + if(250 to 350) H.nutrition_icon.icon_state = "nutrition2" + if(150 to 250) H.nutrition_icon.icon_state = "nutrition3" + else H.nutrition_icon.icon_state = "nutrition4" + + if(H.pressure) + H.pressure.icon_state = "pressure[H.pressure_alert]" + + if(H.pullin) + if(H.pulling) H.pullin.icon_state = "pull" + else H.pullin.icon_state = "pull0" +// if(rest) //Not used with new UI +// if(resting || lying || sleeping) rest.icon_state = "rest1" +// else rest.icon_state = "rest0" + if(H.toxin) + if(H.hal_screwyhud == 4 || H.toxins_alert) H.toxin.icon_state = "tox1" + else H.toxin.icon_state = "tox0" + if(H.oxygen) + if(H.hal_screwyhud == 3 || H.oxygen_alert) H.oxygen.icon_state = "oxy1" + else H.oxygen.icon_state = "oxy0" + if(H.fire) + if(H.fire_alert) H.fire.icon_state = "fire[H.fire_alert]" //fire_alert is either 0 if no alert, 1 for cold and 2 for heat. + else H.fire.icon_state = "fire0" + + if(H.bodytemp) + if(!(HEATRES in specflags)) + switch(H.bodytemperature) //310.055 optimal body temp + if(370 to INFINITY) H.bodytemp.icon_state = "temp4" + if(350 to 370) H.bodytemp.icon_state = "temp3" + if(335 to 350) H.bodytemp.icon_state = "temp2" + switch(H.bodytemperature) + if(320 to 335) H.bodytemp.icon_state = "temp1" + if(300 to 320) H.bodytemp.icon_state = "temp0" + if(295 to 300) H.bodytemp.icon_state = "temp-1" + if(!(COLDRES in specflags)) + switch(H.bodytemperature) + if(280 to 295) H.bodytemp.icon_state = "temp-2" + if(260 to 280) H.bodytemp.icon_state = "temp-3" + if(-INFINITY to 260) H.bodytemp.icon_state = "temp-4" + + return 1 + + proc/handle_mutations_and_radiation(var/mob/living/carbon/human/H) + if(H.getFireLoss()) + if((COLD_RESISTANCE in H.mutations) || (prob(1))) + H.heal_organ_damage(0,1) + + if ((HULK in H.mutations) && H.health <= 25) + H.mutations.Remove(HULK) + H.update_mutations() //update our mutation overlays + H << "You suddenly feel very weak." + H.Weaken(3) + H.emote("collapse") + + if (H.radiation && !(RADIMMUNE in specflags)) + if (H.radiation > 100) + H.radiation = 100 + H.Weaken(10) + H << "You feel weak." + H.emote("collapse") + + if (H.radiation < 0) + H.radiation = 0 + + else + switch(H.radiation) + if(1 to 49) + H.radiation-- + if(prob(25)) + H.adjustToxLoss(1) + H.updatehealth() + + if(50 to 74) + H.radiation -= 2 + H.adjustToxLoss(1) + if(prob(5)) + H.radiation -= 5 + H.Weaken(3) + H << "You feel weak." + H.emote("collapse") + if(prob(15)) + if(!( H.hair_style == "Shaved") || !(H.hair_style == "Bald") || HAIR in specflags) + H << "Your hair starts to fall out in clumps..." + spawn(50) + H.facial_hair_style = "Shaved" + H.hair_style = "Bald" + H.update_hair() + H.updatehealth() + + if(75 to 100) + H.radiation -= 3 + H.adjustToxLoss(3) + if(prob(1)) + H << "You mutate!" + randmutb(H) + domutcheck(H,null) + H.emote("gasp") + H.updatehealth() + + //////////////// + // MOVE SPEED // + //////////////// + + proc/movement_delay(var/mob/living/carbon/human/H) + var/mspeed = 0 + + if(!has_gravity(H)) + return -1 //It's hard to be slowed down in space by... anything + else if(H.status_flags & GOTTAGOFAST) + return -1 + + mspeed = 0 + var/health_deficiency = (100 - H.health + H.staminaloss) + if(health_deficiency >= 40) + mspeed += (health_deficiency / 25) + + var/hungry = (500 - H.nutrition) / 5 //So overeat would be 100 and default level would be 80 + if(hungry >= 70) + mspeed += hungry / 50 + + if(H.wear_suit) + mspeed += H.wear_suit.slowdown + if(H.shoes) + mspeed += H.shoes.slowdown + if(H.back) + mspeed += H.back.slowdown + + if(FAT in H.mutations) + mspeed += 1.5 + if(H.bodytemperature < 283.222) + mspeed += (283.222 - H.bodytemperature) / 10 * 1.75 + + mspeed += speedmod + + return mspeed + + ////////////////// + // ATTACK PROCS // + ////////////////// + + proc/spec_attack_hand(var/mob/living/carbon/human/M, var/mob/living/carbon/human/H) + if((M != H) && H.check_shields(0, M.name)) + add_logs(M, H, "attempted to touch") + H.visible_message("[M] attempted to touch [H]!") + return 0 + + switch(M.a_intent) + if("help") + if(H.health >= 0) + H.help_shake_act(M) + if(H != M) + add_logs(M, H, "shaked") + return 1 + + //CPR + if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH))) + M << "Remove your mask!" + return 0 + if((H.head && (H.head.flags & HEADCOVERSMOUTH)) || (H.wear_mask && (H.wear_mask.flags & MASKCOVERSMOUTH))) + M << "Remove their mask!" + return 0 + + if(H.cpr_time < world.time + 30) + add_logs(H, M, "CPRed") + H.visible_message("[M] is trying to perform CPR on [H]!") + if(!do_mob(M, H)) + return 0 + if((H.health >= -99 && H.health <= 0)) + H.cpr_time = world.time + var/suff = min(H.getOxyLoss(), 7) + H.adjustOxyLoss(-suff) + H.updatehealth() + M.visible_message("[M] performs CPR on [H]!") + H << "You feel a breath of fresh air enter your lungs. It feels good." + + if("grab") + if(M == H || H.anchored) + return 0 + + add_logs(M, H, "grabbed", addition="passively") + + if(H.w_uniform) + H.w_uniform.add_fingerprint(M) + + var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, H) + if(H.buckled) + M << "You cannot grab [H], \he is buckled in!" + if(!G) //the grab will delete itself in New if affecting is anchored + return + M.put_in_active_hand(G) + G.synch() + H.LAssailant = M + + playsound(H.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + H.visible_message("[M] has grabbed [H] passively!") + return 1 + + if("harm") + add_logs(M, H, "punched") + + var/atk_verb = "punch" + if(H.lying) + atk_verb = "kick" + else if(M.dna) + atk_verb = M.dna.species.attack_verb + + var/damage = rand(0, 9) + damage += punchmod + + if(!damage) + if(M.dna) + playsound(H.loc, M.dna.species.miss_sound, 25, 1, -1) + else + playsound(H.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + + H.visible_message("[M] has attempted to [atk_verb] [H]!") + return 0 + + + var/obj/item/organ/limb/affecting = H.get_organ(ran_zone(M.zone_sel.selecting)) + var/armor_block = H.run_armor_check(affecting, "melee") + + if(HULK in M.mutations) + damage += 5 + + if(M.dna) + playsound(H.loc, M.dna.species.attack_sound, 25, 1, -1) + else + playsound(H.loc, 'sound/weapons/punch1.ogg', 25, 1, -1) + + + H.visible_message("[M] has [atk_verb]ed [H]!", \ + "[M] has [atk_verb]ed [H]!") + + H.apply_damage(damage, BRUTE, affecting, armor_block) + if((H.stat != DEAD) && damage >= 9) + H.visible_message("[M] has weakened [H]!", \ + "[M] has weakened [H]!") + H.apply_effect(4, WEAKEN, armor_block) + H.forcesay(hit_appends) + else if(H.lying) + H.forcesay(hit_appends) + + if("disarm") + add_logs(M, H, "disarmed") + + if(H.w_uniform) + H.w_uniform.add_fingerprint(M) + var/obj/item/organ/limb/affecting = H.get_organ(ran_zone(M.zone_sel.selecting)) + var/randn = rand(1, 100) + if(randn <= 25) + H.apply_effect(2, WEAKEN, H.run_armor_check(affecting, "melee")) + playsound(H, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + H.visible_message("[M] has pushed [H]!", + "[M] has pushed [H]!") + H.forcesay(hit_appends) + return + + var/talked = 0 // BubbleWrap + + if(randn <= 60) + //BubbleWrap: Disarming breaks a pull + if(H.pulling) + H.visible_message("[M] has broken [H]'s grip on [H.pulling]!") + talked = 1 + H.stop_pulling() + + //BubbleWrap: Disarming also breaks a grab - this will also stop someone being choked, won't it? + if(istype(H.l_hand, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/lgrab = H.l_hand + if(lgrab.affecting) + H.visible_message("[M] has broken [H]'s grip on [lgrab.affecting]!") + talked = 1 + spawn(1) + qdel(lgrab) + if(istype(H.r_hand, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/rgrab = H.r_hand + if(rgrab.affecting) + H.visible_message("[M] has broken [H]'s grip on [rgrab.affecting]!") + talked = 1 + spawn(1) + qdel(rgrab) + //End BubbleWrap + + if(!talked) //BubbleWrap + if(H.drop_item()) + H.visible_message("[M] has disarmed [H]!", \ + "[M] has disarmed [H]!") + playsound(H, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + return + + + playsound(H, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + H.visible_message("[M] attempted to disarm [H]!", \ + "[M] attemped to disarm [H]!") + return + + proc/spec_attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone, var/obj/item/organ/limb/affecting, var/hit_area, var/intent, var/obj/item/organ/limb/target_limb, target_area, var/mob/living/carbon/human/H) + // Allows you to put in item-specific reactions based on species + if((user != H) && H.check_shields(I.force, "the [I.name]")) + return 0 + + if(I.attack_verb && I.attack_verb.len) + H.visible_message("[H] has been [pick(I.attack_verb)] in the [hit_area] with [I] by [user]!", \ + "[H] has been [pick(I.attack_verb)] in the [hit_area] with [I] by [user]!") + else if(I.force) + H.visible_message("[H] has been attacked in the [hit_area] with [I] by [user]!", \ + "[H] has been attacked in the [hit_area] with [I] by [user]!") + else + return 0 + + var/armor = H.run_armor_check(affecting, "melee", "Your armour has protected your [hit_area].", "Your armour has softened a hit to your [hit_area].") + if(armor >= 100) return 0 + var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords) + + apply_damage(I.force, I.damtype, affecting, armor, H) + + var/bloody = 0 + if(((I.damtype == BRUTE) && prob(25 + (I.force * 2)))) + if(affecting.status == ORGAN_ORGANIC) + I.add_blood(H) //Make the weapon bloody, not the person. + if(prob(I.force * 2)) //blood spatter! + bloody = 1 + var/turf/location = H.loc + if(istype(location, /turf/simulated)) + location.add_blood(H) + if(get_dist(H, H) <= 1) //people with TK won't get smeared with blood + if(H.wear_suit) + H.wear_suit.add_blood(H) + H.update_inv_wear_suit(0) //updates mob overlays to show the new blood (no refresh) + else if(H.w_uniform) + H.w_uniform.add_blood(H) + H.update_inv_w_uniform(0) //updates mob overlays to show the new blood (no refresh) + if (H.gloves) + var/obj/item/clothing/gloves/G = H.gloves + G.add_blood(H) + else + H.add_blood(H) + H.update_inv_gloves() //updates on-mob overlays for bloody hands and/or bloody gloves + + + switch(hit_area) + if("head") //Harder to score a stun but if you do it lasts a bit longer + if(H.stat == CONSCIOUS && prob(I.force) && armor < 50) + H.visible_message("[H] has been knocked unconscious!", \ + "[H] has been knocked unconscious!") + H.apply_effect(20, PARALYZE, armor) + if(H != user && I.damtype == BRUTE) + ticker.mode.remove_revolutionary(H.mind) + + if(bloody) //Apply blood + if(H.wear_mask) + H.wear_mask.add_blood(H) + H.update_inv_wear_mask(0) + if(H.head) + H.head.add_blood(H) + H.update_inv_head(0) + if(H.glasses && prob(33)) + H.glasses.add_blood(H) + H.update_inv_glasses(0) + + if("chest") //Easier to score a stun but lasts less time + if(H.stat == CONSCIOUS && prob(I.force + 10)) + H.visible_message("[H] has been knocked down!", \ + "[H] has been knocked down!") + H.apply_effect(5, WEAKEN, armor) + + if(bloody) + if(H.wear_suit) + H.wear_suit.add_blood(H) + H.update_inv_wear_suit(0) + if(H.w_uniform) + H.w_uniform.add_blood(H) + H.update_inv_w_uniform(0) + + if(Iforce > 10 || Iforce >= 5 && prob(33)) + H.forcesay(hit_appends) //forcesay checks stat already. + return + + proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone, var/mob/living/carbon/human/H) + H.apply_damage(I.force, I.damtype) + if(I.damtype == "brute") + if(prob(33) && I.force && !(NOBLOOD in specflags)) + var/turf/location = H.loc + if(istype(location, /turf/simulated)) + location.add_blood_floor(H) + + var/showname = "." + if(user) + showname = " by [user]!" + if(!(user in viewers(I, null))) + showname = "." + + if(I.attack_verb && I.attack_verb.len) + H.visible_message("[H] has been [pick(I.attack_verb)] with [I][showname]", + "[H] has been [pick(I.attack_verb)] with [I][showname]") + else if(I.force) + H.visible_message("[H] has been attacked with [I][showname]", + "[H] has been attacked with [I][showname]") + if(!showname && user) + if(user.client) + user << "You attack [H] with [I]. " + + return + + proc/apply_damage(var/damage, var/damagetype = BRUTE, var/def_zone = null, var/blocked, var/mob/living/carbon/human/H) + blocked = (100-(blocked+armor))/100 + if(blocked <= 0) return 0 + + var/obj/item/organ/limb/organ = null + if(isorgan(def_zone)) + organ = def_zone + else + if(!def_zone) def_zone = ran_zone(def_zone) + organ = H.get_organ(check_zone(def_zone)) + if(!organ) return 0 + + damage = (damage * blocked) + + switch(damagetype) + if(BRUTE) + H.damageoverlaytemp = 20 + if(organ.take_damage(damage*brutemod, 0)) + H.update_damage_overlays(0) + if(BURN) + H.damageoverlaytemp = 20 + if(organ.take_damage(0, damage*burnmod)) + H.update_damage_overlays(0) + if(TOX) + H.adjustToxLoss(damage * blocked) + if(OXY) + H.adjustOxyLoss(damage * blocked) + if(CLONE) + H.adjustCloneLoss(damage * blocked) + if(STAMINA) + H.adjustStaminaLoss(damage * blocked) + + proc/on_hit(var/obj/item/projectile/proj_type, var/mob/living/carbon/human/H) + // called when hit by a projectile + switch(proj_type) + if(/obj/item/projectile/energy/floramut) // overwritten by plants/pods + H.show_message("The radiation beam dissipates harmlessly through your body.") + if(/obj/item/projectile/energy/florayield) + H.show_message("The radiation beam dissipates harmlessly through your body.") + return + + ///////////// + //BREATHING// + ///////////// + + proc/breathe(var/mob/living/carbon/human/H) + if(H.reagents.has_reagent("lexorin")) return + if(istype(H.loc, /obj/machinery/atmospherics/unary/cryo_cell)) return + + var/datum/gas_mixture/environment = H.loc.return_air() + var/datum/gas_mixture/breath + // HACK NEED CHANGING LATER + if(H.health <= config.health_threshold_crit) + H.losebreath++ + + if(H.losebreath>0) //Suffocating so do not take a breath + H.losebreath-- + if (prob(10)) //Gasp per 10 ticks? Sounds about right. + spawn H.emote("gasp") + if(istype(H.loc, /obj/)) + var/obj/location_as_object = H.loc + location_as_object.handle_internal_lifeform(H, 0) + else + //First, check for air from internal atmosphere (using an air tank and mask generally) + breath = H.get_breath_from_internal(BREATH_VOLUME) // Super hacky -- TLE + //breath = get_breath_from_internal(0.5) // Manually setting to old BREATH_VOLUME amount -- TLE + + //No breath from internal atmosphere so get breath from location + if(!breath) + if(isobj(H.loc)) + var/obj/location_as_object = H.loc + breath = location_as_object.handle_internal_lifeform(H, BREATH_VOLUME) + else if(isturf(H.loc)) + var/breath_moles = 0 + /*if(environment.return_pressure() > ONE_ATMOSPHERE) + // Loads of air around (pressure effect will be handled elsewhere), so lets just take a enough to fill our lungs at normal atmos pressure (using n = Pv/RT) + breath_moles = (ONE_ATMOSPHERE*BREATH_VOLUME/R_IDEAL_GAS_EQUATION*environment.temperature) + else*/ + // Not enough air around, take a percentage of what's there to model this properly + breath_moles = environment.total_moles()*BREATH_PERCENTAGE + + breath = H.loc.remove_air(breath_moles) + // Handle chem smoke effect -- Doohl + var/block = 0 + if(H.wear_mask) + if(H.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT) + block = 1 + if(H.glasses) + if(H.glasses.flags & BLOCK_GAS_SMOKE_EFFECT) + block = 1 + if(H.head) + if(H.head.flags & BLOCK_GAS_SMOKE_EFFECT) + block = 1 + + if(!block) + + for(var/obj/effect/effect/chem_smoke/smoke in view(1, H)) + if(smoke.reagents.total_volume) + smoke.reagents.reaction(H, INGEST) + spawn(5) + if(smoke) + smoke.reagents.copy_to(H, 10) // I dunno, maybe the reagents enter the blood stream through the lungs? + break // If they breathe in the nasty stuff once, no need to continue checking + + else //Still give containing object the chance to interact + if(istype(H.loc, /obj/)) + var/obj/location_as_object = H.loc + location_as_object.handle_internal_lifeform(H, 0) + + handle_breath(breath, H) + + if(breath) + H.loc.assume_air(breath) + + proc/handle_breath(datum/gas_mixture/breath, var/mob/living/carbon/human/H) + if((H.status_flags & GODMODE)) + return + + if(!breath || (breath.total_moles() == 0) || H.suiciding) + if(H.reagents.has_reagent("inaprovaline")) + return + if(H.suiciding) + H.adjustOxyLoss(2)//If you are suiciding, you should die a little bit faster + H.failed_last_breath = 1 + H.oxygen_alert = max(H.oxygen_alert, 1) + return 0 + if(H.health >= config.health_threshold_crit) + if(NOBREATH in specflags) return 1 + H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) + H.failed_last_breath = 1 + else + H.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) + H.failed_last_breath = 1 + + H.oxygen_alert = max(H.oxygen_alert, 1) + + return 0 + + var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa + //var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now) + var/safe_co2_max = 10 // Yes it's an arbitrary value who cares? + var/safe_toxins_max = 0.005 + var/SA_para_min = 1 + var/SA_sleep_min = 5 + var/oxygen_used = 0 + var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME + + //Partial pressure of the O2 in our breath + var/O2_pp = (breath.oxygen/breath.total_moles())*breath_pressure + // Same, but for the toxins + var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure + // And CO2, lets say a PP of more than 10 will be bad (It's a little less really, but eh, being passed out all round aint no fun) + var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*breath_pressure // Tweaking to fit the hacky bullshit I've done with atmo -- TLE + //var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*0.5 // The default pressure value + + if(O2_pp < safe_oxygen_min) // Too little oxygen + if(!(NOBREATH in specflags) || (H.health <= config.health_threshold_crit)) + if(prob(20)) + spawn(0) H.emote("gasp") + if(O2_pp > 0) + var/ratio = safe_oxygen_min/O2_pp + H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!) + H.failed_last_breath = 1 + oxygen_used = breath.oxygen*ratio/6 + else + H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) + H.failed_last_breath = 1 + H.oxygen_alert = max(H.oxygen_alert, 1) + /*else if (O2_pp > safe_oxygen_max) // Too much oxygen (commented this out for now, I'll deal with pressure damage elsewhere I suppose) + spawn(0) emote("cough") + var/ratio = O2_pp/safe_oxygen_max + oxyloss += 5*ratio + oxygen_used = breath.oxygen*ratio/6 + oxygen_alert = max(oxygen_alert, 1)*/ + else // We're in safe limits + H.failed_last_breath = 0 + H.adjustOxyLoss(-5) + oxygen_used = breath.oxygen/6 + H.oxygen_alert = 0 + + breath.oxygen -= oxygen_used + breath.carbon_dioxide += oxygen_used + + //CO2 does not affect failed_last_breath. So if there was enough oxygen in the air but too much co2, this will hurt you, but only once per 4 ticks, instead of once per tick. + if(CO2_pp > safe_co2_max && !(NOBREATH in specflags)) + if(!H.co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so. + H.co2overloadtime = world.time + else if(world.time - H.co2overloadtime > 120) + H.Paralyse(3) + H.adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business + if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! + H.adjustOxyLoss(8) + if(prob(20)) // Lets give them some chance to know somethings not right though I guess. + spawn(0) H.emote("cough") + + else + H.co2overloadtime = 0 + + if(Toxins_pp > safe_toxins_max && !(NOBREATH in specflags)) // Too much toxins + var/ratio = (breath.toxins/safe_toxins_max) * 10 + //adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second + if(H.reagents) + H.reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) + H.toxins_alert = max(H.toxins_alert, 1) + else + H.toxins_alert = 0 + + if(breath.trace_gases.len && !(NOBREATH in specflags)) // If there's some other shit in the air lets deal with it here. + for(var/datum/gas/sleeping_agent/SA in breath.trace_gases) + var/SA_pp = (SA.moles/breath.total_moles())*breath_pressure + if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit + H.Paralyse(3) // 3 gives them one second to wake up and run away a bit! + if(SA_pp > SA_sleep_min) // Enough to make us sleep as well + H.sleeping = max(H.sleeping+2, 10) + else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning + if(prob(20)) + spawn(0) H.emote(pick("giggle", "laugh")) + + handle_temperature(breath) + + return 1 + + proc/handle_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H) // called by human/life, handles temperatures + if( (abs(310.15 - breath.temperature) > 50) && !(COLD_RESISTANCE in H.mutations) && !(COLDRES in specflags)) // Hot air hurts :( + if(breath.temperature < 260.15) + if(prob(20)) + H << "You feel your face freezing and an icicle forming in your lungs!" + else if(breath.temperature > 360.15 && !(HEATRES in specflags)) + if(prob(20)) + H << "You feel your face burning and a searing heat in your lungs!" + + if(!(COLDRES in specflags)) // COLD DAMAGE + switch(breath.temperature) + if(-INFINITY to 120) + H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head") + H.fire_alert = max(H.fire_alert, 1) + if(120 to 200) + H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head") + H.fire_alert = max(H.fire_alert, 1) + if(200 to 260) + H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head") + H.fire_alert = max(H.fire_alert, 1) + + if(!(HEATRES in specflags)) // HEAT DAMAGE + switch(breath.temperature) + if(360 to 400) + H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head") + H.fire_alert = max(H.fire_alert, 2) + if(400 to 1000) + H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head") + H.fire_alert = max(H.fire_alert, 2) + if(1000 to INFINITY) + H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head") + H.fire_alert = max(H.fire_alert, 2) + + return + + proc/handle_environment(datum/gas_mixture/environment, var/mob/living/carbon/human/H) + if(!environment) + return + + var/loc_temp = H.get_temperature(environment) + //world << "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Thermal protection: [get_thermal_protection()] - Fire protection: [thermal_protection + add_fire_protection(loc_temp)] - Heat capacity: [environment_heat_capacity] - Location: [loc] - src: [src]" + + //Body temperature is adjusted in two steps. Firstly your body tries to stabilize itself a bit. + if(H.stat != 2) + H.stabilize_temperature_from_calories() + + //After then, it reacts to the surrounding atmosphere based on your thermal protection + if(!H.on_fire) //If you're on fire, you do not heat up or cool down based on surrounding gases + if(loc_temp < H.bodytemperature) + //Place is colder than we are + var/thermal_protection = H.get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. + if(thermal_protection < 1) + H.bodytemperature += min((1-thermal_protection) * ((loc_temp - H.bodytemperature) / BODYTEMP_COLD_DIVISOR), BODYTEMP_COOLING_MAX) + else + //Place is hotter than we are + var/thermal_protection = H.get_heat_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. + if(thermal_protection < 1) + H.bodytemperature += min((1-thermal_protection) * ((loc_temp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR), BODYTEMP_HEATING_MAX) + + // +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt. + if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !(HEATRES in specflags)) + //Body temperature is too hot. + H.fire_alert = max(H.fire_alert, 1) + switch(H.bodytemperature) + if(360 to 400) + H.apply_damage(HEAT_DAMAGE_LEVEL_1*heatmod, BURN) + H.fire_alert = max(H.fire_alert, 2) + if(400 to 460) + H.apply_damage(HEAT_DAMAGE_LEVEL_2*heatmod, BURN) + H.fire_alert = max(H.fire_alert, 2) + if(460 to INFINITY) + if(H.on_fire) + H.apply_damage(HEAT_DAMAGE_LEVEL_3*heatmod, BURN) + H.fire_alert = max(H.fire_alert, 2) + else + H.apply_damage(HEAT_DAMAGE_LEVEL_2*heatmod, BURN) + H.fire_alert = max(H.fire_alert, 2) + + else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !(COLDRES in specflags)) + H.fire_alert = max(H.fire_alert, 1) + if(!istype(H.loc, /obj/machinery/atmospherics/unary/cryo_cell)) + switch(H.bodytemperature) + if(200 to 260) + H.apply_damage(COLD_DAMAGE_LEVEL_1*coldmod, BURN) + H.fire_alert = max(H.fire_alert, 1) + if(120 to 200) + H.apply_damage(COLD_DAMAGE_LEVEL_2*coldmod, BURN) + H.fire_alert = max(H.fire_alert, 1) + if(-INFINITY to 120) + H.apply_damage(COLD_DAMAGE_LEVEL_3*coldmod, BURN) + H.fire_alert = max(H.fire_alert, 1) + + // Account for massive pressure differences. Done by Polymorph + // Made it possible to actually have something that can protect against high pressure... Done by Errorage. Polymorph now has an axe sticking from his head for his previous hardcoded nonsense! + + var/pressure = environment.return_pressure() + var/adjusted_pressure = H.calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob. + switch(adjusted_pressure) + if(HAZARD_HIGH_PRESSURE to INFINITY) + if(!(HEATRES in specflags)) + H.adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) ) + H.pressure_alert = 2 + else + H.pressure_alert = 1 + if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) + H.pressure_alert = 1 + if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE) + H.pressure_alert = 0 + if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) + H.pressure_alert = -1 + else + if((COLD_RESISTANCE in H.mutations) || (COLDRES in specflags)) + H.pressure_alert = -1 + else + H.adjustBruteLoss( LOW_PRESSURE_DAMAGE ) + H.pressure_alert = -2 + + return + + ////////// + // FIRE // + ////////// + + proc/handle_fire(var/mob/living/carbon/human/H) + if((HEATRES in specflags) || (NOFIRE in specflags)) + return + if(H.fire_stacks < 0) + H.fire_stacks++ //If we've doused ourselves in water to avoid fire, dry off slowly + H.fire_stacks = min(0, H.fire_stacks)//So we dry ourselves back to default, nonflammable. + if(!H.on_fire) + return + var/datum/gas_mixture/G = H.loc.return_air() // Check if we're standing in an oxygenless environment + if(G.oxygen < 1) + ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire + return + var/turf/location = get_turf(H) + location.hotspot_expose(700, 50, 1) + + proc/IgniteMob(var/mob/living/carbon/human/H) + if(H.fire_stacks > 0 && !H.on_fire && !(HEATRES in specflags) && !(NOFIRE in specflags)) + H.on_fire = 1 + H.AddLuminosity(3) + H.update_fire() + + proc/ExtinguishMob(var/mob/living/carbon/human/H) + if(H.on_fire) + H.on_fire = 0 + H.fire_stacks = 0 + H.AddLuminosity(-3) + H.update_fire() + +#undef SPECIES_LAYER +#undef BODY_LAYER +#undef HAIR_LAYER + +#undef HUMAN_MAX_OXYLOSS +#undef HUMAN_CRIT_MAX_OXYLOSS + +#undef HEAT_DAMAGE_LEVEL_1 +#undef HEAT_DAMAGE_LEVEL_2 +#undef HEAT_DAMAGE_LEVEL_3 + +#undef COLD_DAMAGE_LEVEL_1 +#undef COLD_DAMAGE_LEVEL_2 +#undef COLD_DAMAGE_LEVEL_3 + +#undef HEAT_GAS_DAMAGE_LEVEL_1 +#undef HEAT_GAS_DAMAGE_LEVEL_2 +#undef HEAT_GAS_DAMAGE_LEVEL_3 + +#undef COLD_GAS_DAMAGE_LEVEL_1 +#undef COLD_GAS_DAMAGE_LEVEL_2 +#undef COLD_GAS_DAMAGE_LEVEL_3 + +#undef TINT_IMPAIR +#undef TINT_BLIND \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm new file mode 100644 index 00000000000..7d159238fc5 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -0,0 +1,221 @@ +/* + HUMANS +*/ + +/datum/species/human + name = "Human" + id = "human" + roundstart = 1 + specflags = list(EYECOLOR,HAIR,FACEHAIR,LIPS) + use_skintones = 1 + +/datum/species/human/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) + if(chem.id == "mutationtoxin") + H << "Your flesh rapidly mutates!" + H.dna.species = new /datum/species/slime() + H.regenerate_icons() + H.reagents.del_reagent(chem.type) + return 1 + +/* + LIZARDPEOPLE +*/ + +/datum/species/lizard + // Reptilian humanoids with scaled skin and tails. + name = "Lizardperson" + id = "lizard" + say_mod = "hisses" + default_color = "00FF00" + roundstart = 1 + specflags = list(MUTCOLORS,EYECOLOR,LIPS) + attack_verb = "slash" + attack_sound = 'sound/weapons/slash.ogg' + miss_sound = 'sound/weapons/slashmiss.ogg' + +/datum/species/lizard/handle_speech(message) + // jesus christ why + if(copytext(message, 1, 2) != "*") + message = replacetext(message, "s", stutter("ss")) + + return message + +/* + PLANTPEOPLE +*/ + +/datum/species/plant + // Creatures made of leaves and plant matter. + name = "Plant" + id = "plant" + default_color = "59CE00" + specflags = list(MUTCOLORS,EYECOLOR) + attack_verb = "slice" + attack_sound = 'sound/weapons/slice.ogg' + miss_sound = 'sound/weapons/slashmiss.ogg' + burnmod = 1.25 + heatmod = 1.5 + +/datum/species/plant/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) + if(chem.id == "plantbgone") + H.adjustToxLoss(3) + H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) + return 1 + +/datum/species/plant/on_hit(proj_type, mob/living/carbon/human/H) + switch(proj_type) + if(/obj/item/projectile/energy/floramut) + if(prob(15)) + H.apply_effect((rand(30,80)),IRRADIATE) + H.Weaken(5) + for (var/mob/V in viewers(H)) + V.show_message("[H] writhes in pain as \his vacuoles boil.", 3, "You hear the crunching of leaves.", 2) + if(prob(80)) + randmutb(H) + domutcheck(H,null) + else + randmutg(H) + domutcheck(H,null) + else + H.adjustFireLoss(rand(5,15)) + H.show_message("The radiation beam singes you!") + if(/obj/item/projectile/energy/florayield) + H.nutrition = min(H.nutrition+30, 500) + return + +/* + PODPEOPLE +*/ + +/datum/species/plant/pod + // A mutation caused by a human being ressurected in a revival pod. These regain health in light, and begin to wither in darkness. + name = "Podperson" + id = "pod" + +/datum/species/plant/pod/spec_life(mob/living/carbon/human/H) + var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing + if(isturf(H.loc)) //else, there's considered to be no light + var/turf/T = H.loc + var/area/A = T.loc + if(A) + if(A.lighting_use_dynamic) light_amount = min(10,T.lighting_lumcount) - 5 + else light_amount = 5 + H.nutrition += light_amount + if(H.nutrition > 500) + H.nutrition = 500 + if(light_amount > 2) //if there's enough light, heal + H.heal_overall_damage(1,1) + H.adjustToxLoss(-1) + H.adjustOxyLoss(-1) + + if(H.nutrition < 200) + H.take_overall_damage(2,0) + +/* + SHADOWPEOPLE +*/ + +/datum/species/shadow + // Humans cursed to stay in the darkness, lest their life forces drain. They regain health in shadow and die in light. + name = "???" + id = "shadow" + darksight = 8 + sexes = 0 + ignored_by = list(/mob/living/simple_animal/hostile/faithless) + +/datum/species/shadow/spec_life(mob/living/carbon/human/H) + var/light_amount = 0 + if(isturf(H.loc)) + var/turf/T = H.loc + var/area/A = T.loc + if(A) + if(A.lighting_use_dynamic) light_amount = T.lighting_lumcount + else light_amount = 10 + if(light_amount > 2) //if there's enough light, start dying + H.take_overall_damage(1,1) + else if (light_amount < 2) //heal in the dark + H.heal_overall_damage(1,1) + +/* + SLIMEPEOPLE +*/ + +/datum/species/slime + // Humans mutated by slime mutagen, produced from green slimes. They are not targetted by slimes. + name = "Slimeperson" + id = "slime" + default_color = "00FFFF" + darksight = 3 + invis_sight = SEE_INVISIBLE_LEVEL_ONE + specflags = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR) + hair_color = "mutcolor" + hair_alpha = 150 + ignored_by = list(/mob/living/carbon/slime) + +/* + JELLYPEOPLE +*/ + +/datum/species/jelly + // Entirely alien beings that seem to be made entirely out of gel. They have three eyes and a skeleton visible within them. + name = "Xenobiological Jelly Entity" + id = "jelly" + default_color = "00FF90" + say_mod = "chirps" + eyes = "jelleyes" + specflags = list(MUTCOLORS,EYECOLOR) + +/* + GOLEMS +*/ + +/datum/species/golem + // Animated beings of stone. They have increased defenses, and do not need to breathe. They're also slow as fuuuck. + name = "Golem" + id = "golem" + specflags = list(NOBREATH,HEATRES,COLDRES,NOGUNS,NOBLOOD,RADIMMUNE) + speedmod = 3 + armor = 55 + punchmod = 5 + no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_head, slot_w_uniform) + nojumpsuit = 1 + +/* + ADAMANTINE GOLEMS +*/ + +/datum/species/golem/adamantine + name = "Adamantine Golem" + id = "adamantine" + +/* + FLIES +*/ + +/datum/species/fly + // Humans turned into fly-like abominations in teleporter accidents. + name = "Human?" + id = "fly" + say_mod = "buzzes" + +/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) + if(chem.id == "pestkiller") + H.adjustToxLoss(3) + H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) + return 1 + +/datum/species/fly/handle_speech(message) + if(copytext(message, 1, 2) != "*") + message = replacetext(message, "z", stutter("zz")) + + return message + +/* + SKELETONS +*/ + +/datum/species/skeleton + // 2spooky + name = "Spooky Scary Skeleton" + id = "skeleton" + sexes = 0 \ No newline at end of file diff --git a/sound/machines/airlockforced.ogg b/sound/machines/airlockforced.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8f46a89fe3202b2c04ce11d30a6829876838c021 GIT binary patch literal 16204 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 XVF?PtovKnk{IriDQ$d6LN$r0D?V@a) literal 0 HcmV?d00001 From ddb9955e53a881b06f47d68d335285be44d1cec8 Mon Sep 17 00:00:00 2001 From: AstralSerpent Date: Wed, 2 Jul 2014 09:27:06 +1000 Subject: [PATCH 07/41] Removed an unused suicide_act proc belonging to the scalpel. --- code/modules/surgery/tools.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index d8db9381aaa..841e96959e7 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -50,12 +50,6 @@ origin_tech = "materials=1;biotech=1" attack_verb = list("drilled") -/obj/item/weapon/scalpel/suicide_act(mob/user) - user.visible_message(pick("[user] is pressing [src] to \his temple and activating it! It looks like \he's trying to commit suicide.", \ - "[user] is pressing [src] to \his chest and activating it! It looks like \he's trying to commit suicide.")) - return (BRUTELOSS) - - /obj/item/weapon/scalpel name = "scalpel" desc = "Cut, cut, and once more cut." From b1588200438a02a6c73daa36a418cade6828169e Mon Sep 17 00:00:00 2001 From: Menshin Date: Wed, 2 Jul 2014 19:01:11 +0200 Subject: [PATCH 08/41] Fix merging powernet on turf sometimes not connecting machines. --- code/modules/power/cable.dm | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 7e416681d5a..3c13c5709eb 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -321,10 +321,14 @@ obj/structure/cable/proc/avail() // merge with the powernets of power objects in the source turf /obj/structure/cable/proc/mergeConnectedNetworksOnTurf() + var/list/to_connect = list() + if(!powernet) //if we somehow have no powernet, make one (should not happen for cables) var/datum/powernet/newPN = new() newPN.add_cable(src) + //first let's add turf cables to our powernet + //then we'll connect machines on turf with a node cable is present for(var/AM in loc) if(istype(AM,/obj/structure/cable)) var/obj/structure/cable/C = AM @@ -338,20 +342,24 @@ obj/structure/cable/proc/avail() else if(istype(AM,/obj/machinery/power/apc)) var/obj/machinery/power/apc/N = AM if(!N.terminal) continue // APC are connected through their terminal - if(N.terminal.powernet) - merge_powernets(powernet, N.terminal.powernet) - else - if(!N.terminal.connect_to_network()) - N.terminal.disconnect_from_network() + + if(N.terminal.powernet == powernet) + continue + + to_connect += N.terminal //we'll connect the machines after all cables are merged else if(istype(AM,/obj/machinery/power)) //other power machines var/obj/machinery/power/M = AM - if(M.powernet == powernet) continue - if(M.powernet) - merge_powernets(powernet, M.powernet) - else - if(!M.connect_to_network()) - M.disconnect_from_network() + + if(M.powernet == powernet) + continue + + to_connect += M //we'll connect the machines after all cables are merged + + //now that cables are done, let's connect found machines + for(var/obj/machinery/power/PM in to_connect) + if(!PM.connect_to_network()) + PM.disconnect_from_network() //if we somehow can't connect the machine to the new powernet, remove it from the old nonetheless ////////////////////////////////////////////// // Powernets handling helpers From e65919da427e1bbcf552a98fba97ac924b2a07aa Mon Sep 17 00:00:00 2001 From: Menshin Date: Wed, 2 Jul 2014 23:58:12 +0200 Subject: [PATCH 09/41] Removed the now unused directwired variable --- code/game/machinery/shieldgen.dm | 1 - code/modules/power/port_gen.dm | 2 -- code/modules/power/power.dm | 1 - code/modules/power/singularity/collector.dm | 1 - code/modules/power/singularity/emitter.dm | 3 --- code/modules/power/terminal.dm | 1 - code/modules/power/turbine.dm | 1 - 7 files changed, 10 deletions(-) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 796f8dcc729..cb0b9879972 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -313,7 +313,6 @@ var/recalc = 0 var/locked = 1 var/destroyed = 0 - var/directwired = 1 // var/maxshieldload = 200 var/obj/structure/cable/attached // the attached cable var/storedpower = 0 diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 92db2f7aaf8..b417f0121e4 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -9,7 +9,6 @@ icon_state = "off" density = 1 anchored = 0 - directwired = 0 var/t_status = 0 var/t_per = 5000 var/filter = 1 @@ -48,7 +47,6 @@ display round(lastgen) and plasmatank amount icon_state = "portgen0" density = 1 anchored = 0 - directwired = 0 use_power = 0 var/active = 0 diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 48f66f0191b..237ef975aef 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -11,7 +11,6 @@ icon = 'icons/obj/power.dmi' anchored = 1.0 var/datum/powernet/powernet = null - var/directwired = 1 // TODEL use_power = 0 idle_power_usage = 0 active_power_usage = 0 diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 2d3ceab2d87..c2b41f5bb03 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -8,7 +8,6 @@ var/global/list/rad_collectors = list() icon_state = "ca" anchored = 0 density = 1 - directwired = 1 req_access = list(access_engine_equip) // use_power = 0 var/obj/item/weapon/tank/plasma/P = null diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index e571a4bbf9b..c65bb2434a4 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -37,7 +37,6 @@ ..() if(state == 2 && anchored) connect_to_network() - src.directwired = 1 /obj/machinery/power/emitter/Destroy() if(ticker && ticker.current_state == GAME_STATE_PLAYING) @@ -185,7 +184,6 @@ state = 2 user << "You weld the [src] to the floor." connect_to_network() - src.directwired = 1 else user << "\red You need more welding fuel to complete this task." if(2) @@ -199,7 +197,6 @@ state = 1 user << "You cut the [src] free from the floor." disconnect_from_network() - src.directwired = 0 else user << "\red You need more welding fuel to complete this task." return diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index c87d48e8ad3..a0d6eb1084d 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -11,7 +11,6 @@ layer = TURF_LAYER var/obj/machinery/power/master = null anchored = 1 - directwired = 0 // must have a cable on same turf connecting to terminal layer = 2.6 // a bit above wires diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 78f9dc86020..dacc6cbe8c6 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -49,7 +49,6 @@ density = 1 var/opened = 0 var/obj/machinery/power/compressor/compressor - directwired = 1 var/turf/simulated/outturf var/lastgen var/productivity = 1 From 61200625b51750221d58ed8ea0f900899a59bf1b Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Thu, 3 Jul 2014 03:11:06 -0300 Subject: [PATCH 10/41] Fixes the runtimes clogging the logs, handle_temperature() will now use the human on their params. --- code/modules/mob/living/carbon/human/species.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 97143b147b1..572d5c258c5 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1148,7 +1148,7 @@ if(prob(20)) spawn(0) H.emote(pick("giggle", "laugh")) - handle_temperature(breath) + handle_temperature(breath, H) return 1 From d8ae776f647127a9f2d6998049fd623f18a383cd Mon Sep 17 00:00:00 2001 From: Kelenius Date: Thu, 3 Jul 2014 18:52:11 +0400 Subject: [PATCH 11/41] Gives the AI a hud --- code/_onclick/ai.dm | 2 + code/_onclick/hud/_defines.dm | 17 +++ code/_onclick/hud/ai.dm | 135 ++++++++++++++++++ code/_onclick/hud/other_mobs.dm | 3 - code/_onclick/hud/screen_objects.dm | 72 ++++++++++ code/game/machinery/camera/tracking.dm | 7 - code/game/objects/items/devices/PDA/PDA.dm | 8 +- code/modules/mob/living/silicon/ai/ai.dm | 33 +---- .../mob/living/silicon/ai/freelook/eye.dm | 8 -- code/modules/mob/living/silicon/ai/say.dm | 7 +- code/modules/mob/transform_procs.dm | 5 - code/modules/paperwork/photography.dm | 15 -- icons/mob/screen_ai.dmi | Bin 0 -> 5982 bytes tgstation.dme | 1 + 14 files changed, 233 insertions(+), 80 deletions(-) create mode 100644 code/_onclick/hud/ai.dm create mode 100644 icons/mob/screen_ai.dmi diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index c90a8c19dbb..b9d763fd883 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -10,6 +10,8 @@ Note that AI have no need for the adjacency proc, and so this proc is a lot cleaner. */ /mob/living/silicon/ai/DblClickOn(var/atom/A, params) + if (istype(A, /obj/screen)) + return if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked build_click(src, client.buildmode, params, A) return diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 342eeba8d36..5b8174a9650 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -89,6 +89,23 @@ #define ui_alien_health "EAST-1:28,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator. #define ui_alienplasmadisplay "EAST-1:28,CENTER-2:15" +// AI + +#define ui_ai_core "SOUTH:6,WEST:16" +#define ui_ai_camera_list "SOUTH:6,WEST+1:16" +#define ui_ai_track_with_camera "SOUTH:6,WEST+2:16" +#define ui_ai_camera_light "SOUTH:6,WEST+3:16" +#define ui_ai_crew_monitor "SOUTH:6,WEST+4:16" +#define ui_ai_crew_manifest "SOUTH:6,WEST+5:16" +#define ui_ai_alerts "SOUTH:6,WEST+6:16" +#define ui_ai_announcement "SOUTH:6,WEST+7:16" +#define ui_ai_shuttle "SOUTH:6,WEST+8:16" +#define ui_ai_state_laws "SOUTH:6,WEST+9:16" +#define ui_ai_pda_send "SOUTH:6,WEST+10:16" +#define ui_ai_pda_log "SOUTH:6,WEST+11:16" +#define ui_ai_take_picture "SOUTH:6,WEST+12:16" +#define ui_ai_view_images "SOUTH:6,WEST+13:16" + //Pop-up inventory #define ui_shoes "WEST+1:8,SOUTH:5" diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm new file mode 100644 index 00000000000..9f254878373 --- /dev/null +++ b/code/_onclick/hud/ai.dm @@ -0,0 +1,135 @@ +/datum/hud/proc/ai_hud() + adding = list() + other = list() + + var/obj/screen/using + +//AI core + using = new /obj/screen() + using.name = "AI Core" + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "ai_core" + using.screen_loc = ui_ai_core + using.layer = 20 + adding += using + +//Camera list + using = new /obj/screen() + using.name = "Show Camera List" + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "camera" + using.screen_loc = ui_ai_camera_list + using.layer = 20 + adding += using + +//Track + using = new /obj/screen() + using.name = "Track With Camera" + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "track" + using.screen_loc = ui_ai_track_with_camera + using.layer = 20 + adding += using + +//Camera light + using = new /obj/screen() + using.name = "Toggle Camera Light" + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "camera_light" + using.screen_loc = ui_ai_camera_light + using.layer = 20 + adding += using + +//Crew Monitorting + using = new /obj/screen() + using.name = "Crew Monitorting" + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "crew_monitor" + using.screen_loc = ui_ai_crew_monitor + using.layer = 20 + adding += using + +//Crew Manifest + using = new /obj/screen() + using.name = "Show Crew Manifest" + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "manifest" + using.screen_loc = ui_ai_crew_manifest + using.layer = 20 + adding += using + +//Alerts + using = new /obj/screen() + using.name = "Show Alerts" + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "alerts" + using.screen_loc = ui_ai_alerts + using.layer = 20 + adding += using + +//Announcement + using = new /obj/screen() + using.name = "Announcement" + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "announcement" + using.screen_loc = ui_ai_announcement + using.layer = 20 + adding += using + +//Shuttle + using = new /obj/screen() + using.name = "Call Emergency Shuttle" + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "call_shuttle" + using.screen_loc = ui_ai_shuttle + using.layer = 20 + adding += using + +//Laws + using = new /obj/screen() + using.name = "State Laws" + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "state_laws" + using.screen_loc = ui_ai_state_laws + using.layer = 20 + adding += using + +//PDA message + using = new /obj/screen() + using.name = "PDA - Send Message" + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "pda_send" + using.screen_loc = ui_ai_pda_send + using.layer = 20 + adding += using + +//PDA log + using = new /obj/screen() + using.name = "PDA - Show Message Log" + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "pda_receive" + using.screen_loc = ui_ai_pda_log + using.layer = 20 + adding += using + +//Take image + using = new /obj/screen() + using.name = "Take Image" + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "take_picture" + using.screen_loc = ui_ai_take_picture + using.layer = 20 + adding += using + +//View images + using = new /obj/screen() + using.name = "View Images" + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "view_images" + using.screen_loc = ui_ai_view_images + using.layer = 20 + adding += using + + mymob.client.screen += adding + other + + return \ No newline at end of file diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index e1ccf1732a6..c9a188d0c80 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -13,9 +13,6 @@ mymob.blind.screen_loc = "CENTER-7,CENTER-7" mymob.blind.layer = 0 -/datum/hud/proc/ai_hud() - return - /datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen_midnight.dmi') blobpwrdisplay = new /obj/screen() diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 42e54d75b39..58b96c7492e 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -290,6 +290,78 @@ if(istype(usr, /mob/living/silicon/robot)) usr:toggle_module(3) + if("AI Core") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.view_core() + + if("Show Camera List") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + var/camera = input(AI) in AI.get_camera_list() + AI.ai_camera_list(camera) + + if("Track With Camera") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + var/target_name = input(AI) in AI.trackable_mobs() + AI.ai_camera_track(target_name) + + if("Toggle Camera Light") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.toggle_camera_light() + + if("Crew Monitorting") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + crewmonitor(AI) + + if("Show Crew Manifest") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.ai_roster() + + if("Show Alerts") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.ai_alerts() + + if("Announcement") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.announcement() + + if("Call Emergency Shuttle") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.ai_call_shuttle() + + if("State Laws") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.checklaws() + + if("PDA - Send Message") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.cmd_send_pdamesg() + + if("PDA - Show Message Log") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.cmd_show_message_log() + + if("Take Image") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.aicamera.toggle_camera_mode() + + if("View Images") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.aicamera.viewpictures() + else return 0 return 1 diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index f588e5146a3..3b99e47fd8e 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -22,9 +22,6 @@ /mob/living/silicon/ai/proc/ai_camera_list(var/camera in get_camera_list()) - set category = "AI Commands" - set name = "Show Camera List" - if(src.stat == 2) src << "You can't list the cameras because you are dead!" return @@ -101,10 +98,6 @@ return targets /mob/living/silicon/ai/proc/ai_camera_track(var/target_name in trackable_mobs()) - set category = "AI Commands" - set name = "Track With Camera" - set desc = "Select who you would like to track." - if(src.stat == 2) src << "You can't track with camera because you are dead!" return diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 7694275849a..0d14455d3ce 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -972,9 +972,7 @@ var/global/list/obj/item/device/pda/PDAs = list() //AI verb and proc for sending PDA messages. -/mob/living/silicon/ai/verb/cmd_send_pdamesg() - set category = "AI Commands" - set name = "PDA - Send Message" +/mob/living/silicon/ai/proc/cmd_send_pdamesg() var/list/names = list() var/list/plist = list() var/list/namecounts = list() @@ -1037,9 +1035,7 @@ var/global/list/obj/item/device/pda/PDAs = list() else usr << "You do not have a PDA. You should make an issue report about this." -/mob/living/silicon/ai/verb/cmd_show_message_log() - set category = "AI Commands" - set name = "PDA - Show Message Log" +/mob/living/silicon/ai/proc/cmd_show_message_log() if(usr.stat == 2) usr << "You can't do that because you are dead!" return diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index f32dba73748..3eedd00b97c 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -90,8 +90,7 @@ var/list/ai_list = list() aicamera = new/obj/item/device/camera/ai_camera(src) if (istype(loc, /turf)) - verbs.Add(/mob/living/silicon/ai/proc/ai_call_shuttle,/mob/living/silicon/ai/proc/ai_camera_track, \ - /mob/living/silicon/ai/proc/ai_camera_list, /mob/living/silicon/ai/proc/ai_network_change, \ + verbs.Add(/mob/living/silicon/ai/proc/ai_network_change, \ /mob/living/silicon/ai/proc/ai_statuschange, /mob/living/silicon/ai/proc/ai_hologram_change, \ /mob/living/silicon/ai/proc/toggle_camera_light) @@ -182,9 +181,6 @@ var/list/ai_list = list() stat(null, text("Systems nonfunctional")) /mob/living/silicon/ai/proc/ai_alerts() - set category = "AI Commands" - set name = "Show Alerts" - var/dat = "Current Station Alerts\n" dat += "Close

" for (var/cat in alarms) @@ -218,8 +214,6 @@ var/list/ai_list = list() src << browse(dat, "window=aialerts&can_close=0") /mob/living/silicon/ai/proc/ai_roster() - set category = "AI Commands" - set name = "Show Crew Manifest" var/dat = "Crew RosterCrew Roster:

" for(var/datum/data/record/t in sortRecord(data_core.general)) @@ -229,13 +223,7 @@ var/list/ai_list = list() src << browse(dat, "window=airoster") onclose(src, "airoster") -/mob/living/silicon/ai/verb/ai_crew() - set category = "AI Commands" - set name = "Crew Monitoring Console" - crewmonitor(src) /mob/living/silicon/ai/proc/ai_call_shuttle() - set category = "AI Commands" - set name = "Call Emergency Shuttle" if(src.stat == 2) src << "You can't call the shuttle because you are dead!" return @@ -515,14 +503,6 @@ var/list/ai_list = list() if (viewalerts) ai_alerts() return !cleared -/mob/living/silicon/ai/cancel_camera() - set category = "AI Commands" - set name = "Cancel Camera View" - - //src.cameraFollow = null - src.view_core() - - //Replaces /mob/living/silicon/ai/verb/change_network() in ai.dm & camera.dm //Adds in /mob/living/silicon/ai/proc/ai_network_change() instead //Addition by Mord_Sith to define AI's network change ability @@ -650,9 +630,8 @@ var/list/ai_list = list() //Toggles the luminosity and applies it by re-entereing the camera. /mob/living/silicon/ai/proc/toggle_camera_light() - set name = "Toggle Camera Light" - set desc = "Toggles the light on the camera the AI is looking through." - set category = "AI Commands" + if(stat != CONSCIOUS) + return camera_light_on = !camera_light_on src << "Camera lights [camera_light_on ? "activated" : "deactivated"]." @@ -687,9 +666,3 @@ var/list/ai_list = list() src.current = camera src.current.SetLuminosity(AI_CAMERA_LUMINOSITY) camera_light_on = world.timeofday + 1 * 20 // Update the light every 2 seconds. - -/mob/living/silicon/ai/verb/outputlaws() - set category = "AI Commands" - set name = "State Laws" - - checklaws() diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index d1eb8e21c19..27d2b28b41a 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -92,14 +92,6 @@ // Return to the Core. - -/mob/living/silicon/ai/verb/core() - set category = "AI Commands" - set name = "AI Core" - - view_core() - - /mob/living/silicon/ai/proc/view_core() current = null diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index c3e8db720c1..d6906b3e2d2 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -63,12 +63,7 @@ var/const/VOX_DELAY = 600 popup.open() -/mob/living/silicon/ai/verb/announcement() - - set name = "Announcement" - set desc = "Create a vocal announcement by typing in the available words to create a sentence." - set category = "AI Commands" - +/mob/living/silicon/ai/proc/announcement() if(announcing_vox > world.time) src << "Please wait [round((announcing_vox - world.time) / 10)] seconds." return diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 087480c786c..3e7d015eafc 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -247,13 +247,8 @@ O.show_laws() O << "These laws may be changed by other players, or by you being the traitor." - O.verbs += /mob/living/silicon/ai/proc/ai_call_shuttle O.verbs += /mob/living/silicon/ai/proc/show_laws_verb - O.verbs += /mob/living/silicon/ai/proc/ai_camera_track - O.verbs += /mob/living/silicon/ai/proc/ai_alerts - O.verbs += /mob/living/silicon/ai/proc/ai_camera_list O.verbs += /mob/living/silicon/ai/proc/ai_statuschange - O.verbs += /mob/living/silicon/ai/proc/ai_roster O.job = "AI" diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 939c5328de5..c593cc727ad 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -113,21 +113,6 @@ name = "AI photo camera" var/in_camera_mode = 0 - verb/picture() - set category ="AI Commands" - set name = "Take Image" - set src in usr - - toggle_camera_mode() - - verb/viewpicture() - set category ="AI Commands" - set name = "View Images" - set src in usr - - viewpictures() - - /obj/item/device/camera/attack(mob/living/carbon/human/M, mob/user) return diff --git a/icons/mob/screen_ai.dmi b/icons/mob/screen_ai.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d0c18c20e53e2ca4443f665491781e61ec27c195 GIT binary patch literal 5982 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 literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 86fb4497c89..722352492d4 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -68,6 +68,7 @@ #include "code\_onclick\overmind.dm" #include "code\_onclick\telekinesis.dm" #include "code\_onclick\hud\_defines.dm" +#include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\alien.dm" #include "code\_onclick\hud\alien_larva.dm" #include "code\_onclick\hud\hud.dm" From 09f2699f425bc5451f54ef2a4ac85219b8a3b658 Mon Sep 17 00:00:00 2001 From: Kelenius Date: Thu, 3 Jul 2014 19:33:46 +0400 Subject: [PATCH 12/41] Two fixes Double click made non-snowflake, cancel camera exploit patched --- code/_onclick/ai.dm | 2 -- code/modules/mob/living/silicon/ai/ai.dm | 3 +++ code/modules/mob/living/silicon/ai/freelook/eye.dm | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index b9d763fd883..c90a8c19dbb 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -10,8 +10,6 @@ Note that AI have no need for the adjacency proc, and so this proc is a lot cleaner. */ /mob/living/silicon/ai/DblClickOn(var/atom/A, params) - if (istype(A, /obj/screen)) - return if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked build_click(src, client.buildmode, params, A) return diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 3eedd00b97c..77fcdf35b63 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -246,6 +246,9 @@ var/list/ai_list = list() return +/mob/living/silicon/ai/cancel_camera() + src.view_core() + /mob/living/silicon/ai/verb/toggle_anchor() set category = "AI Commands" set name = "Toggle Floor Bolts" diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 27d2b28b41a..0373da59133 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -61,7 +61,8 @@ var/mob/living/silicon/ai/AI = usr if(AI.eyeobj && AI.client.eye == AI.eyeobj) AI.cameraFollow = null - AI.eyeobj.setLoc(src) + if (src.loc) + AI.eyeobj.setLoc(src) // This will move the AIEye. It will also cause lights near the eye to light up, if toggled. // This is handled in the proc below this one. From ec3d8164a8fe4373e008cd68f72128eae7eb1228 Mon Sep 17 00:00:00 2001 From: Kelenius Date: Thu, 3 Jul 2014 20:30:29 +0400 Subject: [PATCH 13/41] Now uses isturf --- code/modules/mob/living/silicon/ai/freelook/eye.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 0373da59133..a80d6a54271 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -61,7 +61,7 @@ var/mob/living/silicon/ai/AI = usr if(AI.eyeobj && AI.client.eye == AI.eyeobj) AI.cameraFollow = null - if (src.loc) + if (isturf(src.loc) || isturf(src)) AI.eyeobj.setLoc(src) // This will move the AIEye. It will also cause lights near the eye to light up, if toggled. From 5c03b51879ba74be3f407ccf90bafc01bb5a9df9 Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Fri, 4 Jul 2014 04:46:32 -0300 Subject: [PATCH 14/41] Office/rolling chairs will now work properly when carrying mobs, those will not slip out of the chair, becoming an ungrabless mobs. And the direction of the chair and mob will be better and easier to notice when they bump something. Their direction changes will work even better if mob movement code finally removes all the spawn() calls. I'm not planning of adding any special code for that here. --- .../structures/stool_bed_chair_nest/chairs.dm | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 381e14b33bd..9053517eb9a 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -8,7 +8,7 @@ src.verbs -= /atom/movable/verb/pull ..() spawn(3) //sorry. i don't think there's a better way to do this. - handle_rotation() + handle_layer() return /obj/structure/stool/bed/chair/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -33,22 +33,27 @@ rotate() return -/obj/structure/stool/bed/chair/proc/handle_rotation() //making this into a seperate proc so office chairs can call it on Move() - if(src.dir == NORTH) +/obj/structure/stool/bed/chair/proc/handle_rotation(direction) //making this into a seperate proc so office chairs can call it on Move() + if(buckled_mob) + buckled_mob.buckled = null //Temporary, so Move() succeeds. + if(!buckled_mob.Move(direction)) + buckled_mob.buckled = src + dir = buckled_mob.dir + return 0 + buckled_mob.buckled = src //Restoring + return 1 + +/obj/structure/stool/bed/chair/proc/handle_layer() + if(dir == NORTH) src.layer = FLY_LAYER else src.layer = OBJ_LAYER +/obj/structure/stool/bed/chair/proc/spin() + src.dir = turn(src.dir, 90) + handle_layer() if(buckled_mob) - if(buckled_mob.loc != src.loc) - buckled_mob.buckled = null //Temporary, so Move() succeeds. - if(!buckled_mob.Move(loc)) - unbuckle() - buckled_mob = null - else - buckled_mob.buckled = src //Restoring - if(buckled_mob) - buckled_mob.dir = dir + buckled_mob.dir = dir /obj/structure/stool/bed/chair/verb/rotate() set name = "Rotate Chair" @@ -56,18 +61,13 @@ set src in oview(1) if(config.ghost_interaction) - src.dir = turn(src.dir, 90) - handle_rotation() - return + spin() else if(!usr || !isturf(usr.loc)) return if(usr.stat || usr.restrained()) return - - src.dir = turn(src.dir, 90) - handle_rotation() - return + spin() /obj/structure/stool/bed/chair/MouseDrop_T(mob/M as mob, mob/user as mob) if(!istype(M)) return @@ -130,9 +130,10 @@ /obj/structure/stool/bed/chair/office anchored = 0 -/obj/structure/stool/bed/chair/office/Move() - ..() - handle_rotation() +/obj/structure/stool/bed/chair/office/Move(direction) + if(handle_rotation(direction)) + ..() + handle_layer() /obj/structure/stool/bed/chair/office/light icon_state = "officechair_white" From cdd91c27f67520cb0f515dcbcf23bbf2d268fccd Mon Sep 17 00:00:00 2001 From: AstralSerpent Date: Fri, 4 Jul 2014 21:34:34 +1000 Subject: [PATCH 15/41] Traitor code phrases/responses will be announced at round end. --- code/game/gamemodes/traitor/traitor.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 687b9490a46..c3273c5071c 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -250,7 +250,10 @@ text += "
" + text += "
The code phrases were: [syndicate_code_phrase]
\ + The code responses were: [syndicate_code_response]
" world << text + return 1 From 983ac3ed794215ada638de4169641c680ee0b2ab Mon Sep 17 00:00:00 2001 From: Firecage Date: Fri, 4 Jul 2014 16:27:54 +0200 Subject: [PATCH 16/41] Killer Tomatoes Signed-off-by: Firecage --- code/modules/hydroponics/grown.dm | 7 ++- .../tomato.dm => hostile/killertomato.dm} | 47 ++++++++++++------- code/modules/mob/transform_procs.dm | 2 - code/modules/projectiles/projectile/magic.dm | 6 +-- tgstation.dme | 2 +- 5 files changed, 41 insertions(+), 23 deletions(-) rename code/modules/mob/living/simple_animal/{friendly/tomato.dm => hostile/killertomato.dm} (51%) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 1e6e83fe576..bd5cf3784af 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -614,7 +614,12 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/killer/attack_self(mob/user as mob) if(istype(user.loc,/turf/space)) return - new /mob/living/simple_animal/tomato(user.loc) + var/mob/living/simple_animal/hostile/killertomato/K = new /mob/living/simple_animal/hostile/killertomato(user.loc) + K.maxHealth += round(endurance / 3) + K.melee_damage_lower += round(potency / 10) + K.melee_damage_upper += round(potency / 10) + K.move_to_delay -= round(production / 50) + K.health = K.maxHealth qdel(src) user << "You plant the killer-tomato." diff --git a/code/modules/mob/living/simple_animal/friendly/tomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm similarity index 51% rename from code/modules/mob/living/simple_animal/friendly/tomato.dm rename to code/modules/mob/living/simple_animal/hostile/killertomato.dm index 30e675e5a8e..7c9b63b063a 100644 --- a/code/modules/mob/living/simple_animal/friendly/tomato.dm +++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm @@ -1,16 +1,31 @@ -/mob/living/simple_animal/tomato - name = "tomato" - desc = "It's a horrifyingly enormous beef tomato, and it's packing extra beef!" - icon_state = "tomato" - icon_living = "tomato" - icon_dead = "tomato_dead" - speak_chance = 0 - turns_per_move = 5 - maxHealth = 15 - health = 15 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/tomatomeat - response_help = "prods" - response_disarm = "pushes aside" - response_harm = "smacks" - harm_intent_damage = 5 - ventcrawler = 2 +/mob/living/simple_animal/hostile/killertomato + name = "Killer Tomato" + desc = "It's a horrifyingly enormous beef tomato, and it's packing extra beef!" + icon_state = "tomato" + icon_living = "tomato" + icon_dead = "tomato_dead" + speak_chance = 0 + turns_per_move = 5 + maxHealth = 30 + health = 30 + see_in_dark = 3 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/tomatomeat + response_help = "prods" + response_disarm = "pushes aside" + response_harm = "smacks" + melee_damage_lower = 10 + melee_damage_upper = 15 + attacktext = "slams" + ventcrawler = 2 + faction = "plants" + + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + maxbodytemp = 1500 diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 0258e2f08a8..321e22389c7 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -497,8 +497,6 @@ return 1 if(ispath(MP, /mob/living/simple_animal/shade)) return 1 - if(ispath(MP, /mob/living/simple_animal/tomato)) - return 1 if(ispath(MP, /mob/living/simple_animal/mouse)) return 1 //It is impossible to pull up the player panel for mice (Fixed! - Nodrak) if(ispath(MP, /mob/living/simple_animal/hostile/bear)) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 2efdbab093b..9c22baa43a1 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -167,7 +167,7 @@ proc/wabbajack(mob/living/M) new_mob.universal_speak = 1*/ if("animal") if(prob(50)) - var/beast = pick("carp","bear","mushroom","statue", "bat", "goat") + var/beast = pick("carp","bear","mushroom","statue", "bat", "goat","killertomato") switch(beast) if("carp") new_mob = new /mob/living/simple_animal/hostile/carp(M.loc) if("bear") new_mob = new /mob/living/simple_animal/hostile/bear(M.loc) @@ -175,15 +175,15 @@ proc/wabbajack(mob/living/M) if("statue") new_mob = new /mob/living/simple_animal/hostile/statue(M.loc) if("bat") new_mob = new /mob/living/simple_animal/hostile/retaliate/bat(M.loc) if("goat") new_mob = new /mob/living/simple_animal/hostile/retaliate/goat(M.loc) + if("killertomato") new_mob = new /mob/living/simple_animal/hostile/killertomato(M.loc) else - var/animal = pick("parrot","corgi","crab","pug","cat","tomato","mouse","chicken","cow","lizard","chick") + var/animal = pick("parrot","corgi","crab","pug","cat","mouse","chicken","cow","lizard","chick") switch(animal) if("parrot") new_mob = new /mob/living/simple_animal/parrot(M.loc) if("corgi") new_mob = new /mob/living/simple_animal/corgi(M.loc) if("crab") new_mob = new /mob/living/simple_animal/crab(M.loc) if("pug") new_mob = new /mob/living/simple_animal/pug(M.loc) if("cat") new_mob = new /mob/living/simple_animal/cat(M.loc) - if("tomato") new_mob = new /mob/living/simple_animal/tomato(M.loc) if("mouse") new_mob = new /mob/living/simple_animal/mouse(M.loc) if("chicken") new_mob = new /mob/living/simple_animal/chicken(M.loc) if("cow") new_mob = new /mob/living/simple_animal/cow(M.loc) diff --git a/tgstation.dme b/tgstation.dme index 2fcb47404d3..f6771f41364 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1043,7 +1043,6 @@ #include "code\modules\mob\living\simple_animal\friendly\mouse.dm" #include "code\modules\mob\living\simple_animal\friendly\pug.dm" #include "code\modules\mob\living\simple_animal\friendly\slime.dm" -#include "code\modules\mob\living\simple_animal\friendly\tomato.dm" #include "code\modules\mob\living\simple_animal\hostile\alien.dm" #include "code\modules\mob\living\simple_animal\hostile\bear.dm" #include "code\modules\mob\living\simple_animal\hostile\carp.dm" @@ -1052,6 +1051,7 @@ #include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" #include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" +#include "code\modules\mob\living\simple_animal\hostile\killertomato.dm" #include "code\modules\mob\living\simple_animal\hostile\mimic.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs.dm" #include "code\modules\mob\living\simple_animal\hostile\mushroom.dm" From 559d83c36e7dfe0af01b941bd4f4bb02e97395d6 Mon Sep 17 00:00:00 2001 From: Firecage Date: Fri, 4 Jul 2014 16:56:33 +0200 Subject: [PATCH 17/41] Signed-off-by: Firecage --- .../mob/living/simple_animal/hostile/killertomato.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm index 7c9b63b063a..6b918e00ba5 100644 --- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm +++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm @@ -19,13 +19,13 @@ ventcrawler = 2 faction = "plants" - min_oxy = 0 + min_oxy = 5 max_oxy = 0 min_tox = 0 - max_tox = 0 + max_tox = 5 min_co2 = 0 max_co2 = 0 min_n2 = 0 max_n2 = 0 - minbodytemp = 0 - maxbodytemp = 1500 + minbodytemp = 150 + maxbodytemp = 500 From dead192e6102a6a7ace848645703142b954ebbcf Mon Sep 17 00:00:00 2001 From: ikarrus Date: Fri, 4 Jul 2014 09:08:22 -0600 Subject: [PATCH 18/41] Only mobs will be unanchored to avoid being destroyed by shuttles Other anchored objects, like windows, will remain. --- code/game/area/areas.dm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index a20826004ae..da00a0df84e 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -319,11 +319,14 @@ var/mob/living/living_mob = AM living_mob.Paralyse(10) living_mob.take_organ_damage(80) + living_mob.anchored = 0 //Unbuckle them so they can be moved //Anything not bolted down is moved, everything else is destroyed - AM.anchored = 0 - AM.Move(D) + if(!AM.anchored) + AM.Move(D) + else + qdel(AM) if(istype(T, /turf/simulated)) del(T) for(var/atom/movable/bug in src) // If someone (or something) is somehow still in the shuttle's docking area... - qdel(bug) + qdel(bug) From 92c70b8742eddaf0224006f565a403ad1c5818d8 Mon Sep 17 00:00:00 2001 From: Menshin Date: Fri, 4 Jul 2014 21:42:36 +0200 Subject: [PATCH 19/41] Delegated the panels and trackers control to Solar Control Computers instead of the Sun controller. --- code/datums/sun.dm | 52 +---------- code/modules/power/solar.dm | 170 ++++++++++++++++++++++++---------- code/modules/power/tracker.dm | 37 ++++---- 3 files changed, 144 insertions(+), 115 deletions(-) diff --git a/code/datums/sun.dm b/code/datums/sun.dm index 1748ea158e7..e1081a946ec 100644 --- a/code/datums/sun.dm +++ b/code/datums/sun.dm @@ -46,54 +46,12 @@ dx = s/abs(s) dy = c / abs(s) - - for(var/obj/machinery/power/M in solars_list) - - if(!M.powernet) - solars_list.Remove(M) + //now tell the solar control computers to update their status and linked devices + for(var/obj/machinery/power/solar_control/SC in solars_list) + if(!SC.powernet) + solars_list.Remove(SC) continue - - // Solar Tracker - if(istype(M, /obj/machinery/power/tracker)) - var/obj/machinery/power/tracker/T = M - T.set_angle(angle) - - // Solar Control - else if(istype(M, /obj/machinery/power/solar_control)) - var/obj/machinery/power/solar_control/C = M - if(C.track == 1) //if manual tracking... - C.tracker_update() //...update the position (not passing an angle, it is handled internally for manual tracking) - - // Solar Panel - else if(istype(M, /obj/machinery/power/solar)) - var/obj/machinery/power/solar/S = M - if(S.control) - occlusion(S) - - -// for a solar panel, trace towards sun to see if we're in shadow -/datum/sun/proc/occlusion(var/obj/machinery/power/solar/S) - - var/ax = S.x // start at the solar panel - var/ay = S.y - var/turf/T = null - - for(var/i = 1 to 20) // 20 steps is enough - ax += dx // do step - ay += dy - - T = locate( round(ax,0.5),round(ay,0.5),S.z) - - if(T.x == 1 || T.x==world.maxx || T.y==1 || T.y==world.maxy) // not obscured if we reach the edge - break - - if(T.density) // if we hit a solid turf, panel is obscured - S.obscured = 1 - return - - S.obscured = 0 // if hit the edge or stepped 20 times, not obscured - S.update_solar_exposure() - + SC.update() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 8b394c28d73..d246343d260 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -10,7 +10,6 @@ var/list/solars_list = list() icon_state = "sp_base" anchored = 1 density = 1 - directwired = 1 use_power = 0 idle_power_usage = 0 active_power_usage = 0 @@ -28,15 +27,22 @@ var/list/solars_list = list() Make(S) connect_to_network() -/obj/machinery/power/solar/disconnect_from_network() +/obj/machinery/power/solar/Destroy() + unset_control() //remove from control computer ..() - solars_list.Remove(src) -/obj/machinery/power/solar/connect_to_network() - var/to_return = ..() - if(powernet) //if connected and not already in solar_list... - solars_list |= src //... add it - return to_return +//set the control of the panel to a given computer if closer than SOLAR_MAX_DIST +/obj/machinery/power/solar/proc/set_control(var/obj/machinery/power/solar_control/SC) + if(SC && (get_dist(src, SC) > SOLAR_MAX_DIST)) + return 0 + control = SC + return 1 + +//set the control of the panel to null and removes it from the control list of the previous control computer if needed +/obj/machinery/power/solar/proc/unset_control() + if(control) + control.connected_panels.Remove(src) + control = null /obj/machinery/power/solar/proc/Make(var/obj/item/solar_assembly/S) if(!S) @@ -54,7 +60,7 @@ var/list/solars_list = list() if(istype(W, /obj/item/weapon/crowbar)) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - user << "You begin to take the glass off the solar panel..." + user.visible_message("[user] begins to take the glass off the solar panel.") if(do_after(user, 50)) var/obj/item/solar_assembly/S = locate() in src if(S) @@ -99,7 +105,7 @@ var/list/solars_list = list() src.dir = angle2dir(adir) return - +//calculates the fraction of the sunlight that the panel recieves /obj/machinery/power/solar/proc/update_solar_exposure() if(!sun) return @@ -123,17 +129,19 @@ var/list/solars_list = list() if(!sun || !control) //if there's no sun or the panel is not linked to a solar control computer, no need to proceed return - if(obscured) return - - var/sgen = SOLARGENRATE * sunfrac - add_avail(sgen) - if(powernet && control) - if(powernet.nodes[control]) + if(powernet) + if(powernet == control.powernet)//check if the panel is still connected to the computer + if(obscured) //get no light from the sun, so don't generate power + return + var/sgen = SOLARGENRATE * sunfrac + add_avail(sgen) control.gen += sgen - + else //if we're no longer on the same powernet, remove from control computer + unset_control() /obj/machinery/power/solar/proc/broken() stat |= BROKEN + unset_control() update_icon() return @@ -174,6 +182,29 @@ var/list/solars_list = list() . = PROCESS_KILL return +//trace towards sun to see if we're in shadow +/obj/machinery/power/solar/proc/occlusion() + + var/ax = x // start at the solar panel + var/ay = y + var/turf/T = null + + for(var/i = 1 to 20) // 20 steps is enough + ax += sun.dx // do step + ay += sun.dy + + T = locate( round(ax,0.5),round(ay,0.5),z) + + if(T.x == 1 || T.x==world.maxx || T.y==1 || T.y==world.maxy) // not obscured if we reach the edge + break + + if(T.density) // if we hit a solid turf, panel is obscured + obscured = 1 + return + + obscured = 0 // if hit the edge or stepped 20 times, not obscured + update_solar_exposure() + // // Solar Assembly - For construction of solar arrays. @@ -258,7 +289,6 @@ var/list/solars_list = list() icon_state = "solar" anchored = 1 density = 1 - directwired = 1 use_power = 1 idle_power_usage = 250 var/id = 0 @@ -269,6 +299,8 @@ var/list/solars_list = list() var/track = 0 // 0= off 1=timed 2=auto (tracker) var/trackrate = 600 // 300-900 seconds var/nexttime = 0 // time for a panel to rotate of 1° in manual tracking + var/obj/machinery/power/tracker/connected_tracker = null + var/list/connected_panels = list() /obj/machinery/power/solar_control/New() @@ -277,6 +309,13 @@ var/list/solars_list = list() initialize() connect_to_network() +/obj/machinery/power/solar_control/Destroy() + for(var/obj/machinery/power/solar/M in connected_panels) + M.unset_control() + if(connected_tracker) + connected_tracker.unset_control() + ..() + /obj/machinery/power/solar_control/disconnect_from_network() ..() solars_list.Remove(src) @@ -287,6 +326,39 @@ var/list/solars_list = list() solars_list |= src //... add it return to_return +//search for unconnected panels and trackers in the computer powernet and connect them +/obj/machinery/power/solar_control/proc/search_for_connected() + if(powernet) + for(var/obj/machinery/power/M in powernet.nodes) + if(istype(M, /obj/machinery/power/solar)) + var/obj/machinery/power/solar/S = M + if(!S.control) //i.e unconnected + S.set_control(src) + connected_panels |= S + else if(istype(M, /obj/machinery/power/tracker)) + if(!connected_tracker) //if there's already a tracker connected to the computer don't add another + var/obj/machinery/power/tracker/T = M + if(!T.control) //i.e unconnected + connected_tracker = T + T.set_control(src) + +//called by the sun controller, update the facing angle (either manually or via tracking) and rotates the panels accordingly +/obj/machinery/power/solar_control/proc/update() + if(stat & (NOPOWER | BROKEN)) + return + + switch(track) + if(1) + if(trackrate) //we're manual tracking. If we set a rotation speed... + cdir = targetdir //...the current direction is the targetted one (and rotates panels to it) + if(2) // auto-tracking + if(connected_tracker) + connected_tracker.set_angle(sun.angle) + + set_panels(cdir) + updateDialog() + + /obj/machinery/power/solar_control/initialize() ..() if(!powernet) return @@ -313,9 +385,9 @@ var/list/solars_list = list() /obj/machinery/power/solar_control/interact(mob/user) - var/t = "Generated power : [round(lastgen)] W
" - t += "Orientation: [rate_control(src,"cdir","[cdir]°",1,15)] ([angle2text(cdir)])
" - t += "Tracking:
" + var/t = "Generated power : [round(lastgen)] W
" + t += "Orientation: [rate_control(src,"cdir","[cdir]°",1,15)] ([angle2text(cdir)])
" + t += "Tracking:
" switch(track) if(0) t += "Off Timed Auto
" @@ -325,6 +397,13 @@ var/list/solars_list = list() t += "Off Timed Auto
" t += "Tracking Rate: [rate_control(src,"tdir","[trackrate] deg/h ([trackrate<0 ? "CCW" : "CW"])",1,30,180)]

" + + t += "Connected devices:
" + + t += "Search for devices
" + t += "Solar panels : [connected_panels.len] connected
" + t += "Solar tracker : [connected_tracker ? "Found" : "Not found"]

" + t += "Close" var/datum/browser/popup = new(user, "solar", name) @@ -371,6 +450,10 @@ var/list/solars_list = list() if(stat & (NOPOWER | BROKEN)) return + if(connected_tracker) //NOTE : handled here so that we don't add trackers to the processing list + if(connected_tracker.powernet != powernet) + connected_tracker.unset_control() + if(track==1 && trackrate) //manual tracking and set a rotation speed if(nexttime <= world.time) //every time we need to increase/decrease the angle by 1°... targetdir = (targetdir + trackrate/abs(trackrate) + 360) % 360 //... do it @@ -378,20 +461,6 @@ var/list/solars_list = list() src.updateDialog() - -// called by solar tracker when sun position changes -// or called by the sun controller for manual tracking updates -/obj/machinery/power/solar_control/proc/tracker_update(var/angle) - if(stat & (NOPOWER | BROKEN) || track == 0) - return - if (track == 2) // auto-tracking (called by tracker.dm /set_angle) - cdir = angle - else if (trackrate) //else we're manual tracking. If we set a rotation speed... - cdir = targetdir //...the current direction is the targetted one (and rotates panels to it) - set_panels(cdir) - src.updateDialog() - - /obj/machinery/power/solar_control/Topic(href, href_list) if(..()) usr << browse(null, "window=solcon") @@ -416,30 +485,31 @@ var/list/solars_list = list() if(href_list["track"]) track = text2num(href_list["track"]) - if(powernet && (track == 2)) - for(var/obj/machinery/power/tracker/T in powernet.nodes) - if(powernet.nodes[T]) - T.set_angle(sun.angle) - break + if(track == 2) + if(connected_tracker) + connected_tracker.set_angle(sun.angle) + set_panels(cdir) else if (track == 1) //begin manual tracking src.targetdir = src.cdir if(src.trackrate) nexttime = world.time + 36000/abs(trackrate) set_panels(targetdir) + if(href_list["search_connected"]) + src.search_for_connected() + if(connected_tracker && track == 2) + connected_tracker.set_angle(sun.angle) + src.set_panels(cdir) + src.updateUsrDialog() return - +//rotates the panel to the passed angle /obj/machinery/power/solar_control/proc/set_panels(var/cdir) - if(!powernet) return - for(var/obj/machinery/power/solar/S in powernet.nodes) - if(powernet.nodes[S]) - if(get_dist(S, src) < SOLAR_MAX_DIST) - if(!S.control) - S.control = src - S.adir = cdir //instantly rotates the panel - S.update_icon() //and - S.update_solar_exposure() //update it + + for(var/obj/machinery/power/solar/S in connected_panels) + S.adir = cdir //instantly rotates the panel + S.occlusion()//and + S.update_icon() //update it update_icon() diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index af79acaa808..20e8ab528c4 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -10,26 +10,33 @@ icon_state = "tracker" anchored = 1 density = 1 - directwired = 1 use_power = 0 var/id = 0 var/sun_angle = 0 // sun angle as set by sun datum + var/obj/machinery/power/solar_control/control = null /obj/machinery/power/tracker/New(var/turf/loc, var/obj/item/solar_assembly/S) ..(loc) Make(S) connect_to_network() -/obj/machinery/power/tracker/disconnect_from_network() +/obj/machinery/power/tracker/Destroy() + unset_control() //remove from control computer ..() - solars_list.Remove(src) -/obj/machinery/power/tracker/connect_to_network() - var/to_return = ..() - if(powernet) //if connected and not already in solar_list... - solars_list |= src //... add it - return to_return +//set the control of the tracker to a given computer if closer than SOLAR_MAX_DIST +/obj/machinery/power/tracker/proc/set_control(var/obj/machinery/power/solar_control/SC) + if(SC && (get_dist(src, SC) > SOLAR_MAX_DIST)) + return 0 + control = SC + return 1 + +//set the control of the tracker to null and removes it from the previous control computer if needed +/obj/machinery/power/tracker/proc/unset_control() + if(control) + control.connected_tracker = null + control = null /obj/machinery/power/tracker/proc/Make(var/obj/item/solar_assembly/S) if(!S) @@ -40,27 +47,21 @@ S.loc = src update_icon() -// called by datum/sun/calc_position() as sun's angle changes +//updates the tracker icon and the facing angle for the control computer /obj/machinery/power/tracker/proc/set_angle(var/angle) sun_angle = angle //set icon dir to show sun illumination dir = turn(NORTH, -angle - 22.5) // 22.5 deg bias ensures, e.g. 67.5-112.5 is EAST - // find all solar controls and update them - // currently, just update all controllers in world - // ***TODO: better communication system using network - if(powernet) - for(var/obj/machinery/power/solar_control/C in powernet.nodes) - if(powernet.nodes[C]) - if(get_dist(C, src) < SOLAR_MAX_DIST) - C.tracker_update(angle) + if(powernet && (powernet == control.powernet)) //update if we're still in the same powernet + control.cdir = angle /obj/machinery/power/tracker/attackby(var/obj/item/weapon/W, var/mob/user) if(istype(W, /obj/item/weapon/crowbar)) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - user << "You begin to take the glass off the solar tracker..." + user.visible_message("[user] begins to take the glass off the solar tracker.") if(do_after(user, 50)) var/obj/item/solar_assembly/S = locate() in src if(S) From 2c0ac7bfd884fc85ee810a81e855bc9c45e1ec29 Mon Sep 17 00:00:00 2001 From: Firecage Date: Sat, 5 Jul 2014 15:56:29 +0200 Subject: [PATCH 20/41] Updoots --- code/modules/mob/living/simple_animal/hostile/killertomato.dm | 4 ++-- code/modules/mob/transform_procs.dm | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm index 6b918e00ba5..51fa507f595 100644 --- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm +++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm @@ -13,8 +13,8 @@ response_help = "prods" response_disarm = "pushes aside" response_harm = "smacks" - melee_damage_lower = 10 - melee_damage_upper = 15 + melee_damage_lower = 8 + melee_damage_upper = 12 attacktext = "slams" ventcrawler = 2 faction = "plants" diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 321e22389c7..42c39113fea 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -497,6 +497,8 @@ return 1 if(ispath(MP, /mob/living/simple_animal/shade)) return 1 + if(ispath(MP, /mob/living/simple_animal/hostile/killertomato)) + return 1 if(ispath(MP, /mob/living/simple_animal/mouse)) return 1 //It is impossible to pull up the player panel for mice (Fixed! - Nodrak) if(ispath(MP, /mob/living/simple_animal/hostile/bear)) From 69cb378fbcb1f11e7cdb8bfc3a78fabf6beed166 Mon Sep 17 00:00:00 2001 From: Firecage Date: Sat, 5 Jul 2014 17:02:34 +0200 Subject: [PATCH 21/41] Added delay and 'prime' message Signed-off-by: Firecage --- code/modules/hydroponics/grown.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index bd5cf3784af..ab678e06363 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -614,7 +614,9 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/killer/attack_self(mob/user as mob) if(istype(user.loc,/turf/space)) return - var/mob/living/simple_animal/hostile/killertomato/K = new /mob/living/simple_animal/hostile/killertomato(user.loc) + user << "You begin to awaken the Killer Tomato." + sleep(30) + var/mob/living/simple_animal/hostile/killertomato/K = new /mob/living/simple_animal/hostile/killertomato(src.loc) K.maxHealth += round(endurance / 3) K.melee_damage_lower += round(potency / 10) K.melee_damage_upper += round(potency / 10) @@ -622,7 +624,7 @@ K.health = K.maxHealth qdel(src) - user << "You plant the killer-tomato." + K.visible_message("The Killer Tomato growls as it suddenly awakens.") /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blood From 4e4c05e46f4f4768a9b94a22e50964515702dae3 Mon Sep 17 00:00:00 2001 From: Firecage Date: Sat, 5 Jul 2014 17:13:10 +0200 Subject: [PATCH 22/41] CHANGELOG Signed-off-by: Firecage --- html/changelog.html | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/html/changelog.html b/html/changelog.html index c8ae3a5a66a..c2207d4f274 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -54,6 +54,15 @@ should be listed in the changelog upon commit tho. Thanks. --> +
+

5 July 2014

+

updated:

+
    +
  • #Recently the Space Wizard Federation, with some assistance from the Cult of Nar-Sie, recently created a new strain of Killer Tomato. A sad side effect is this effected all current and future Killer Tomato strains in our galaxy. They are now reported to be extremely violent and deadly, use extreme caution when growing them.
  • +
+
+ +

1 July 2014

Rolan7 updated:

From 0819cb12bd6402c8657f1c5f18d178e10e7ee93f Mon Sep 17 00:00:00 2001 From: Firecage Date: Sat, 5 Jul 2014 18:03:25 +0200 Subject: [PATCH 23/41] Towercap log/plank shit --- code/modules/hydroponics/growninedible.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index 77a960e92c5..0bc9e165aa0 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -45,7 +45,6 @@ seed = "/obj/item/seeds/towermycelium" attack_verb = list("bashed", "battered", "bludgeoned", "whacked") var/list/accepted = list(/obj/item/weapon/reagent_containers/food/snacks/grown/tobacco, - /obj/item/weapon/reagent_containers/food/snacks/grown/tobacco, /obj/item/weapon/reagent_containers/food/snacks/grown/tobacco_space, /obj/item/weapon/reagent_containers/food/snacks/grown/tea_aspera, /obj/item/weapon/reagent_containers/food/snacks/grown/tea_astra, @@ -65,8 +64,9 @@ for (var/obj/item/stack/sheet/mineral/wood/G in user.loc) if(G==NG) continue - if(G.amount>=G.max_amount) + if(G.amount >= G.max_amount) continue + G.amount += round(potency / 25) G.attackby(NG, user) usr << "You add the newly-formed wood to the stack. It now contains [NG.amount] planks." qdel(src) From 10c9d4d14e7225a892bbf1e8d65b71f5b9f9e3e8 Mon Sep 17 00:00:00 2001 From: AstralSerpent Date: Sun, 6 Jul 2014 02:33:13 +1000 Subject: [PATCH 24/41] Attacking augmented limbs or cyborgs with a welder on harm intent will actually harm. --- code/game/objects/items/weapons/tools.dm | 2 +- code/modules/mob/living/silicon/robot/robot.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index ae4c50b2ce0..6449a0ee712 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -171,7 +171,7 @@ var/obj/item/organ/limb/affecting = H.get_organ(check_zone(user.zone_sel.selecting)) - if(affecting.status == ORGAN_ROBOTIC) + if(affecting.status == ORGAN_ROBOTIC && user.a_intent != "harm") if(src.remove_fuel(0)) item_heal_robotic(H, user, 30, 0) return diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 23019c83f9e..5b94e9c637d 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -395,7 +395,7 @@ if (istype(W, /obj/item/weapon/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do return - if (istype(W, /obj/item/weapon/weldingtool)) + if (istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") var/obj/item/weapon/weldingtool/WT = W if (src == user) user << "You lack the reach to be able to repair yourself." From 9bf583ef661c0ef59ef776a1bc5425cbe4207faf Mon Sep 17 00:00:00 2001 From: Firecage Date: Sat, 5 Jul 2014 19:27:41 +0200 Subject: [PATCH 25/41] Blood tomato gib spawning --- code/modules/hydroponics/grown.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index ab678e06363..0bd7bee8d32 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -633,7 +633,8 @@ desc = "So bloody...so...very...bloody....AHHHH!!!!" icon_state = "bloodtomato" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blood - splat = /obj/effect/decal/cleanable/blood/splatter + + splat = /obj/effect/gibspawner/generic New(var/loc, var/potency = 10) ..() From b47a1d6b32d7081d1e7893d1daaf7a610de8cc96 Mon Sep 17 00:00:00 2001 From: Firecage Date: Sun, 6 Jul 2014 01:31:13 +0200 Subject: [PATCH 26/41] Eggplant and moneyfruit changes --- code/modules/hydroponics/grown.dm | 67 ++++++++++++++++--------- code/modules/hydroponics/hydroponics.dm | 9 ---- code/modules/hydroponics/seeds.dm | 4 +- 3 files changed, 45 insertions(+), 35 deletions(-) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 0bd7bee8d32..1aeef7d4338 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -533,6 +533,21 @@ reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) bitesize = 1+round(reagents.total_volume / 2, 1) +obj/item/weapon/reagent_containers/food/snacks/grown/eggy + seed = "/obj/item/seeds/eggyseed" + name = "Egg-plant" + desc = "There MUST be a chicken inside." + icon_state = "eggplant" + New(var/loc, var/potency = 10) + ..() + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) + +obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user as mob) + new /obj/item/weapon/reagent_containers/food/snacks/egg(user.loc) + qdel(src) + /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans seed = "/obj/item/seeds/soyaseed" name = "soybeans" @@ -951,33 +966,37 @@ user.AddLuminosity(round(-potency/10,1)) SetLuminosity(round(potency/10,1)) -//This object is just a transition object. All it does is make dosh and delete itself. -Cheridan -/obj/item/weapon/reagent_containers/food/snacks/grown/money +/obj/item/weapon/reagent_containers/food/snacks/grown/moneyfruit seed = "/obj/item/seeds/cashseed" - name = "dosh" - desc = "Green and lush." - icon_state = "spawner" + name = "Money Fruit" + desc = "Looks like a lemon with someone buldging from the inside." + icon_state = "lemon" New(var/loc, var/potency = 10) ..() - switch(potency) - if(0 to 10) - new/obj/item/weapon/spacecash/(src.loc) - if(11 to 20) - new/obj/item/weapon/spacecash/c10(src.loc) - if(21 to 30) - new/obj/item/weapon/spacecash/c20(src.loc) - if(31 to 40) - new/obj/item/weapon/spacecash/c50(src.loc) - if(41 to 50) - new/obj/item/weapon/spacecash/c100(src.loc) - if(51 to 60) - new/obj/item/weapon/spacecash/c200(src.loc) - if(61 to 80) - new/obj/item/weapon/spacecash/c500(src.loc) - else - new/obj/item/weapon/spacecash/c1000(src.loc) - spawn(5) //Workaround to keep harvesting from working weirdly. - qdel(src) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) + + +/obj/item/weapon/reagent_containers/food/snacks/grown/moneyfruit/attack_self(mob/user as mob) + switch(potency) + if(0 to 10) + new/obj/item/weapon/spacecash/(user.loc) + if(11 to 20) + new/obj/item/weapon/spacecash/c10(user.loc) + if(21 to 30) + new/obj/item/weapon/spacecash/c20(user.loc) + if(31 to 40) + new/obj/item/weapon/spacecash/c50(user.loc) + if(41 to 50) + new/obj/item/weapon/spacecash/c100(user.loc) + if(51 to 60) + new/obj/item/weapon/spacecash/c200(user.loc) + if(61 to 80) + new/obj/item/weapon/spacecash/c500(user.loc) + else + new/obj/item/weapon/spacecash/c1000(user.loc) + qdel(src) /obj/item/weapon/reagent_containers/food/snacks/grown/gatfruit seed = "/obj/item/seeds/gatfruit" diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 6a2bd7bbc2c..7fdf8c0b098 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -854,15 +854,6 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) parent.update_tray() -/obj/item/seeds/eggyseed/harvest(mob/user = usr) - var/obj/machinery/hydroponics/parent = loc //for ease of access - var/t_amount = 0 - - while(t_amount < getYield()) - new product(user.loc) - t_amount++ - - parent.update_tray() /obj/item/seeds/replicapod/harvest(mob/user = usr) //now that one is fun -- Urist var/obj/machinery/hydroponics/parent = loc diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 07df219516c..e5d9777107a 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -205,7 +205,7 @@ icon_state = "seed-eggy" species = "eggy" plantname = "Eggplants" - product = /obj/item/weapon/reagent_containers/food/snacks/egg + product = /obj/item/weapon/reagent_containers/food/snacks/grown/eggy lifespan = 75 endurance = 15 maturation = 6 @@ -907,7 +907,7 @@ icon_state = "seed-cash" species = "cashtree" plantname = "Money Tree" - product = /obj/item/weapon/reagent_containers/food/snacks/grown/money + product = /obj/item/weapon/reagent_containers/food/snacks/grown/moneyfruit lifespan = 55 endurance = 45 maturation = 6 From 5759e436af62479b31f8d0a86e5910c94c0d1789 Mon Sep 17 00:00:00 2001 From: Jordie0608 Date: Sun, 6 Jul 2014 16:14:58 +1000 Subject: [PATCH 27/41] Changed rules UI button to URL link, other URL touchup in config --- code/controllers/configuration.dm | 5 ++- config/config.txt | 5 ++- config/rules.html | 62 ------------------------------- interface/interface.dm | 14 ++++--- 4 files changed, 17 insertions(+), 69 deletions(-) delete mode 100644 config/rules.html diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index b9feeaa1124..cd20f995825 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -54,7 +54,8 @@ var/server var/banappeals var/wikiurl = "http://www.tgstation13.org/wiki" // Default wiki link. - var/forumurl + var/forumurl = "http://tgstation13.org/phpBB/index.php" //default forums + var/rulesurl = "http://www.tgstation13.org/wiki/Rules" // default rules var/forbid_singulo_possession = 0 var/useircbot = 0 @@ -243,6 +244,8 @@ config.wikiurl = value if("forumurl") config.forumurl = value + if("rulesurl") + config.rulesurl = value if("guest_jobban") config.guest_jobban = 1 if("guest_ban") diff --git a/config/config.txt b/config/config.txt index 5bfea844cab..5a516d59e5a 100644 --- a/config/config.txt +++ b/config/config.txt @@ -111,11 +111,14 @@ GUEST_BAN # SERVER ss13.example.com:2506 ## forum address -# FORUMURL http://justanotherday.example.com +# FORUMURL http://tgstation13.org/phpBB/index.php ## Wiki address # WIKIURL http://www.tgstation13.org/wiki +##Rules address +# RULESURL http://www.tgstation13.org/wiki/Rules + ## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. # BANAPPEALS http://justanotherday.example.com diff --git a/config/rules.html b/config/rules.html deleted file mode 100644 index 4a41a7a333d..00000000000 --- a/config/rules.html +++ /dev/null @@ -1,62 +0,0 @@ - -Server Rules -There’s a lot here, but the gist of the rules is roleplay takes priority. Don’t metagame. Don’t play to win. Don’t be a jerk OOCly. If you don’t understand what those words mean or you need more detail, read on! -
-

Primary Policies

-
-
    -
    0. Admins may disregard any of these rules at their discretion when they feel its in the best interest of the current round/server/playerbase at large. They will, of course, be fully accountable for their actions should they choose to exercise this privilege.
    -
    -
    1.We’re all here to have a good time. If you’re intentionally trying to ruin everyone else’s good time, you won’t have a place here. Being a jerk in-character is fine to a point, but being a jerk out of character is not welcome at all.
    -
    -
    2. You are playing a game where you are not fully in control of everything. You will be put into situations beyond your control, which will result in some rounds being ruined for you. Man up and deal with it. However, if you are obviously griefed, be sure to report it to administrators by using the ‘adminhelp’ verb.
    -
    -
    3. This is a roleplaying game. The purpose of the game is to have fun roleplaying. Being an asshole, who ruins other player’s roleplay experience, just to win, is considered a ‘play-to-win’ style of playing. You can and will be banned for this playstyle. Be considerate of other players’ experience.
    -
    3b. (Suggested rewording) Randomly murdering people is generally considered to be ruining someone’s fun and poor form in roleplay. If you don’t have a solid IC reason for murder, you may be removed. Trying to justify it with ‘My character is so random/insane’ is not tolerated.
    -

    -
    4. IC information should be kept out of OOC channels and vice-versa.
    -
    -
    5. Don’t metagame. Do not ever use information, acquired out of character or through patterns or events your character would not be able to know, in game.
    -
    5b. (Suggested rewording) This game is developed by volunteers in their spare time. Do not expect perfection. If you find a bug or an exploit, report it via adminhelp. Abusing bugs or exploits is not allowed. This includes reacting to events or patterns, which your character would not be able to identify IC (metagaming).
    -

    -
    6. If you take up or are given a job, which is important for game progression (head of staff, AI, antagonist role), make sure you actually do that job. If you find yourself unable to do this due to real life circumstances, just let an admin know (adminhelp) before you leave, please.
    -
    -
    7. Speak like a normal person while in character. Don’t spam, either IC or OOC. Don’t use smileys, netspeak, etc. in IC speech.
    -
    -
    8. Erotic Roleplay is allowed, but some decency is expected. Keep it private. All involved players must consent. Unwelcome ERP will be punished harshly, usually with a permaban.
    -
    -
    9. Ingame administration has the final say in all ingame matters. If problems arise, you can report offending or abusive admins on the forums. If an admin says something was valid, it means it was valid. This is the admin’s way of saying it’s been investigated and found to not breaking any rules; The admin will not reveal ingame information.
    -
    -
    10. It should go without saying, but if you break the rules (or regularly come very close to breaking them i.e. “toeing the line”), you will be warned, muted, banned, or talked about rudely.
    - -
    -

    Additional Policies

    -

    Roleplay

    - Murder is justifiable as long as it was properly escalated. You can’t go from a single rude punch to a knife in the neck. You can, however, go from a single punch to a counter punch to a brawl to using weapons, and so on. Other IC justifications may exist for murder, but these are on a case by case basis. Minor aggravations like demotions, pranks, insults, or thefts are not adequate justification. - IC in OOC can be a no warning ban of 15 minutes, it can be longer if the IC in OOC is severe. To clarify, this is revealing anything about the current round that others can use in the OOC channel. If you are unsure do not say it. - Avoid using non character names. If you have a very offensive name or an obviously immersion breaking moniker like 'xenohunter360' you will be asked to change it. - As long as there is adequate IC backing and it doesn’t happen too often, assisting a traitor is within the rules. - Admins are not only allowed to run events or otherwise influence the course of rounds, they are encouraged to. They are as much GMs as they are enforcers of the rules, perhaps even moreso. - Persistent character relationships are acceptable, so long as they’re roleplayed out every round. Wordlessly assisting your OOC friends (or harming your OOC foes) ICly is NOT cool and will be addressed harshly. Roleplaying out your interactions will help you stay on the right side of the rules. How much or how little of previous “shifts” your character recalls is up to their discretion, with the caveat that being a known traitor doesn’t persist past the round it occurred in. - Griefing on the shuttle can also be a no warning ban scaling up from 15 minutes. Shuttle griefing is attacking people or preventing people boarding before the shuttle has launched for no IC reason. -
    - -

    Silicons

    - All Silicons are expected to follow their laws to the best of their ability. Failure to do so will likely result in a job ban from all silicon positions. - Law order determines law priority. In the case of two laws contradicting, the one with the smaller law number wins. - Asimov silicons are not required to do what players who threaten self-harm demand, unless they choose to interpret law 1 to include that. -
    - -

    Command/Security

    - Security are expected to use non-lethal force when defending against non-lethal attacks. This of course also means that security are allowed the option to use lethal force when defending against lethal attacks. Getting stunned in a dark maintenance hallway by an assistant is potentially lethal - a clown slipping you outside Medbay, probably not. - Permabrigging is functionally the same as murder. Anyone who is valid for execution is valid for permabrigging. Anyone who is not justifiably executable is, likewise, not justifiably a candidate for permabrigging. Makeshift permabrigs are treated the same as the official permabrig in terms of rules-enforcement. - A Captain or acting Captain may execute criminals, traitors, and other known threats to the station should alternatives not prove sufficient. Abuse or misuse of this privilege can lead to job banning or worse. - Theft, assault, annoyance, false arrest, sentence times etc. are in character matters. Unless it is extremely excessive or griefy, it is not an admin matter. -
    - -

    Admin-help

    - When you adminhelp do not say things like 'is it valid?' or 'being griefed', give details of what is happening and ideally who is doing it, job and character name. - If you see someone doing something that seems out of line adminhelp right then, do not wait until round end to see if they are a traitor then adminhelp next round. It makes it a lot harder to deal with. - Do not lie in PM's and avoid being aggressive, unhelpful or insulting to admins, lying while being questioned over an incident will cause you to receive a longer ban and being consistently insulting or aggressive will get you muted. - - \ No newline at end of file diff --git a/interface/interface.dm b/interface/interface.dm index 4e4aa598e2f..cde3478cd4a 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -3,7 +3,7 @@ set name = "wiki" set desc = "Visit the wiki." set hidden = 1 - if( config.wikiurl ) + if(config.wikiurl) if(alert("This will open the wiki in your browser. Are you sure?",,"Yes","No")=="No") return src << link(config.wikiurl) @@ -15,7 +15,7 @@ set name = "forum" set desc = "Visit the forum." set hidden = 1 - if( config.forumurl ) + if(config.forumurl) if(alert("This will open the forum in your browser. Are you sure?",,"Yes","No")=="No") return src << link(config.forumurl) @@ -23,13 +23,17 @@ src << "\red The forum URL is not set in the server configuration." return -#define RULES_FILE "config/rules.html" /client/verb/rules() set name = "Rules" set desc = "Show Server Rules." set hidden = 1 - src << browse(file(RULES_FILE), "window=rules;size=480x320") -#undef RULES_FILE + if(config.rulesurl) + if(alert("This will open the rules in your browser. Are you sure?",,"Yes","No")=="No") + return + src << link(config.rulesurl) + else + src << "\red The rules URL is not set in the server configuration." + return /client/verb/hotkeys_help() set name = "hotkeys-help" From 6843a9b166d158cf3f7a4bde52f9bd82c3df0c0a Mon Sep 17 00:00:00 2001 From: Jordie0608 Date: Sun, 6 Jul 2014 16:29:21 +1000 Subject: [PATCH 28/41] Replaced red with span --- interface/interface.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/interface.dm b/interface/interface.dm index cde3478cd4a..979c4abae41 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -8,7 +8,7 @@ return src << link(config.wikiurl) else - src << "\red The wiki URL is not set in the server configuration." + src << "The wiki URL is not set in the server configuration." return /client/verb/forum() @@ -20,7 +20,7 @@ return src << link(config.forumurl) else - src << "\red The forum URL is not set in the server configuration." + src << "The forum URL is not set in the server configuration." return /client/verb/rules() @@ -32,7 +32,7 @@ return src << link(config.rulesurl) else - src << "\red The rules URL is not set in the server configuration." + src << "The rules URL is not set in the server configuration." return /client/verb/hotkeys_help() From bb5fa83c199a62d257db2596103ad5b3be13e2f2 Mon Sep 17 00:00:00 2001 From: AstralSerpent Date: Sun, 6 Jul 2014 17:47:56 +1000 Subject: [PATCH 29/41] Now bots can get harmed with welders too. --- code/game/machinery/bots/bots.dm | 2 +- code/game/machinery/bots/secbot.dm | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index 3548b15de45..5c0c30aecc1 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -80,7 +80,7 @@ if(!locked) open = !open user << "Maintenance panel is now [src.open ? "opened" : "closed"]." - else if(istype(W, /obj/item/weapon/weldingtool)) + else if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") if(health < maxhealth) if(open) health = min(maxhealth, health+10) diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm index 42c365e5b6c..278ed06a1db 100644 --- a/code/game/machinery/bots/secbot.dm +++ b/code/game/machinery/bots/secbot.dm @@ -206,7 +206,9 @@ Auto Patrol: []"}, user << "\red Access denied." else ..() - if(!istype(W, /obj/item/weapon/screwdriver) && !istype(W, /obj/item/weapon/weldingtool) && (W.force) && (!src.target)) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass. + if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") // Any intent but harm will heal, so we shouldn't get angry. + return + if(!istype(W, /obj/item/weapon/screwdriver) && (W.force) && (!src.target) ) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass. threatlevel = user.assess_threat(src) threatlevel += 6 if(threatlevel > 0) From c025faa5793d10235c9b258240382b6a6aa837b1 Mon Sep 17 00:00:00 2001 From: Firecage Date: Sun, 6 Jul 2014 17:55:10 +0200 Subject: [PATCH 30/41] Grass tile amount dependent on potency --- code/modules/hydroponics/grown.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 1aeef7d4338..7372a47f34c 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -736,7 +736,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a /obj/item/weapon/reagent_containers/food/snacks/grown/grass/attack_self(mob/user as mob) user << "You prepare the astroturf." var/location = get_turf(user) - var/grassAmt = 1 // The grass we're holding + var/grassAmt = 1+round(potency / 50) // The grass we're holding for(var/obj/item/weapon/reagent_containers/food/snacks/grown/grass/grassToConvert in location) // The grass on the floor grassAmt += 1 qdel(grassToConvert) From b5c45a74749c36fae86642c770b144842d6447e1 Mon Sep 17 00:00:00 2001 From: Firecage Date: Sun, 6 Jul 2014 18:13:22 +0200 Subject: [PATCH 31/41] Icons for the Eggyplant and Moneyfruit --- code/modules/hydroponics/grown.dm | 4 ++-- icons/obj/harvest.dmi | Bin 34385 -> 35540 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 7372a47f34c..19a0677aea5 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -537,7 +537,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy seed = "/obj/item/seeds/eggyseed" name = "Egg-plant" desc = "There MUST be a chicken inside." - icon_state = "eggplant" + icon_state = "eggyplant" New(var/loc, var/potency = 10) ..() if(reagents) @@ -970,7 +970,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a seed = "/obj/item/seeds/cashseed" name = "Money Fruit" desc = "Looks like a lemon with someone buldging from the inside." - icon_state = "lemon" + icon_state = "moneyfruit" New(var/loc, var/potency = 10) ..() if(reagents) diff --git a/icons/obj/harvest.dmi b/icons/obj/harvest.dmi index 719a588495df4cc679f356b1d99602022166974d..090fa968324afc975b7876a6a2ea9d063a08d231 100644 GIT binary patch literal 35540 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"vTJnkpF%mede)*)2hFGz|N`F@ueM( z3JQY7xr7q2Z|m%a1(GjWwJu{h9j;yfYdSN8QhciWx86d+7OK9~leJwoP!3|K{}Ty5{CA5%+HSf*Wuw|_uet63|W5@X)ZPWiXupT znSX=8fFhU#>ytWN8~+g&O7}HcdD2-hk>52*qNr1&t}23e z*aG3b8%106NUi>sglNfewg7@*g0kaO8BZLpfcj!QyFA}Y<%v9v+E5ZAKsd->nY;4V z$__uQ0eypzsd3iuHN~d1 z7uxDdzGvbvpYnm&TV%9C%iYdI#&|VUq6Jm(FRL~jB?Ws79=t1DK(jPdKV)437C0C8 z$V$PQ$8J~K215_G{W_i{gNKGY{h0^N?>Xd`^y(&fWf}~eXdq>?sC`wDplxye<}|*j z&rbVHO{_wPuXREZwufBWOWM`pBne5zU(Y!Ikdzz5qC>7g1AhN%IC3~tR8(JhH-5cs zC(z25+Q(-?Y+;9^MsnY1YfrGIH-Wku&{wu)74=Sg zQi0qB{KWD#dkXf@x#^%-FD9E0NHi@A;}TtW^oG*z*MZWlH;1Wzs2%+j>gna1TfuSb z;%vR94%&qKV5Vtz#_ZQc8a7KsD`>pJ#7F&^h2}Q|wU7B*s35k9huRF7Yq(P;8;$$Q z$-Ni3h@JUZkrfBo;GQ(vM@!j zw9pr8HT$-2){EuH^Nh}HDT9m@IsM#U)(}{wBT_iHgD0do(wGMCmxGwswWEK8W9Kbo zBwF7^e*xZmgC4hS=_*(+qUY876wu2-;VwyK5o{Y5!5;Q09=l&vQJC-aSM8>LOj15M zUWOhiK9Ii@7q=5d(Sj`D!BtZDS5A^T$koT4QIf0vzq$Bg-3|5ge6VrhgBfu&ztC!S z-k_{j0bH4(oSc87XnuV&yuB8xoJAKdiLIKYD$1Wh<^<0PERO=(Q~tCnG#yb;d~aUX zcC6yG`~EXM^Vwl$m;UQ_JG*+6?){xMe=Ie2q5JcAV|8e{YIJ0vH5+ z!^&2B2QzJoDkErR=A=@8ln(;uI-fynAiv<-biiMA4CV#uk zGXr;R?Il0_cCV3+`dF|z$r}B?i`VuiuI(1QWEdUBKlb6%=W)YAJh29hW^SGVE=ovy z@Z58D@i@WVf?}aVsLA)=f_)=p6O?6D){xw`gyf6C^gJ0}DW3iN-V})aC2Se-7|DHg zc}ik(0S{bK zAca{{&I96Hp9FVg@w%6!SyGva>hym)(ckXWsHZB63F5_U*Yw=u-}?W#M>Cm8GSZ_3Z2ms48)B5)k`Re^d`&+^Hr52)lttevVXlZvh(u%b8ze#h zx>}j{^+5NU*BjNZ$S6-i*=kj4%+7HD-g>mzElNx{OWx9oO*jc^wJVRAzd!Y#1iU=P zx4&K#Q?Ps>o?KnUp!5Jp$+Al2j6v1CF@IN1^;T?8ag6e2mhhAah zFpgnlWPDNhrmMwrUl_N5kn3($Cj+C74_xMT|=OzUK+W*5q`d@iT` z!4zN(X8_{uZuk8ZX7C72ybVKDwfV|$9iQJdYT{@bH4b0H0iNo=TWIBiSF7U}X^oh~ zh57BTWcr)C9nz2xam3DcGKd>6{lODb-roEgS&Ss0rOa3jawEtXshGe4>mKu;OFSi| zCiQ?Bz2`&v06Ktqy(6=BKX*Mq`@2g77_TXFLBAJmVQI%ikAd)1;UVO>;|5tql>&Mi zb5`F@A9Q<0>tl*ZJX{uS=NgzviKrbq6;k+YFe?nwld20=0TNmk9Fr0+!G~P@qmBYg zC7Nl`*lsyP*f_nj6c#?TJuRQmr9{)}?b|2$LCP6-HMnXwzWHxQx@t?e4d z5csI2eeOGtAtNIt-w&I;ROoz_2E}L&s{EvOH-8zb*%S%qg}6mW0pg)p+%8nB6NFI8 zpSSmmgtL5@$bfEAy&@GiqA}QT-(_>v4#r0jrf0+f2#v2a+RSR_^*|3#-Nml0LsuTpH90Ucd!sR(*!jbaoVX#Tj@liGE z7Z$_9jk|*icnVgi3&Y>k`BDTt|As0Jz6BO&2fAw|3?y5rDs|Yw^TRe9h~ZeeNCu+S za){wfK}EkW?>2VxbTgxgrJ}8U2$Y15OXdVb$N$CxFmRI)BLxJ+R_NeFq2HK)eyZKbewbaq zbe{y)$k5S;9-2q3A_OS~cRE3klkurL&QEi!#GlMv+*WAT_@-1086`s(nTpO?l(EAc z0K;6>xwqhP7#k*Bwd+Z>)BXfH0+!3CBw84^sS_S#+76a`D?hQ}Br3yl;4>n%5$7?6 zy^H!Xf|k@t#T&zNWHUe$@A}d@VEmJG&33thJLV*C=EsC_(N@`Hf!n119?VVB0laU3u;}O1 zXW(72b7Dr^5vtjB|u47pvn6_xXlV!2+H!la@5=pnD74Hj+~mVdOgiBZKq zgJcR@LTW_OnkLMb$m_&FMu?VF9KA!t`C|pANYYCBh^YJ&tu#OU?bQG zX(Tn|3|_GANk@??ME)ZQI&gvj(6-2uM<{ZxVUG5EhVYETWK8LJ9*&fm`<^@7K5z}H zjRg_z@0i|r)HSl%fgdxP75nT*JTZ}WGxlQjPu7<27lMOYg+dnIntNEl*+t4H9=KGX zg~tVtngoyfUVH6Zy%bzg`{pKZ`li93UnM7^q)ycN5>2Aqg6}hyH6h)-x0d<=OCeLo zCl8X#{c*@HCeL++_q;Fp6=rw-(PlzS=*B^$zQ4lZdy~NrZ8zd42tbpyF_+K|AV7DI_Lmgo= zE{mIeCMLtnO;4;$;_U}9BlJ*7nV1}k*R`Cu?g-LP4vx0!(`}ouyB9-e`AkAd>3;1iDtOeNa$H5R8wKD1&?+YcCjXGq^>MdNv`uadw2LS+6k zNqo~;K*qeO@KEv;e%we3^}cyM^nr7Obz~_=36MfQa&W1q9+HA4*gp98?ujcBiv_%q zAF-`KH!u1wZ5czZ($KY1DjKXo#3^wCCpreLD?kuIgdh9>%YY%by*SLYo{ua`yh|Ut z^NJ1Bf3vqY{xSb1CFcxmV#iT2Rd@%aqGEuQ}cHzOqjyF08O zC@7U<4bY}-Rit5)2jcc$ovl{P`FA9PRPLKsK@*PqW$?VeiU#}#=FYlojfDVGM}7nc zsiH7}1)Sb0=HF%&bHHW8IMO*J$eOa7`9{6X1-Tc+nMKX9&6yEer$pxCZS7;&kvwqp z)1tFo_;|^{KbIZN-67%=Qu%<`9eIkx;g7HN8Rv^-Hrsm{$FFbXE#Cze>?AKTXdf>^ zTqeN}I-79hW&yHy1q1X7AG|pyJtvn*5>`{% zMU;`+%Pr!)m!^5={<|?L^ndI={%7~{zu)~oH!WlBza?EKJm()Ru%SLI7khImIe@PTGenvpXm3Xl~`JQIPh+(8fQoj zh9VOqL->Gsb}oFH_BSb5<3emq-s$B39X>oq`OM7X`X=pPsvi@wz}jKJqm8)m6XPAS^N^LJjGpr}%2 zL@~fi9zrf{`J0>edF>hhQT4I^s3W19hey=uh-9R{`}TA-^IU(~`K_O@peBqkotp;T zCMTl#5-2{^0VH(5b(-;WJoZyiCY;I-XGj(NxRxEbnw`1+*Z$$!Jp8&Bs=Cw`IqzM6A<;Ut0Fw8!|vHmc;5P+?t{sbs3Km$EXu?OJG_JKalTb${4Hk%#oM8a_OHOv&(h39;f3 ztiqtFChVPhE;S<;#{uXNuS+hs-L0FYQi+U>KFB4-{c;0?38AzcNo!pw%q#zBRU`Y+ zbCS>dZKPb!Bjw-yT~9lulEr^g*DO9lUwGC>`T-m#rOMlXX|Hy)g5%^gnF2a@n%^%n zmfEnp$lw=>v5-pg z=K>jj9fZJMSNV``rHx(tKkBsSeQ;lUm+iq&LU;UWWBL4uFM-c_o7tn_Rw`Y6WFc)4 zTdi$|Yuk`b+)z>#R>05dEtzmXcc=T^U^1#g`_}r{TYt^XU2`SFCx94dnCXu0vE_uk zd5Ul-(uL&U2CbQsHF=Mpte&XS^~&EKi(G`FP%wx+*^sVXmBB~gpw4%NySQ7)aP<3{ zKRluh)a((uT;|c58y8fDPX#^ARBzbfa#T!Hx4V(WRzg!(baF*@Je}(+Hv9xW54?jO zrH{NE9W(E^WLn1aN4CHXmS+9)Pm60TO&7+mLkqZ5$El%z-;aDgHs984=hGR1#auL} zY&54UMl0ir&H5A34i*LBo}#JoPxV{7Z_fCg@juY=NX1umQL;v_s|0_%briO2{YA9` z%FQRKJSg%+<#pT&4cY&drJJhuX?*ZOLP*hLd3Al;d2yj@uZw*9{L znZ|V1)uXM8e)~*sQOZtF9TadSD4|!Bd)4lQg{zK{yG{z?8Q7D3dFeXxqDg*iz(K4C zb}hcR=lf$cp#B7`suu(0=XVZP&aV5YN9>aKp0*=J1yAj9;ZCv@vpbt-)}*ZjneGwz@rjO6qO8r$OESS#vHH7s#HbOWfE;-TGndsCEys zw;$LSeSCp;lQr*pF?V{1G>mdN9z(GYyCBs=)K=4zl|Vu+MZYT0{D-fDz_czJeT3huS=lf#RhZhqk%{v_SKt&jyfXR$-E zdXM)P_?g}Fsf%?Q7pN?v}*bI>Igrxdnto zTX0a2>!*%Ia?&)cj~VvnAPk5xj`o9Kv#<|C-WA!5 zb5tOqHXh&)kl7Pp$(0J5=qXBpQj38($F967EgE!kZ^>aP_=e~1jsUuMlcfUL>Yc~7 z7EI9pZJ=mSa+{7xx=s_szVvL8so@}5B8KwAB>5rol|QYIVX@?~4nkx=rHz0I#rrv0 z6-_`?b5-K?v(~*uUKl4maqY%vBWC^eB3B(q znF~%4u8ZeM#Dk#rhG5SsdtUZb`)6hdIUWhF9mjtItv~&2dEHT6W+>_P(`U9e6=!sV zNlQl?@A>nMI5&cQ^JW+%(PnrUVoy)K0|P_Be#;Z8uaG;%Fe|UFBr(Cn2cmx~SZ-UI zT&`6;-!MHYj+h_w2m5@uj97oGXJl?SB*Jb)M#AIEesjo)ZT=fPFxEx!bb(q%Cpf+r zy=5Z03P$38ojN^e@QRL!#6S2LUDA7K_;`Mok&+bH{5zX#($P8oRBHoIauZenkCpDH z!Ia>aq8s4d;L-b4_KZS@C6bvts_aqB;msP06i7)pq+aZ?IDEqDd_KKTMV}puw1~t5 z4`&kwf!AXmEj(x1>{A_)APou`KK4NdnxsI$qp(58GlPyzw5Q<(gYQRGp^FRCaXhZQY11 zbJ^jTa@S$J848sT*WXwE%g+fR-4t&tnLX4P(qSdycaAGSyIZVoz(iwuiT>bb62_w6 z1AfHmk8A&T;ez~(ur8hMn(`C9xUGvEEsaV&GBsF&RmLpm@>=Q6(6c9MxgE`R(PdIx zG!Uw|i#rx*E=wAkixjOKWUWU^n_mpy#Mn$_)FQ@*&QuMA!G2;ZF?_jb(N)^L_da*8 zS<|x)huSU{5o9Lb=nR<^hZcOA5AnTTQ0mlbORP<%Wi#A&Y+t}0Pv=gw$bBQt^>->~ zxH0&WN+stfpUDo`(@|lCGTk% z*e4(0sY}3a&luok$G5cQi5%ePfera8_0791@I2z^u3nxU&}RR~+DGim4bW|Rkc&gQ zzM}x=(V-9|q`NxZ31S5*&MQ$h?Uau}zC}oi^H-Xw_E-F+4Z-N4&CUKu;hpbS0^Ll? z@0mW#0?{Bn_pjx@5hLRZ#0_l)#I9AhXLNxcxOfbV93l$aRa!i&)1tzsLv-t!kC?|< zZ)kN_GNr$pP8HPksld|@S<2pY&zY^yGl^+J-x|OCgiII}llsOCb4?vVge&_Fsb#%e z#&jXlU8(MTH|E@Pa&Tyue+~plDkzZf5CvAYA>wh?7{n9DyZtYj8#Z~!9IWPKYyt_N zr)g++3*<-?j9(h9rb~cvpH~}A2eyz1kTCvp9Y6;1iPawX^KVaF$UWHH`5VKHPIl{S zC!?NtuK8kG6iy)$FP&=i7azTtoU$Q(q!8NR4v5Dpmz#HSAr`V&jtKjwz*WRjp3xeh zl()R_Hm>61k(z2JBCX1ID$!0 zApXo&8x%GSRR8}9DMnc58lpbhLmsuoz<&vEuu6eT~b;-g{v8$e|R zpO8o0Odbrf9zBvpvzp@aEI_dNY^V%T|_zs(8 zF7(lWXLBktT`Wa+!|mnG=YP!nRtR5~RiRZY=FCe}R9wvF^Jx3;sx8KQ z{EnxkZrhKHC7`4vOh7#1{c5G!X0BL05btRdTT`{QXmhjXa+GO+sH}(BiSrWt3*B#@ zSq^kKvPabjX6|1pUnY`(cgukHWXyZ~IY{=8IjUvU81TD?Q@@)d&@qU!v$K{~R^$Vg zMTe;%m$9-KH#e7d0{Sg5+eyCjlBaDx^{B?wnIinq_ht0ef z2YISFzbAydtyC!Ebd7!Z+2kH==#!Cj+KCgkT83Nt!9a{aMvp$SAy*o z-0RFb__h6giP`vv@4-xC$mK~Q@Xj*eWx>||E#u#_0Mi0GK21rk6E|%%sDSBSf7aXW zN`M{>nCE5s0%cwZ`yKSQ&CO12TND9SNNIi})!R_@riLBk=y)2@R>;sLnY9XgZny^h z=bmP~`xpOa_FrwJFFBSCYZ;smg04ogwre+B8JhaC_4QPa1@?_q2-E80(c?*0iTocB z5q)39#2{k13F+zSv2bxA6H-&dC(H|*nlvUuUCATW8RTUgZ1qYaEf365Kjy&A5f-Sv zYt!=-#(rJmdx{>e=OdU+&KUVqKua~RFNh%Lo&qhV2;YbsADl#79CAz#4<2+Y4?5%E zPU{=$fWumdn#8`K#=?c28$k3f&s*X9GEsI8U+QRvc+^`-Hps7k_@m+S;^1(Q)%ez8 zxEm(;v}%0Q)`t5|S4Z9m5`>cfPB|DHlu}bu10|_4qHep!VD-I+{R&ivptTvGGnJ}kc zHO1&#sxUgwF5bQ+Z{n0Z%f5CyWsK!^0;g51u{FOxl41xKw*I8UQ7K|KkL1BSz^ zb$ifGdS%T*9+$d_si{)7wv0MWwqLCzN{fp@Ik2lKCi!Ge>5SwZ=uI!xjXb`=jHKf2 z>xc}^qbt)TCLH2GFVr&@`C&X*`K6ID8l=<%Oco1Ktv}bcC>Dpcn(7}w`>n`0luUFR z(0V(>`~`ZWgTxnV{NWWsgW}ArM1WQrrw45<|ni<=-Mr5KA@>D?V(K5 zdz=i|I=nC-OUYAjDz?4qzo~5ba|ZczdFp+50ZdD81{#1G=iLrDq>eHB9KEHFuK`)| z-z(~v%zScYsKGz>U-N$8cl}K?!tYz|ywQPqkS`vzDy=J%>14D6`QZY&&jNm!bG0OY zjz`VKmCR|9g9gB0#5LULnlIejYSq6dB$68-%AGuc%`Yy3M2MJ_l+>_9QHsuvYJz7I zW09SFkD1NSc-`=FD)QnhOl)Y2_=K1c4^HsAswJ)-?O4zW0_(n z(SHK5Cgk*P4xG|>Yt~f0n<4!ahP4psDNt=fN5>^xw)gq_JvfY-s`j$F+GX+~t!GCp z^UIkGGvm(i4n@2A0TQ7PN_j|l{Xu=aR+}+4=2gzx&xvrX5OSO7f!;G~I|EryR8nE0 zgz?s+Ttd2ms=ucUkLN3p-I-iAVrmGX(m_ir+V0316f8jd9NkoU42I@#3T;{m$)Gt9 zU6D^yztg_@AHB}K>+yJr9 zr`||#O0KdaUkMsx-sO;Tuex^Zp9X@Dz#^qxp5~Jms5Fzx8=ZqYanK?#TJ}h% zdKTC+Fn-GExfg_SR@-wv3H`*8e8e}$fq|#mLl$7sOPeq6mp@;!gqhMoClcccd2?c8 zV}qoQNn{GJ4||6${%46R9j^}z)_DpwR9$FhPF(^q==mbeRMz8;LOl?iQOe)$i zhBE>{rtj4wA;H20o1?UB4wb-$JqlF5DR2>=#SEqbl*AhBBcg|`?m_qW13od=4Sbq^ zuXsEVu;f75@-(NeniFXV4=vws;(>{dyJCKbxc?D^MeasJ8sA}quVVAA@t-fz&@C)E z?x=_2QQ*osUOdlpES&ThdIocNQvLpLvoV_BLBbRpSC{p!EsJ{ElJ1to6gW8ws$!EE zW4`U!*>1O0yStxF*gKvOl6Bufe8i8o|9Y-d|#c>Wo63iu{^yVw`Qcz3;1DF4rsl=tVa z{E~$X|8MjGSJEALiHXO?2dMKq?uBzFtawPg?*inPn;im0x8ToXy7lwl7yn)<*BeOu z2+jP+n4Xz9O))xbUBNKJ4)P1wKbLNh8>Tmfx7#fA#$N;!dO1w9bJgV<^4oC!6VfN1 zLisAcWXk;D7XX<2TEfH}C6{Kxl{Z-*H*2XXIb8W62XkyDuREXWY3>r)z-RqP@cgOPB=D@q>x0{=11VP%NKP(itI3D)JSXvZg}yJh zH&6cGNBqI;TMuv&6BEDQ?DVxHKEWpK5rWha89O`sJ_JHP3O_3sjXF+3Fhx?%p*&M^v39Ev0Y)}Rpf zBXC(%TpN^Rb`^;?L;GG-m)CTY_cVk`+lv-9w9~(|9OEzQ{ENKOROrG(BIX!#;ouzh zZ!PWpdnpN~w8zy!60QAS_w2;+gQ~9olk&@R^%$Ly#^3^kda@>=5OB-#y9D9#N9b$x5Edo3Y!%^jwkLE%pYS%@=&pR) z#(!QA9`29dOjwlOAHUfjzvG_J5q+ZCY~zRI1KrpU=%qhAE)5wsmIF&SbK$LXDLh<= zwXU4fV`W_R%b$_|{T}*M^~|2oL1mZf@&S1UOv!pWycXGU20{&%E;LKIx5;H$Q(0U2 zDCJm9p?dMn3;!sYZ_AO(va*V{@=?mM!gBQn@L$N%8{Uxc3Ve;7AN}50GdlQZPenfR zHXf4jdhs1^3cZtNbnwrfNIr0q$AT$`T}&P;?-R4>%gqcKH?~KP2Mfx476&cP1yDmi z0JCPz5*Zm8I2;b#ZZ~eXJ5YXs`q@usv@gw?%339)WJ1?X32hb>Oo!5}tfEyy{!A!h zidV~mLd-48e;N4P+sjAIq@ajMDbJL0?Ccq#FT*+`AR?taQ_8U!W3@6&!m>Gs;%T0q_#TCL`DcM0whd7bhe(>*02XxAfhI^{j4H3?~)08Kz$WcKXYA|)k- zw6rve4c=s#QO#FPD-L>5V-vAqdKdjB%QTG){L#;h%?dQ(ehj78 ziBK}4oSS(9q~Lv=U51L!;Nw1f-#%(Q9Y|($LW8HU1wZ W)TW`rrq+T00000 Date: Sun, 6 Jul 2014 10:44:50 -0600 Subject: [PATCH 32/41] Added some clarification in comments --- code/game/jobs/job_controller.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index c01c0a08ba3..4b2bc0eabbb 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -113,7 +113,7 @@ var/global/datum/controller/occupations/job_master return -//This proc is called before the level loop of DivideOccupations() and will try to select a head, ignoring ALL non-head preferences for every level until´ +//This proc is called before the level loop of DivideOccupations() and will try to select a head, ignoring ALL non-head preferences for every level until� //it locates a head or runs out of levels to check //This is basically to ensure that there's atleast a few heads in the round /datum/controller/occupations/proc/FillHeadPosition() @@ -315,13 +315,13 @@ var/global/datum/controller/occupations/job_master var/officer_positions = 5 //Number of open security officer positions at round start if(config.security_scaling_coeff > 0) - officer_positions = min(12, max(5, (unassigned.len/config.security_scaling_coeff))) + officer_positions = min(12, max(5, (unassigned.len/config.security_scaling_coeff))) //Scale between 5 and 12 officers var/datum/job/J = job_master.GetJob("Security Officer") if(J || J.spawn_positions > 0) Debug("Setting open security officer positions to [officer_positions]") J.total_positions = officer_positions J.spawn_positions = officer_positions - for(var/i=officer_positions-5, i>1, i--) //Spawn some extra lockers if we don't have enough + for(var/i=officer_positions-5, i>0, i--) //Spawn some extra eqipment lockers if we have more than 5 officers if(secequipment.len) var/spawnloc = secequipment[1] new /obj/structure/closet/secure_closet/security(spawnloc) From e9d21242200cf259bd62f1348d226aa78867d06a Mon Sep 17 00:00:00 2001 From: Kelenius Date: Sun, 6 Jul 2014 21:33:05 +0400 Subject: [PATCH 33/41] usr -> user --- code/_onclick/hud/screen_objects.dm | 4 ++-- code/game/objects/items/devices/PDA/PDA.dm | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 58b96c7492e..d5e44761d63 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -345,12 +345,12 @@ if("PDA - Send Message") if(isAI(usr)) var/mob/living/silicon/ai/AI = usr - AI.cmd_send_pdamesg() + AI.cmd_send_pdamesg(usr) if("PDA - Show Message Log") if(isAI(usr)) var/mob/living/silicon/ai/AI = usr - AI.cmd_show_message_log() + AI.cmd_show_message_log(usr) if("Take Image") if(isAI(usr)) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 0d14455d3ce..44fcfb24521 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -972,17 +972,17 @@ var/global/list/obj/item/device/pda/PDAs = list() //AI verb and proc for sending PDA messages. -/mob/living/silicon/ai/proc/cmd_send_pdamesg() +/mob/living/silicon/ai/proc/cmd_send_pdamesg(mob/user as mob) var/list/names = list() var/list/plist = list() var/list/namecounts = list() - if(usr.stat == 2) - usr << "You can't send PDA messages because you are dead!" + if(user.stat == 2) + user << "You can't send PDA messages because you are dead!" return if(src.aiPDA.toff) - usr << "Turn on your receiver in order to send messages." + user << "Turn on your receiver in order to send messages." return for (var/obj/item/device/pda/P in get_viewable_pdas()) @@ -1001,7 +1001,7 @@ var/global/list/obj/item/device/pda/PDAs = list() plist[text("[name]")] = P - var/c = input(usr, "Please select a PDA") as null|anything in sortList(plist) + var/c = input(user, "Please select a PDA") as null|anything in sortList(plist) if (!c) return @@ -1035,15 +1035,15 @@ var/global/list/obj/item/device/pda/PDAs = list() else usr << "You do not have a PDA. You should make an issue report about this." -/mob/living/silicon/ai/proc/cmd_show_message_log() - if(usr.stat == 2) - usr << "You can't do that because you are dead!" +/mob/living/silicon/ai/proc/cmd_show_message_log(mob/user as mob) + if(user.stat == 2) + user << "You can't do that because you are dead!" return if(!isnull(aiPDA)) var/HTML = "AI PDA Message Log[aiPDA.tnote]" - usr << browse(HTML, "window=log;size=400x444;border=1;can_resize=1;can_close=1;can_minimize=0") + user << browse(HTML, "window=log;size=400x444;border=1;can_resize=1;can_close=1;can_minimize=0") else - usr << "You do not have a PDA. You should make an issue report about this." + user << "You do not have a PDA. You should make an issue report about this." //Some spare PDAs in a box /obj/item/weapon/storage/box/PDAs From b1cb6ceeff8ce4af0dd2ea477c6c8c6849bf2fff Mon Sep 17 00:00:00 2001 From: Firecage Date: Sun, 6 Jul 2014 19:49:54 +0200 Subject: [PATCH 34/41] Expanded list of what Apron/Coveralls can hold --- code/modules/clothing/suits/jobs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index b8eeb858a6b..f09f342c2f9 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -10,7 +10,7 @@ item_state = "apron" blood_overlay_type = "armor" body_parts_covered = CHEST|GROIN - allowed = list(/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/minihoe) + allowed = list(/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/minihoe,/obj/item/weapon/reagent_containers/spray/pestspray,/obj/item/weapon/hatchet,/obj/item/weapon/storage/bag/plants) //Captain /obj/item/clothing/suit/captunic From 13c880061833660ad31f5a5d867fe577544eea05 Mon Sep 17 00:00:00 2001 From: Firecage Date: Sun, 6 Jul 2014 21:39:37 +0200 Subject: [PATCH 35/41] Fixes Miauw said. --- code/modules/hydroponics/grown.dm | 312 +++++++++++----------- code/modules/hydroponics/growninedible.dm | 10 +- code/modules/hydroponics/seeds.dm | 4 +- 3 files changed, 165 insertions(+), 161 deletions(-) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 19a0677aea5..1d905a0c066 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -85,8 +85,8 @@ New(var/loc, var/potency = 40) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 10), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/cherries seed = "/obj/item/seeds/cherryseed" @@ -98,9 +98,9 @@ New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 15), 1)) - reagents.add_reagent("sugar", 1+round((potency / 15), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 15), 1)) + reagents.add_reagent("sugar", 1 + round((potency / 15), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/poppy seed = "/obj/item/seeds/poppyseed" @@ -112,9 +112,9 @@ New(var/loc, var/potency = 30) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - reagents.add_reagent("bicaridine", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 3, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 20), 1)) + reagents.add_reagent("bicaridine", 1 + round((potency / 10), 1)) + bitesize = 1 + round(reagents.total_volume / 3, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/harebell seed = "obj/item/seeds/harebellseed" @@ -126,8 +126,8 @@ New(var/loc, var/potency = 1) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 3, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 20), 1)) + bitesize = 1 + round(reagents.total_volume / 3, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/potato seed = "/obj/item/seeds/potatoseed" @@ -138,7 +138,7 @@ New(var/loc, var/potency = 25) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) + reagents.add_reagent("nutriment", 1 + round((potency / 10), 1)) bitesize = reagents.total_volume /obj/item/weapon/reagent_containers/food/snacks/grown/potato/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -165,9 +165,9 @@ New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - reagents.add_reagent("sugar", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 10), 1)) + reagents.add_reagent("sugar", 1 + round((potency / 5), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/greengrapes seed = "/obj/item/seeds/greengrapeseed" @@ -178,9 +178,9 @@ New(var/loc, var/potency = 25) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - reagents.add_reagent("kelotane", 3+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 10), 1)) + reagents.add_reagent("kelotane", 3 + round((potency / 5), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage seed = "/obj/item/seeds/cabbageseed" @@ -191,7 +191,7 @@ New(var/loc, var/potency = 25) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) + reagents.add_reagent("nutriment", 1 + round((potency / 10), 1)) bitesize = reagents.total_volume /obj/item/weapon/reagent_containers/food/snacks/grown/berries @@ -203,8 +203,8 @@ New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 10), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/glowberries seed = "/obj/item/seeds/glowberryseed" @@ -218,21 +218,21 @@ ..() if(reagents) reagents.add_reagent("nutriment", round((potency / 10), 1)) - reagents.add_reagent("uranium", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("uranium", 3 + round(potency / 5, 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/glowberries/Destroy() if(istype(loc,/mob)) - loc.AddLuminosity(round(-potency/5,1)) + loc.AddLuminosity(round(-potency / 5,1)) ..() /obj/item/weapon/reagent_containers/food/snacks/grown/glowberries/pickup(mob/user) src.SetLuminosity(0) - user.AddLuminosity(round(potency/5,1)) + user.AddLuminosity(round(potency / 5,1)) /obj/item/weapon/reagent_containers/food/snacks/grown/glowberries/dropped(mob/user) - user.AddLuminosity(round(-potency/5,1)) - src.SetLuminosity(round(potency/5,1)) + user.AddLuminosity(round(-potency / 5,1)) + src.SetLuminosity(round(potency / 5,1)) /obj/item/weapon/reagent_containers/food/snacks/grown/cocoapod seed = "/obj/item/seeds/cocoapodseed" @@ -243,9 +243,9 @@ New(var/loc, var/potency = 50) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - reagents.add_reagent("coco", 4+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 10), 1)) + reagents.add_reagent("coco", 4 + round((potency / 5), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/sugarcane seed = "/obj/item/seeds/sugarcaneseed" @@ -256,7 +256,7 @@ New(var/loc, var/potency = 50) ..() if(reagents) - reagents.add_reagent("sugar", 4+round((potency / 5), 1)) + reagents.add_reagent("sugar", 4 + round((potency / 5), 1)) /obj/item/weapon/reagent_containers/food/snacks/grown/poisonberries seed = "/obj/item/seeds/poisonberryseed" @@ -269,8 +269,8 @@ ..() if(reagents) reagents.add_reagent("nutriment", 1) - reagents.add_reagent("toxin", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("toxin", 3 + round(potency / 5, 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/deathberries seed = "/obj/item/seeds/deathberryseed" @@ -283,9 +283,9 @@ ..() if(reagents) reagents.add_reagent("nutriment", 1) - reagents.add_reagent("toxin", 3+round(potency / 3, 1)) - reagents.add_reagent("lexorin", 1+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("toxin", 3 + round(potency / 3, 1)) + reagents.add_reagent("lexorin", 1 + round(potency / 5, 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris seed = "/obj/item/seeds/ambrosiavulgaris" @@ -298,11 +298,11 @@ ..() if(reagents) reagents.add_reagent("nutriment", 1) - reagents.add_reagent("space_drugs", 1+round(potency / 8, 1)) - reagents.add_reagent("kelotane", 1+round(potency / 8, 1)) - reagents.add_reagent("bicaridine", 1+round(potency / 10, 1)) - reagents.add_reagent("toxin", 1+round(potency / 10, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("space_drugs", 1 + round(potency / 8, 1)) + reagents.add_reagent("kelotane", 1 + round(potency / 8, 1)) + reagents.add_reagent("bicaridine", 1 + round(potency / 10, 1)) + reagents.add_reagent("toxin", 1 + round(potency / 10, 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus seed = "/obj/item/seeds/ambrosiadeus" @@ -315,11 +315,11 @@ ..() if(reagents) reagents.add_reagent("nutriment", 1) - reagents.add_reagent("bicaridine", 1+round(potency / 8, 1)) - reagents.add_reagent("synaptizine", 1+round(potency / 8, 1)) - reagents.add_reagent("hyperzine", 1+round(potency / 10, 1)) - reagents.add_reagent("space_drugs", 1+round(potency / 10, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("bicaridine", 1 + round(potency / 8, 1)) + reagents.add_reagent("synaptizine", 1 + round(potency / 8, 1)) + reagents.add_reagent("hyperzine", 1 + round(potency / 10, 1)) + reagents.add_reagent("space_drugs", 1 + round(potency / 10, 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/apple seed = "/obj/item/seeds/appleseed" @@ -331,7 +331,7 @@ ..() if(reagents) reagents.maximum_volume = 20 - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) + reagents.add_reagent("nutriment", 1 + round((potency / 10), 1)) bitesize = reagents.maximum_volume // Always eat the apple in one /obj/item/weapon/reagent_containers/food/snacks/grown/apple/poisoned @@ -344,7 +344,7 @@ ..() if(reagents) reagents.maximum_volume = 20 - reagents.add_reagent("cyanide", 1+round((potency / 5), 1)) + reagents.add_reagent("cyanide", 1 + round((potency / 5), 1)) bitesize = reagents.maximum_volume // Always eat the apple in one /obj/item/weapon/reagent_containers/food/snacks/grown/goldapple @@ -356,9 +356,9 @@ New(var/loc, var/potency = 15) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - reagents.add_reagent("gold", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 10), 1)) + reagents.add_reagent("gold", 1 + round((potency / 5), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/goldapple/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() @@ -376,8 +376,8 @@ New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 6), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 6), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin seed = "/obj/item/seeds/pumpkinseed" @@ -388,8 +388,8 @@ New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 6), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 6), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -409,8 +409,8 @@ New(var/loc, var/potency = 20) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 20), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/lemon seed = "/obj/item/seeds/lemonseed" @@ -421,8 +421,8 @@ New(var/loc, var/potency = 20) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 20), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/orange seed = "/obj/item/seeds/orangeseed" @@ -433,8 +433,8 @@ New(var/loc, var/potency = 20) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 20), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/whitebeet seed = "/obj/item/seeds/whitebeetseed" @@ -446,8 +446,8 @@ ..() if(reagents) reagents.add_reagent("nutriment", round((potency / 20), 1)) - reagents.add_reagent("sugar", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("sugar", 1 + round((potency / 5), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/banana seed = "/obj/item/seeds/bananaseed" @@ -462,7 +462,7 @@ New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("banana", 1+round((potency / 10), 1)) + reagents.add_reagent("banana", 1 + round((potency / 10), 1)) bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/grown/chili @@ -474,9 +474,9 @@ New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 25), 1)) - reagents.add_reagent("capsaicin", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 25), 1)) + reagents.add_reagent("capsaicin", 3 + round(potency / 5, 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/chili/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() @@ -493,10 +493,10 @@ New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 25), 1)) - reagents.add_reagent("capsaicin", 8+round(potency / 2, 1)) - reagents.add_reagent("condensedcapsaicin", 4+round(potency / 4, 1)) - bitesize = 1+round(reagents.total_volume / 4, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 25), 1)) + reagents.add_reagent("capsaicin", 8 + round(potency / 2, 1)) + reagents.add_reagent("condensedcapsaicin", 4 + round(potency / 4, 1)) + bitesize = 1 + round(reagents.total_volume / 4, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chilli/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() @@ -530,10 +530,10 @@ New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 10), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) -obj/item/weapon/reagent_containers/food/snacks/grown/eggy +obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy seed = "/obj/item/seeds/eggyseed" name = "Egg-plant" desc = "There MUST be a chicken inside." @@ -541,11 +541,13 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 10), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) -obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user as mob) +obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/attack_self(mob/user as mob) + var/obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/E new /obj/item/weapon/reagent_containers/food/snacks/egg(user.loc) + usr.unEquip(E) qdel(src) /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans @@ -558,8 +560,8 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 20), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/koibeans seed = "/obj/item/seeds/koiseed" @@ -570,9 +572,9 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 30), 1)) - reagents.add_reagent("carpotoxin", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 30), 1)) + reagents.add_reagent("carpotoxin", 1 + round((potency / 20), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/moonflower seed = "/obj/item/seeds/moonflowerseed" @@ -583,9 +585,9 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) - reagents.add_reagent("moonshine", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 50), 1)) + reagents.add_reagent("moonshine", 1 + round((potency / 10), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) //tomaters /obj/item/weapon/reagent_containers/food/snacks/grown/tomato @@ -599,8 +601,8 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 10), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/proc/squish(atom/target) new splat(src.loc) @@ -623,8 +625,8 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 10), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/killer/attack_self(mob/user as mob) if(istype(user.loc,/turf/space)) @@ -654,9 +656,9 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - reagents.add_reagent("blood", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 10), 1)) + reagents.add_reagent("blood", 1 + round((potency / 5), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blue @@ -670,9 +672,9 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - reagents.add_reagent("lube", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 20), 1)) + reagents.add_reagent("lube", 1 + round((potency / 5), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blue/Crossed(AM as mob|obj) if (istype(AM, /mob/living/carbon)) @@ -691,9 +693,9 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 20) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - reagents.add_reagent("singulo", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 20), 1)) + reagents.add_reagent("singulo", 1 + round((potency / 5), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blue/bluespace/attack_self(var/mob/user) squish(user) @@ -703,7 +705,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blue/bluespace/squish(atom/squishee) ..() - var/teleport_radius = potency/10 + var/teleport_radius = potency / 10 if(isliving(squishee)) new /obj/effect/decal/cleanable/molten_item(squishee.loc) //Leave a pile of goo behind for dramatic effect... do_teleport(squishee, get_turf(squishee), teleport_radius) @@ -719,8 +721,8 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 25), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 25), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/grass seed = "/obj/item/seeds/grassseed" @@ -730,13 +732,13 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 50), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/grass/attack_self(mob/user as mob) user << "You prepare the astroturf." var/location = get_turf(user) - var/grassAmt = 1+round(potency / 50) // The grass we're holding + var/grassAmt = 1 + round(potency / 50) // The grass we're holding for(var/obj/item/weapon/reagent_containers/food/snacks/grown/grass/grassToConvert in location) // The grass on the floor grassAmt += 1 qdel(grassToConvert) @@ -755,9 +757,9 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) - reagents.add_reagent("anti_toxin", 1+round((potency / 25), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 50), 1)) + reagents.add_reagent("anti_toxin", 1 + round((potency / 25), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper seed = "/obj/item/seeds/icepepperseed" @@ -768,9 +770,9 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 20) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) - reagents.add_reagent("frostoil", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 50), 1)) + reagents.add_reagent("frostoil", 3 + round(potency / 5, 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() @@ -786,9 +788,9 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - reagents.add_reagent("imidazoline", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 20), 1)) + reagents.add_reagent("imidazoline", 3 + round(potency / 5, 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi seed = "/obj/item/seeds/reishimycelium" @@ -800,9 +802,9 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a ..() if(reagents) reagents.add_reagent("nutriment", 1) - reagents.add_reagent("anti_toxin", 3+round(potency / 3, 1)) - reagents.add_reagent("stoxin", 3+round(potency / 3, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("anti_toxin", 3 + round(potency / 3, 1)) + reagents.add_reagent("stoxin", 3 + round(potency / 3, 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() @@ -820,9 +822,9 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a ..() if(reagents) reagents.add_reagent("nutriment", 1) - reagents.add_reagent("amatoxin", 3+round(potency / 3, 1)) - reagents.add_reagent("mushroomhallucinogen", 1+round(potency / 25, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("amatoxin", 3 + round(potency / 3, 1)) + reagents.add_reagent("mushroomhallucinogen", 1 + round(potency / 25, 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() @@ -839,10 +841,10 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 35) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) - reagents.add_reagent("amatoxin", 13+round(potency / 3, 1)) - reagents.add_reagent("mushroomhallucinogen", 1+round(potency / 25, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 50), 1)) + reagents.add_reagent("amatoxin", 13 + round(potency / 3, 1)) + reagents.add_reagent("mushroomhallucinogen", 1 + round(potency / 25, 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/angel/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() @@ -859,9 +861,9 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 15) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) - reagents.add_reagent("mushroomhallucinogen", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 50), 1)) + reagents.add_reagent("mushroomhallucinogen", 3 + round(potency / 5, 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() @@ -877,8 +879,8 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 2+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 2 + round((potency / 10), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom seed = "/obj/item/seeds/walkingmushroom" @@ -888,8 +890,8 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 2+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 2 + round((potency / 10), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom/attack_self(mob/user as mob) if(istype(user.loc,/turf/space)) @@ -913,8 +915,8 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 25), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 25), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom seed = "/obj/item/seeds/glowshroom" @@ -934,18 +936,18 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a potency = 30 plant_type = 2 if(reagents) - reagents.add_reagent("radium", 1+round((potency / 20), 1)) + reagents.add_reagent("radium", 1 + round((potency / 20), 1)) if(istype(src.loc,/mob)) pickup(src.loc)//adjusts the lighting on the mob else - src.SetLuminosity(round(potency/10,1)) + src.SetLuminosity(round(potency / 10,1)) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/attack_self(mob/user as mob) if(istype(user.loc,/turf/space)) return var/obj/effect/glowshroom/planted = new /obj/effect/glowshroom(user.loc) - planted.delay = planted.delay - production*100 //So the delay goes DOWN with better stats instead of up. :I + planted.delay = planted.delay - production * 100 //So the delay goes DOWN with better stats instead of up. :I planted.endurance = endurance planted.yield = yield planted.potency = potency @@ -955,18 +957,18 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/Destroy() if(istype(loc,/mob)) - loc.AddLuminosity(round(-potency/10,1)) + loc.AddLuminosity(round(-potency / 10,1)) ..() /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/pickup(mob/user) SetLuminosity(0) - user.AddLuminosity(round(potency/10,1)) + user.AddLuminosity(round(potency / 10,1)) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/dropped(mob/user) - user.AddLuminosity(round(-potency/10,1)) - SetLuminosity(round(potency/10,1)) + user.AddLuminosity(round(-potency / 10,1)) + SetLuminosity(round(potency / 10,1)) -/obj/item/weapon/reagent_containers/food/snacks/grown/moneyfruit +/obj/item/weapon/reagent_containers/food/snacks/grown/shell/moneyfruit seed = "/obj/item/seeds/cashseed" name = "Money Fruit" desc = "Looks like a lemon with someone buldging from the inside." @@ -974,11 +976,12 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 10) ..() if(reagents) - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("nutriment", 1 + round((potency / 20), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) -/obj/item/weapon/reagent_containers/food/snacks/grown/moneyfruit/attack_self(mob/user as mob) +/obj/item/weapon/reagent_containers/food/snacks/grown/shell/moneyfruit/attack_self(mob/user as mob) + var/obj/item/weapon/reagent_containers/food/snacks/grown/shell/moneyfruit/M switch(potency) if(0 to 10) new/obj/item/weapon/spacecash/(user.loc) @@ -996,6 +999,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a new/obj/item/weapon/spacecash/c500(user.loc) else new/obj/item/weapon/spacecash/c1000(user.loc) + usr.unEquip(M) qdel(src) /obj/item/weapon/reagent_containers/food/snacks/grown/gatfruit @@ -1008,11 +1012,11 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 60) ..() if(reagents) - reagents.add_reagent("sulfur", 1+round((potency / 10), 1)) - reagents.add_reagent("carbon", 1+round((potency / 10), 1)) - reagents.add_reagent("nitrogen", 1+round((potency / 15), 1)) - reagents.add_reagent("potassium", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + reagents.add_reagent("sulfur", 1 + round((potency / 10), 1)) + reagents.add_reagent("carbon", 1 + round((potency / 10), 1)) + reagents.add_reagent("nitrogen", 1 + round((potency / 15), 1)) + reagents.add_reagent("potassium", 1 + round((potency / 20), 1)) + bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/coffee_arabica @@ -1024,7 +1028,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 20) ..() if(reagents) - reagents.add_reagent("coffeepowder", 1+round((potency / 10), 2)) + reagents.add_reagent("coffeepowder", 1 + round((potency / 10), 2)) /obj/item/weapon/reagent_containers/food/snacks/grown/coffee_robusta seed = "/obj/item/seeds/coffee_robusta_seed" @@ -1035,8 +1039,8 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 20) ..() if(reagents) - reagents.add_reagent("coffeepowder", 1+round((potency / 10), 2)) - reagents.add_reagent("hyperzine", 1+round((potency / 20), 1)) + reagents.add_reagent("coffeepowder", 1 + round((potency / 10), 2)) + reagents.add_reagent("hyperzine", 1 + round((potency / 20), 1)) /obj/item/weapon/reagent_containers/food/snacks/grown/tobacco seed = "/obj/item/seeds/tobacco_seed" @@ -1057,7 +1061,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 20) ..() if(reagents) - reagents.add_reagent("dexalin", 1+round((potency / 20), 1)) + reagents.add_reagent("dexalin", 1 + round((potency / 20), 1)) /obj/item/weapon/reagent_containers/food/snacks/grown/tea_aspera @@ -1069,7 +1073,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 20) ..() if(reagents) - reagents.add_reagent("teapowder", 1+round((potency / 10), 2)) + reagents.add_reagent("teapowder", 1 + round((potency / 10), 2)) /obj/item/weapon/reagent_containers/food/snacks/grown/tea_astra @@ -1081,5 +1085,5 @@ obj/item/weapon/reagent_containers/food/snacks/grown/eggy/attack_self(mob/user a New(var/loc, var/potency = 20) ..() if(reagents) - reagents.add_reagent("teapowder", 1+round((potency / 10), 2)) - reagents.add_reagent("kelotane", 1+round((potency / 20), 1)) + reagents.add_reagent("teapowder", 1 + round((potency / 10), 2)) + reagents.add_reagent("kelotane", 1 + round((potency / 20), 1)) diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index 0bc9e165aa0..59ab953b903 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -59,10 +59,10 @@ ..() if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || (istype(W, /obj/item/weapon/twohanded/fireaxe) && W:wielded) || istype(W, /obj/item/weapon/melee/energy)) user.show_message("You make planks out of the [src]!", 1) - for(var/i=0,i<2,i++) + for(var/i = 0,i < 2,i++) var/obj/item/stack/sheet/mineral/wood/NG = new (user.loc) for (var/obj/item/stack/sheet/mineral/wood/G in user.loc) - if(G==NG) + if(G == NG) continue if(G.amount >= G.max_amount) continue @@ -122,7 +122,7 @@ if(reagents) reagents.add_reagent("nutriment", 1) reagents.add_reagent("capsaicin", round(potency, 1)) - force = round((5+potency/5), 1) + force = round((5 + potency / 5), 1) /obj/item/weapon/grown/nettle // -- Skie desc = "It's probably not wise to touch it with bare hands..." @@ -144,7 +144,7 @@ if(reagents) reagents.add_reagent("nutriment", 1) reagents.add_reagent("sacid", round(potency, 1)) - force = round((5+potency/5), 1) + force = round((5 + potency / 5), 1) /obj/item/weapon/grown/deathnettle // -- Skie desc = "The \red glowing \black nettle incites \red rage\black in you just from looking at it!" @@ -167,7 +167,7 @@ if(reagents) reagents.add_reagent("nutriment", 1) reagents.add_reagent("pacid", round(potency, 1)) - force = round((5+potency/2.5), 1) + force = round((5 + potency / 2.5), 1) /obj/item/weapon/grown/deathnettle/suicide_act(mob/user) user.visible_message("[user] is eating some of the [src.name]! It looks like \he's trying to commit suicide.") diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index e5d9777107a..bf6f64abc51 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -205,7 +205,7 @@ icon_state = "seed-eggy" species = "eggy" plantname = "Eggplants" - product = /obj/item/weapon/reagent_containers/food/snacks/grown/eggy + product = /obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy lifespan = 75 endurance = 15 maturation = 6 @@ -907,7 +907,7 @@ icon_state = "seed-cash" species = "cashtree" plantname = "Money Tree" - product = /obj/item/weapon/reagent_containers/food/snacks/grown/moneyfruit + product = /obj/item/weapon/reagent_containers/food/snacks/grown/shell/moneyfruit lifespan = 55 endurance = 45 maturation = 6 From 6fc59fee6ef83aa798035596c84a2829d690ef4a Mon Sep 17 00:00:00 2001 From: Firecage Date: Mon, 7 Jul 2014 12:52:46 +0200 Subject: [PATCH 36/41] More spaces because Miauww is a picky ass --- code/modules/hydroponics/hydroitemcode.dm | 26 ++-- code/modules/hydroponics/hydroponics.dm | 158 +++++++++++----------- 2 files changed, 92 insertions(+), 92 deletions(-) diff --git a/code/modules/hydroponics/hydroitemcode.dm b/code/modules/hydroponics/hydroitemcode.dm index ad753622869..ad944d5dac5 100644 --- a/code/modules/hydroponics/hydroitemcode.dm +++ b/code/modules/hydroponics/hydroitemcode.dm @@ -12,12 +12,12 @@ if(!..()) return if(istype(M, /mob/living)) M << "\red You are heated by the warmth of the of the [name]!" - M.bodytemperature += potency/2 * TEMPERATURE_DAMAGE_COEFFICIENT + M.bodytemperature += potency / 2 * TEMPERATURE_DAMAGE_COEFFICIENT /obj/item/weapon/grown/novaflower/afterattack(atom/A as mob|obj, mob/user as mob,proximity) if(!proximity) return if(endurance > 0) - endurance -= rand(1,(endurance/3)+1) + endurance -= rand(1, (endurance / 3) + 1) else usr << "All the petals have fallen off the [name] from violent whacking." usr.unEquip(src) @@ -26,7 +26,7 @@ /obj/item/weapon/grown/novaflower/pickup(mob/living/carbon/human/user as mob) if(!user.gloves) user << "\red The [name] burns your bare hand!" - user.adjustFireLoss(rand(1,5)) + user.adjustFireLoss(rand(1, 5)) //Nettle /obj/item/weapon/grown/nettle/pickup(mob/living/carbon/human/user as mob) @@ -35,7 +35,7 @@ if(istype(user, /mob/living/carbon/human)) var/organ = ((user.hand ? "l_":"r_") + "arm") var/obj/item/organ/limb/affecting = user.get_organ(organ) - if(affecting.take_damage(0,force)) + if(affecting.take_damage(0, force)) user.update_damage_overlays(0) else user.take_organ_damage(0,force) @@ -43,7 +43,7 @@ /obj/item/weapon/grown/nettle/afterattack(atom/A as mob|obj, mob/user as mob,proximity) if(!proximity) return if(force > 0) - force -= rand(1,(force/3)+1) // When you whack someone with it, leaves fall off + force -= rand(1, (force / 3) + 1) // When you whack someone with it, leaves fall off else usr << "All the leaves have fallen off the nettle from violent whacking." usr.unEquip(src) @@ -51,7 +51,7 @@ /obj/item/weapon/grown/nettle/changePotency(newValue) //-QualityVan ..() - force = round((5+potency/5), 1) + force = round((5 + potency / 5), 1) //Deathnettle /obj/item/weapon/grown/deathnettle/pickup(mob/living/carbon/human/user as mob) @@ -59,10 +59,10 @@ if(istype(user, /mob/living/carbon/human)) var/organ = ((user.hand ? "l_":"r_") + "arm") var/obj/item/organ/limb/affecting = user.get_organ(organ) - if(affecting.take_damage(0,force)) + if(affecting.take_damage(0, force)) user.update_damage_overlays(0) else - user.take_organ_damage(0,force) + user.take_organ_damage(0, force) if(prob(50)) user.Paralyse(5) user << "\red You are stunned by the Deathnettle when you try picking it up!" @@ -71,18 +71,18 @@ if(!..()) return if(istype(M, /mob/living)) M << "\red You are stunned by the powerful acid of the Deathnettle!" - add_logs(user, M, "attacked", object="[src.name]") + add_logs(user, M, "attacked", object= "[src.name]") M.eye_blurry += force/7 if(prob(20)) - M.Paralyse(force/6) - M.Weaken(force/15) + M.Paralyse(force / 6) + M.Weaken(force / 15) M.drop_item() /obj/item/weapon/grown/deathnettle/afterattack(atom/A as mob|obj, mob/user as mob,proximity) if(!proximity) return if (force > 0) - force -= rand(1,(force/3)+1) // When you whack someone with it, leaves fall off + force -= rand(1,(force / 3) + 1) // When you whack someone with it, leaves fall off else usr << "All the leaves have fallen off the deathnettle from violent whacking." @@ -91,7 +91,7 @@ /obj/item/weapon/grown/deathnettle/changePotency(newValue) //-QualityVan ..() - force = round((5+potency/2.5), 1) + force = round((5 + potency / 2.5), 1) //Corncob diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 7fdf8c0b098..d05bc4d677b 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -90,7 +90,7 @@ if(myseed.yield == 0)//Oh god don't divide by zero you'll doom us all. adjustSYield(1) //world << "Yield increased by 1, from 0, to a total of [myseed.yield]" - else if(prob(1/(myseed.yield * myseed.yield) *100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2... + else if(prob(1/(myseed.yield * myseed.yield) * 100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2... adjustSYield(1) //world << "Yield increased by 1, to a total of [myseed.yield]" else @@ -233,7 +233,7 @@ obj/machinery/hydroponics/update_icon() for(var/Dir in cardinal) var/obj/machinery/hydroponics/t = locate() in get_step(src,Dir) - if(t && t.anchored==2 && src.anchored==2) + if(t && t.anchored == 2 && src.anchored == 2) n += Dir icon_state = "hoses-[n]" @@ -242,29 +242,29 @@ obj/machinery/hydroponics/update_icon() if(planted) if(dead) - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-dead") + overlays += image('icons/obj/hydroponics.dmi', icon_state = "[myseed.species]-dead") else if(harvest) if(myseed.plant_type == 2) // Shrooms don't have a -harvest graphic - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[myseed.growthstages]") + overlays += image('icons/obj/hydroponics.dmi', icon_state = "[myseed.species]-grow[myseed.growthstages]") else - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-harvest") + overlays += image('icons/obj/hydroponics.dmi', icon_state = "[myseed.species]-harvest") else if(age < myseed.maturation) var/t_growthstate = ((age / myseed.maturation) * myseed.growthstages ) // Make sure it won't crap out due to HERPDERP 6 stages only - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[round(t_growthstate)]") + overlays += image('icons/obj/hydroponics.dmi', icon_state = "[myseed.species]-grow[round(t_growthstate)]") lastproduce = age //Cheating by putting this here, it means that it isn't instantly ready to harvest else - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[myseed.growthstages]") // Same + overlays += image('icons/obj/hydroponics.dmi', icon_state = "[myseed.species]-grow[myseed.growthstages]") // Same if(waterlevel <= 10) - overlays += image('icons/obj/hydroponics.dmi', icon_state="over_lowwater3") + overlays += image('icons/obj/hydroponics.dmi', icon_state =" over_lowwater3") if(nutrilevel <= 2) - overlays += image('icons/obj/hydroponics.dmi', icon_state="over_lownutri3") + overlays += image('icons/obj/hydroponics.dmi', icon_state = "over_lownutri3") if(health <= (myseed.endurance / 2)) - overlays += image('icons/obj/hydroponics.dmi', icon_state="over_lowhealth3") + overlays += image('icons/obj/hydroponics.dmi', icon_state = "over_lowhealth3") if(weedlevel >= 5 || pestlevel >= 5 || toxic >= 40) - overlays += image('icons/obj/hydroponics.dmi', icon_state="over_alert3") + overlays += image('icons/obj/hydroponics.dmi', icon_state = "over_alert3") if(harvest) - overlays += image('icons/obj/hydroponics.dmi', icon_state="over_harvest3") + overlays += image('icons/obj/hydroponics.dmi', icon_state = "over_harvest3") if(istype(myseed,/obj/item/seeds/glowshroom)) SetLuminosity(round(myseed.potency / 10)) @@ -318,7 +318,7 @@ obj/machinery/hydroponics/proc/weedinvasion() // If a weed growth is sufficient, visible_message("[oldPlantName] overtaken by [myseed.plantname].") -obj/machinery/hydroponics/proc/mutate(var/lifemut=2, var/endmut=5, var/productmut=1, var/yieldmut=2, var/potmut=25) // Mutates the current seed +obj/machinery/hydroponics/proc/mutate(var/lifemut = 2, var/endmut = 5, var/productmut = 1, var/yieldmut = 2, var/potmut = 25) // Mutates the current seed if(!planted) return adjustSLife(rand(-lifemut,lifemut)) @@ -421,146 +421,146 @@ obj/machinery/hydroponics/proc/applyChemicals(var/datum/reagents/S) // After handling the mutating, we now handle the damage from adding crude radioactives... if(S.has_reagent("uranium", 1)) - adjustHealth(-round(S.get_reagent_amount("uranium")*1)) - adjustToxic(round(S.get_reagent_amount("uranium")*2)) + adjustHealth(-round(S.get_reagent_amount("uranium") * 1)) + adjustToxic(round(S.get_reagent_amount("uranium") * 2)) if(S.has_reagent("radium", 1)) - adjustHealth(-round(S.get_reagent_amount("radium")*1)) - adjustToxic(round(S.get_reagent_amount("radium")*3)) // Radium is harsher (OOC: also easier to produce) + adjustHealth(-round(S.get_reagent_amount("radium") * 1)) + adjustToxic(round(S.get_reagent_amount("radium") * 3)) // Radium is harsher (OOC: also easier to produce) // Nutriments if(S.has_reagent("eznutriment", 1)) yieldmod = 1 mutmod = 1 - adjustNutri(round(S.get_reagent_amount("eznutriment")*1)) + adjustNutri(round(S.get_reagent_amount("eznutriment") * 1)) if(S.has_reagent("left4zednutriment", 1)) yieldmod = 0 mutmod = 2 - adjustNutri(round(S.get_reagent_amount("left4zednutriment")*1)) + adjustNutri(round(S.get_reagent_amount("left4zednutriment") * 1)) if(S.has_reagent("robustharvestnutriment", 1)) yieldmod = 2 mutmod = 0 - adjustNutri(round(S.get_reagent_amount("robustharvestnutriment")*1)) + adjustNutri(round(S.get_reagent_amount("robustharvestnutriment") *1 )) // Antitoxin binds shit pretty well. So the tox goes significantly down if(S.has_reagent("anti_toxin", 1)) - adjustToxic(-round(S.get_reagent_amount("anti_toxin")*2)) + adjustToxic(-round(S.get_reagent_amount("anti_toxin") * 2)) // NIGGA, YOU JUST WENT ON FULL RETARD. if(S.has_reagent("toxin", 1)) - adjustToxic(round(S.get_reagent_amount("toxin")*2)) + adjustToxic(round(S.get_reagent_amount("toxin") * 2)) // Milk is good for humans, but bad for plants. The sugars canot be used by plants, and the milk fat fucks up growth. Not shrooms though. I can't deal with this now... if(S.has_reagent("milk", 1)) - adjustNutri(round(S.get_reagent_amount("milk")*0.1)) - adjustWater(round(S.get_reagent_amount("milk")*0.9)) + adjustNutri(round(S.get_reagent_amount("milk") * 0.1)) + adjustWater(round(S.get_reagent_amount("milk") * 0.9)) // Beer is a chemical composition of alcohol and various other things. It's a shitty nutrient but hey, it's still one. Also alcohol is bad, mmmkay? if(S.has_reagent("beer", 1)) - adjustHealth(-round(S.get_reagent_amount("beer")*0.05)) - adjustNutri(round(S.get_reagent_amount("beer")*0.25)) - adjustWater(round(S.get_reagent_amount("beer")*0.7)) + adjustHealth(-round(S.get_reagent_amount("beer") * 0.05)) + adjustNutri(round(S.get_reagent_amount("beer") * 0.25)) + adjustWater(round(S.get_reagent_amount("beer") * 0.7)) // You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial if(S.has_reagent("fluorine", 1)) - adjustHealth(-round(S.get_reagent_amount("fluorine")*2)) - adjustToxic(round(S.get_reagent_amount("flourine")*2.5)) - adjustWater(-round(S.get_reagent_amount("flourine")*0.5)) + adjustHealth(-round(S.get_reagent_amount("fluorine") * 2)) + adjustToxic(round(S.get_reagent_amount("flourine") * 2.5)) + adjustWater(-round(S.get_reagent_amount("flourine") * 0.5)) adjustWeeds(-rand(1,4)) // You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial if(S.has_reagent("chlorine", 1)) - adjustHealth(-round(S.get_reagent_amount("chlorine")*1)) - adjustToxic(round(S.get_reagent_amount("chlorine")*1.5)) - adjustWater(-round(S.get_reagent_amount("chlorine")*0.5)) + adjustHealth(-round(S.get_reagent_amount("chlorine") * 1)) + adjustToxic(round(S.get_reagent_amount("chlorine") * 1.5)) + adjustWater(-round(S.get_reagent_amount("chlorine") * 0.5)) adjustWeeds(-rand(1,3)) // White Phosphorous + water -> phosphoric acid. That's not a good thing really. Phosphoric salts are beneficial though. And even if the plant suffers, in the long run the tray gets some nutrients. The benefit isn't worth that much. if(S.has_reagent("phosphorus", 1)) - adjustHealth(-round(S.get_reagent_amount("phosphorus")*0.75)) - adjustNutri(round(S.get_reagent_amount("phosphorus")*0.1)) - adjustWater(-round(S.get_reagent_amount("phosphorus")*0.5)) + adjustHealth(-round(S.get_reagent_amount("phosphorus") * 0.75)) + adjustNutri(round(S.get_reagent_amount("phosphorus") * 0.1)) + adjustWater(-round(S.get_reagent_amount("phosphorus") * 0.5)) adjustWeeds(-rand(1,2)) // Plants should not have sugar, they can't use it and it prevents them getting water/ nutients, it is good for mold though... if(S.has_reagent("sugar", 1)) adjustWeeds(rand(1,2)) adjustPests(rand(1,2)) - adjustNutri(round(S.get_reagent_amount("sugar")*0.1)) + adjustNutri(round(S.get_reagent_amount("sugar") * 0.1)) // It is water! if(S.has_reagent("water", 1)) - adjustWater(round(S.get_reagent_amount("water")*1)) + adjustWater(round(S.get_reagent_amount("water") * 1)) // Holy water. Mostly the same as water, it also heals the plant a little with the power of the spirits~ if(S.has_reagent("holywater", 1)) - adjustWater(round(S.get_reagent_amount("holywater")*1)) - adjustHealth(round(S.get_reagent_amount("holywater")*0.1)) + adjustWater(round(S.get_reagent_amount("holywater") * 1)) + adjustHealth(round(S.get_reagent_amount("holywater") * 0.1)) // A variety of nutrients are dissolved in club soda, without sugar. These nutrients include carbon, oxygen, hydrogen, phosphorous, potassium, sulfur and sodium, all of which are needed for healthy plant growth. if(S.has_reagent("sodawater", 1)) - adjustWater(round(S.get_reagent_amount("sodawater")*1)) - adjustHealth(round(S.get_reagent_amount("sodawater")*0.1)) - adjustNutri(round(S.get_reagent_amount("sodawater")*0.1)) + adjustWater(round(S.get_reagent_amount("sodawater") * 1)) + adjustHealth(round(S.get_reagent_amount("sodawater") * 0.1)) + adjustNutri(round(S.get_reagent_amount("sodawater") * 0.1)) // Man, you guys are retards if(S.has_reagent("sacid", 1)) - adjustHealth(-round(S.get_reagent_amount("sacid")*1)) - adjustToxic(round(S.get_reagent_amount("sacid")*1.5)) + adjustHealth(-round(S.get_reagent_amount("sacid") * 1)) + adjustToxic(round(S.get_reagent_amount("sacid") * 1.5)) adjustWeeds(-rand(1,2)) // SERIOUSLY if(S.has_reagent("pacid", 1)) - adjustHealth(-round(S.get_reagent_amount("pacid")*2)) - adjustToxic(round(S.get_reagent_amount("pacid")*3)) + adjustHealth(-round(S.get_reagent_amount("pacid") * 2)) + adjustToxic(round(S.get_reagent_amount("pacid") * 3)) adjustWeeds(-rand(1,4)) // Plant-B-Gone is just as bad if(S.has_reagent("plantbgone", 1)) - adjustHealth(-round(S.get_reagent_amount("plantbgone")*2)) - adjustToxic(-round(S.get_reagent_amount("plantbgone")*3)) + adjustHealth(-round(S.get_reagent_amount("plantbgone") * 5)) + adjustToxic(-round(S.get_reagent_amount("plantbgone") * 6)) adjustWeeds(-rand(4,8)) //Weed Spray if(S.has_reagent("weedkiller", 1)) - adjustToxic(round(S.get_reagent_amount("weedkiller")*0.5)) + adjustToxic(round(S.get_reagent_amount("weedkiller") * 0.5)) //old toxicity was 4, each spray is default 10 (minimal of 5) so 5 and 2.5 are the new ammounts adjustWeeds(-rand(1,2)) //Pest Spray if(S.has_reagent("pestkiller", 1)) - adjustToxic(round(S.get_reagent_amount("pestkiller")*0.5)) + adjustToxic(round(S.get_reagent_amount("pestkiller") * 0.5)) adjustPests(-rand(1,2)) // Healing if(S.has_reagent("cryoxadone", 1)) - adjustHealth(round(S.get_reagent_amount("cryoxadone")*3)) - adjustToxic(-round(S.get_reagent_amount("cryoxadone")*3)) + adjustHealth(round(S.get_reagent_amount("cryoxadone") * 3)) + adjustToxic(-round(S.get_reagent_amount("cryoxadone") * 3)) // Ammonia is bad ass. if(S.has_reagent("ammonia", 1)) - adjustHealth(round(S.get_reagent_amount("ammonia")*0.5)) - adjustNutri(round(S.get_reagent_amount("ammonia")*1)) - adjustSYield(round(S.get_reagent_amount("ammonia")*0.01)) + adjustHealth(round(S.get_reagent_amount("ammonia") * 0.5)) + adjustNutri(round(S.get_reagent_amount("ammonia") * 1)) + adjustSYield(round(S.get_reagent_amount("ammonia") * 0.01)) // This is more bad ass, and pests get hurt by the corrosive nature of it, not the plant. if(S.has_reagent("diethylamine", 1)) - adjustHealth(round(S.get_reagent_amount("diethylamine")*1)) - adjustNutri(round(S.get_reagent_amount("diethylamine")*2)) - adjustSYield(round(S.get_reagent_amount("diethylamine")*0.02)) + adjustHealth(round(S.get_reagent_amount("diethylamine") * 1)) + adjustNutri(round(S.get_reagent_amount("diethylamine") * 2)) + adjustSYield(round(S.get_reagent_amount("diethylamine") * 0.02)) adjustPests(-rand(1,2)) // Compost, effectively if(S.has_reagent("nutriment", 1)) - adjustHealth(round(S.get_reagent_amount("nutriment")*0.5)) - adjustNutri(round(S.get_reagent_amount("nutriment")*1)) + adjustHealth(round(S.get_reagent_amount("nutriment") * 0.5)) + adjustNutri(round(S.get_reagent_amount("nutriment") * 1)) // The best stuff there is. For testing/debugging. if(S.has_reagent("adminordrazine", 1)) - adjustWater(round(S.get_reagent_amount("adminordrazine")*1)) - adjustHealth(round(S.get_reagent_amount("adminordrazine")*1)) - adjustNutri(round(S.get_reagent_amount("adminordrazine")*1)) + adjustWater(round(S.get_reagent_amount("adminordrazine") * 1)) + adjustHealth(round(S.get_reagent_amount("adminordrazine") * 1)) + adjustNutri(round(S.get_reagent_amount("adminordrazine") * 1)) adjustPests(-rand(1,5)) adjustWeeds(-rand(1,5)) if(S.has_reagent("adminordrazine", 5)) @@ -669,19 +669,19 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) user << "-Plant Production: [myseed.production]" if(myseed.potency != -1) user << "-Plant Potency: [myseed.potency]" - user << "-Weed level: [weedlevel]/10" - user << "-Pest level: [pestlevel]/10" - user << "-Toxicity level: [toxic]/100" - user << "-Water level: [waterlevel]/[maxwater]" - user << "-Nutrition level: [nutrilevel]/[maxnutri]" + user << "-Weed level: [weedlevel] / 10" + user << "-Pest level: [pestlevel] / 10" + user << "-Toxicity level: [toxic] / 100" + user << "-Water level: [waterlevel] / [maxwater]" + user << "-Nutrition level: [nutrilevel] / [maxnutri]" user << "" else user << "No plant found." - user << "-Weed level: [weedlevel]/10" - user << "-Pest level: [pestlevel]/10" - user << "-Toxicity level: [toxic]/100" - user << "-Water level: [waterlevel]/[maxwater]" - user << "-Nutrition level: [nutrilevel]/[maxnutri]" + user << "-Weed level: [weedlevel] / 10" + user << "-Pest level: [pestlevel] / 10" + user << "-Toxicity level: [toxic] / 100" + user << "-Water level: [waterlevel] / [maxwater]" + user << "-Nutrition level: [nutrilevel] / [maxnutri]" user << "" else if(istype(O, /obj/item/weapon/minihoe)) @@ -1044,18 +1044,18 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) if(planted) if(dead) - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-dead") + overlays += image('icons/obj/hydroponics.dmi', icon_state= "[myseed.species]-dead") else if(harvest) if(myseed.plant_type == 2) // Shrooms don't have a -harvest graphic - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[myseed.growthstages]") + overlays += image('icons/obj/hydroponics.dmi', icon_state= "[myseed.species]-grow[myseed.growthstages]") else - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-harvest") + overlays += image('icons/obj/hydroponics.dmi', icon_state= "[myseed.species]-harvest") else if(age < myseed.maturation) var/t_growthstate = ((age / myseed.maturation) * myseed.growthstages ) - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[round(t_growthstate)]") + overlays += image('icons/obj/hydroponics.dmi', icon_state= "[myseed.species]-grow[round(t_growthstate)]") lastproduce = age else - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[myseed.growthstages]") + overlays += image('icons/obj/hydroponics.dmi', icon_state= "[myseed.species]-grow[myseed.growthstages]") if(!luminosity) if(istype(myseed,/obj/item/seeds/glowshroom)) From 5d91d59fa22e0bee8c975df94047240a17780b90 Mon Sep 17 00:00:00 2001 From: Firecage Date: Mon, 7 Jul 2014 14:57:24 +0200 Subject: [PATCH 37/41] MWAHAHAHHAHAHAHAH --- code/modules/hydroponics/grown.dm | 58 +++++++++++++++---------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 1d905a0c066..76556c0b439 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -533,6 +533,14 @@ reagents.add_reagent("nutriment", 1 + round((potency / 10), 1)) bitesize = 1 + round(reagents.total_volume / 2, 1) +/obj/item/weapon/reagent_containers/food/snacks/grown/shell/ + var/inside_type = null + +/obj/item/weapon/reagent_containers/food/snacks/grown/shell/attack_self(mob/user as mob) + new inside_type(user.loc) + user.unEquip(src) + qdel(src) + obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy seed = "/obj/item/seeds/eggyseed" name = "Egg-plant" @@ -543,12 +551,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy if(reagents) reagents.add_reagent("nutriment", 1 + round((potency / 10), 1)) bitesize = 1 + round(reagents.total_volume / 2, 1) - -obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/attack_self(mob/user as mob) - var/obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/E - new /obj/item/weapon/reagent_containers/food/snacks/egg(user.loc) - usr.unEquip(E) - qdel(src) + inside_type = /obj/item/weapon/reagent_containers/food/snacks/egg /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans seed = "/obj/item/seeds/soyaseed" @@ -973,34 +976,29 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/attack_self(mob/ name = "Money Fruit" desc = "Looks like a lemon with someone buldging from the inside." icon_state = "moneyfruit" - New(var/loc, var/potency = 10) + inside_type = null + New() ..() if(reagents) reagents.add_reagent("nutriment", 1 + round((potency / 20), 1)) bitesize = 1 + round(reagents.total_volume / 2, 1) - - -/obj/item/weapon/reagent_containers/food/snacks/grown/shell/moneyfruit/attack_self(mob/user as mob) - var/obj/item/weapon/reagent_containers/food/snacks/grown/shell/moneyfruit/M - switch(potency) - if(0 to 10) - new/obj/item/weapon/spacecash/(user.loc) - if(11 to 20) - new/obj/item/weapon/spacecash/c10(user.loc) - if(21 to 30) - new/obj/item/weapon/spacecash/c20(user.loc) - if(31 to 40) - new/obj/item/weapon/spacecash/c50(user.loc) - if(41 to 50) - new/obj/item/weapon/spacecash/c100(user.loc) - if(51 to 60) - new/obj/item/weapon/spacecash/c200(user.loc) - if(61 to 80) - new/obj/item/weapon/spacecash/c500(user.loc) - else - new/obj/item/weapon/spacecash/c1000(user.loc) - usr.unEquip(M) - qdel(src) + switch(potency) + if(0 to 10) + inside_type = /obj/item/weapon/spacecash/ + if(11 to 20) + inside_type = /obj/item/weapon/spacecash/c10 + if(21 to 30) + inside_type = /obj/item/weapon/spacecash/c20 + if(31 to 40) + inside_type = /obj/item/weapon/spacecash/c50 + if(41 to 50) + inside_type = /obj/item/weapon/spacecash/c100 + if(51 to 60) + inside_type = /obj/item/weapon/spacecash/c200 + if(61 to 80) + inside_type = /obj/item/weapon/spacecash/c500 + else + inside_type = /obj/item/weapon/spacecash/c1000 /obj/item/weapon/reagent_containers/food/snacks/grown/gatfruit seed = "/obj/item/seeds/gatfruit" From e2ca58aa8100cf5e9823b7c3bebd4b06955bd092 Mon Sep 17 00:00:00 2001 From: Firecage Date: Mon, 7 Jul 2014 15:15:43 +0200 Subject: [PATCH 38/41] Moar empty liiiiiiines --- code/modules/hydroponics/grown.dm | 56 +++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 76556c0b439..eac34423920 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -95,6 +95,7 @@ icon_state = "cherry" gender = PLURAL dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/cherries + New(var/loc, var/potency = 10) ..() if(reagents) @@ -109,6 +110,7 @@ icon_state = "poppy" slot_flags = SLOT_HEAD dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/poppy + New(var/loc, var/potency = 30) ..() if(reagents) @@ -123,6 +125,7 @@ icon_state = "harebell" slot_flags = SLOT_HEAD dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/harebell + New(var/loc, var/potency = 1) ..() if(reagents) @@ -135,6 +138,7 @@ desc = "Boil 'em! Mash 'em! Stick 'em in a stew!" icon_state = "potato" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/potato + New(var/loc, var/potency = 25) ..() if(reagents) @@ -162,6 +166,7 @@ desc = "Nutritious!" icon_state = "grapes" dried_type = /obj/item/weapon/reagent_containers/food/snacks/no_raisin + New(var/loc, var/potency = 10) ..() if(reagents) @@ -175,6 +180,7 @@ desc = "Nutritious!" icon_state = "greengrapes" dried_type = /obj/item/weapon/reagent_containers/food/snacks/no_raisin + New(var/loc, var/potency = 25) ..() if(reagents) @@ -188,6 +194,7 @@ desc = "Ewwwwwwwwww. Cabbage." icon_state = "cabbage" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage + New(var/loc, var/potency = 25) ..() if(reagents) @@ -200,6 +207,7 @@ desc = "Nutritious!" icon_state = "berrypile" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/berries + New(var/loc, var/potency = 10) ..() if(reagents) @@ -214,6 +222,7 @@ var/brightness_on = 2 //luminosity when on icon_state = "glowberrypile" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/glowberries + New(var/loc, var/potency = 10) ..() if(reagents) @@ -240,6 +249,7 @@ desc = "Fattening... Mmmmm... chucklate." icon_state = "cocoapod" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/cocoapod + New(var/loc, var/potency = 50) ..() if(reagents) @@ -253,6 +263,7 @@ desc = "Sickly sweet." icon_state = "sugarcane" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/sugarcane + New(var/loc, var/potency = 50) ..() if(reagents) @@ -265,6 +276,7 @@ icon_state = "poisonberrypile" gender = PLURAL dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/poisonberries + New(var/loc, var/potency = 15) ..() if(reagents) @@ -279,6 +291,7 @@ icon_state = "deathberrypile" gender = PLURAL dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/deathberries + New(var/loc, var/potency = 50) ..() if(reagents) @@ -294,6 +307,7 @@ icon_state = "ambrosiavulgaris" slot_flags = SLOT_HEAD dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris + New(var/loc, var/potency = 10) ..() if(reagents) @@ -311,6 +325,7 @@ icon_state = "ambrosiadeus" slot_flags = SLOT_HEAD dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus + New(var/loc, var/potency = 10) ..() if(reagents) @@ -327,6 +342,7 @@ desc = "It's a little piece of Eden." icon_state = "apple" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/apple + New(var/loc, var/potency = 15) ..() if(reagents) @@ -340,6 +356,7 @@ desc = "It's a little piece of Eden." icon_state = "apple" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/apple/poisoned + New(var/loc, var/potency = 15) ..() if(reagents) @@ -353,6 +370,7 @@ desc = "Emblazoned upon the apple is the word 'Kallisti'." icon_state = "goldapple" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/goldapple + New(var/loc, var/potency = 15) ..() if(reagents) @@ -373,6 +391,7 @@ icon_state = "watermelon" slice_path = /obj/item/weapon/reagent_containers/food/snacks/watermelonslice slices_num = 5 + New(var/loc, var/potency = 10) ..() if(reagents) @@ -385,6 +404,7 @@ desc = "It's large and scary." icon_state = "pumpkin" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin + New(var/loc, var/potency = 10) ..() if(reagents) @@ -406,6 +426,7 @@ desc = "It's so sour, your face will twist." icon_state = "lime" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/lime + New(var/loc, var/potency = 20) ..() if(reagents) @@ -418,6 +439,7 @@ desc = "When life gives you lemons, be grateful they aren't limes." icon_state = "lemon" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/lemon + New(var/loc, var/potency = 20) ..() if(reagents) @@ -430,6 +452,7 @@ desc = "It's an tangy fruit." icon_state = "orange" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/orange + New(var/loc, var/potency = 20) ..() if(reagents) @@ -442,6 +465,7 @@ desc = "You can't beat white-beet." icon_state = "whitebeet" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/whitebeet + New(var/loc, var/potency = 15) ..() if(reagents) @@ -471,6 +495,7 @@ desc = "It's spicy! Wait... IT'S BURNING ME!!" icon_state = "chilipepper" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/chili + New(var/loc, var/potency = 10) ..() if(reagents) @@ -490,6 +515,7 @@ icon_state = "ghostchilipepper" var/mob/held_mob dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chilli + New(var/loc, var/potency = 10) ..() if(reagents) @@ -527,6 +553,7 @@ desc = "Maybe there's a chicken inside?" icon_state = "eggplant" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant + New(var/loc, var/potency = 10) ..() if(reagents) @@ -546,12 +573,13 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy name = "Egg-plant" desc = "There MUST be a chicken inside." icon_state = "eggyplant" + inside_type = /obj/item/weapon/reagent_containers/food/snacks/egg + New(var/loc, var/potency = 10) ..() if(reagents) reagents.add_reagent("nutriment", 1 + round((potency / 10), 1)) bitesize = 1 + round(reagents.total_volume / 2, 1) - inside_type = /obj/item/weapon/reagent_containers/food/snacks/egg /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans seed = "/obj/item/seeds/soyaseed" @@ -560,6 +588,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy gender = PLURAL icon_state = "soybeans" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans + New(var/loc, var/potency = 10) ..() if(reagents) @@ -572,6 +601,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "Something about these seems fishy." icon_state = "koibeans" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/koibeans + New(var/loc, var/potency = 10) ..() if(reagents) @@ -585,6 +615,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "Store in a location at least 50 yards away from werewolves." icon_state = "moonflower" slot_flags = SLOT_HEAD + New(var/loc, var/potency = 10) ..() if(reagents) @@ -625,6 +656,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy name = "killer-tomato" desc = "I say to-mah-to, you say tom-mae-to... OH GOD IT'S EATING MY LEGS!!" icon_state = "killertomato" + New(var/loc, var/potency = 10) ..() if(reagents) @@ -653,7 +685,6 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "So bloody...so...very...bloody....AHHHH!!!!" icon_state = "bloodtomato" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blood - splat = /obj/effect/gibspawner/generic New(var/loc, var/potency = 10) @@ -693,6 +724,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy icon_state = "bluespacetomato" origin_tech = "bluespace=3" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blue/bluespace + New(var/loc, var/potency = 20) ..() if(reagents) @@ -721,6 +753,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy gender = PLURAL icon_state = "wheat" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/wheat + New(var/loc, var/potency = 10) ..() if(reagents) @@ -732,6 +765,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy name = "grass" desc = "Green and lush." icon_state = "grassclump" + New(var/loc, var/potency = 10) ..() if(reagents) @@ -770,6 +804,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "It's a mutant strain of chili" icon_state = "icepepper" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper + New(var/loc, var/potency = 20) ..() if(reagents) @@ -788,6 +823,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "It's good for the eyes!" icon_state = "carrot" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/carrot + New(var/loc, var/potency = 10) ..() if(reagents) @@ -801,6 +837,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "Ganoderma lucidum: A special fungus known for its medicinal and stress relieving properties." icon_state = "reishi" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi + New(var/loc, var/potency = 10) ..() if(reagents) @@ -821,6 +858,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "Amanita Muscaria: Learn poisonous mushrooms by heart. Only pick mushrooms you know." icon_state = "amanita" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita + New(var/loc, var/potency = 10) ..() if(reagents) @@ -841,6 +879,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "Amanita Virosa: Deadly poisonous basidiomycete fungus filled with alpha amatoxins." icon_state = "angel" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/angel + New(var/loc, var/potency = 35) ..() if(reagents) @@ -861,6 +900,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "Psilocybe Semilanceata: Liberate yourself!" icon_state = "libertycap" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap + New(var/loc, var/potency = 15) ..() if(reagents) @@ -879,6 +919,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "Plumus Hellmus: Plump, soft and s-so inviting~" icon_state = "plumphelmet" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet + New(var/loc, var/potency = 10) ..() if(reagents) @@ -890,6 +931,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy name = "walking mushroom" desc = "Plumus Locomotus: The beginning of the great walk." icon_state = "walkingmushroom" + New(var/loc, var/potency = 10) ..() if(reagents) @@ -915,6 +957,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "Cantharellus Cibarius: These jolly yellow little shrooms sure look tasty!" icon_state = "chanterelle" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle + New(var/loc, var/potency = 10) ..() if(reagents) @@ -927,6 +970,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "Mycena Bregprox: This species of mushroom glows in the dark." icon_state = "glowshroom" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom + New(var/loc, var/potency = 10) ..() if(lifespan == 0) //basically, if you're spawning these via admin or on the map, then set up some default stats. @@ -977,6 +1021,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "Looks like a lemon with someone buldging from the inside." icon_state = "moneyfruit" inside_type = null + New() ..() if(reagents) @@ -1007,6 +1052,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy icon_state = "gatfruit" origin_tech = "combat=3" trash = /obj/item/weapon/gun/projectile/revolver + New(var/loc, var/potency = 60) ..() if(reagents) @@ -1023,6 +1069,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "Dry them out to make coffee." icon_state = "coffee_arabica" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/coffee_arabica + New(var/loc, var/potency = 20) ..() if(reagents) @@ -1034,6 +1081,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "Dry them out to make coffee." icon_state = "coffee_robusta" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/coffee_robusta + New(var/loc, var/potency = 20) ..() if(reagents) @@ -1046,6 +1094,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "Dry them out to make some smokes." icon_state = "tobacco_leaves" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/tobacco + New(vat/loc, var/potency = 20) ..() @@ -1057,6 +1106,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy icon_state = "stobacco_leaves" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/tobacco_space New(var/loc, var/potency = 20) + ..() if(reagents) reagents.add_reagent("dexalin", 1 + round((potency / 20), 1)) @@ -1068,6 +1118,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "These aromatic tips of the tea plant can be dried to make tea." icon_state = "tea_aspera_leaves" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/tea_aspera + New(var/loc, var/potency = 20) ..() if(reagents) @@ -1080,6 +1131,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy desc = "These aromatic tips of the tea plant can be dried to make tea." icon_state = "tea_astra_leaves" dried_type = /obj/item/weapon/reagent_containers/food/snacks/grown/tea_astra + New(var/loc, var/potency = 20) ..() if(reagents) From 3092ee2c6d5d3130846558f8ac0a59329c9791ed Mon Sep 17 00:00:00 2001 From: Firecage Date: Mon, 7 Jul 2014 15:48:11 +0200 Subject: [PATCH 39/41] Changelog Signed-off-by: Firecage --- html/changelog.html | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index c2207d4f274..2e70bfd7a43 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,10 +55,25 @@ should be listed in the changelog upon commit tho. Thanks. -->
    -

    5 July 2014

    -

    updated:

    +

    7 July 2014

    +

    Firecage updated:

      -
    • #Recently the Space Wizard Federation, with some assistance from the Cult of Nar-Sie, recently created a new strain of Killer Tomato. A sad side effect is this effected all current and future Killer Tomato strains in our galaxy. They are now reported to be extremely violent and deadly, use extreme caution when growing them.
    • +
    • We, of the NanoTrasen Botany Research and Developent(NTBiRD), has some important announcements for the Botany staff aboard our stations.
    • +
    • We have recently released a new strain of Tower Cap. It is now ensured that more planks can be gotten from a single log.
    • +
    • Head Scientist [REDACTED] is thanked for his new strain of Blood Tomatoes. It now not only contains human blood, but also chunks of human flesh!
    • +
    • We have also discovered a way to replant the infamous Cash Trees and 'Eggy' plants. We can now harvest their seeds, and the rare products are inside the fruit shells.
    • +
    • Similar to the new variety of Tower Caps, it is now possible to get various grass flooring depending on the plants potency!
    • +
    • Our sponsors at Knitters United has released a new variation of the botany Aprons and Coveralls which can hold a larger variety of items!
    • +
    • A new version of Plant-B-Gone was produced which are much more lethal to plants, yet at the same time has no extra effect on humans besides the norm.
    • +
    +
    + + +
    +

    5 July 2014

    +

    Firecage updated:

    +
      +
    • Recently the Space Wizard Federation, with some assistance from the Cult of Nar-Sie, recently created a new strain of Killer Tomato. A sad side effect is this effected all current and future Killer Tomato strains in our galaxy. They are now reported to be extremely violent and deadly, use extreme caution when growing them.
    From c041d28e339655ccc77b161c8a10e8d5e2cfa231 Mon Sep 17 00:00:00 2001 From: Firecage Date: Mon, 7 Jul 2014 15:53:27 +0200 Subject: [PATCH 40/41] Signed-off-by: Firecage --- html/changelog.html | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 2e70bfd7a43..91eba9c5129 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -59,19 +59,19 @@ should be listed in the changelog upon commit tho. Thanks. -->

    Firecage updated:

    • We, of the NanoTrasen Botany Research and Developent(NTBiRD), has some important announcements for the Botany staff aboard our stations.
    • -
    • We have recently released a new strain of Tower Cap. It is now ensured that more planks can be gotten from a single log.
    • -
    • Head Scientist [REDACTED] is thanked for his new strain of Blood Tomatoes. It now not only contains human blood, but also chunks of human flesh!
    • -
    • We have also discovered a way to replant the infamous Cash Trees and 'Eggy' plants. We can now harvest their seeds, and the rare products are inside the fruit shells.
    • -
    • Similar to the new variety of Tower Caps, it is now possible to get various grass flooring depending on the plants potency!
    • -
    • Our sponsors at Knitters United has released a new variation of the botany Aprons and Coveralls which can hold a larger variety of items!
    • -
    • A new version of Plant-B-Gone was produced which are much more lethal to plants, yet at the same time has no extra effect on humans besides the norm.
    • +
    • We have recently released a new strain of Tower Cap. It is now ensured that more planks can be gotten from a single log.
    • +
    • Head Scientist [REDACTED] is thanked for his new strain of Blood Tomatoes. It now not only contains human blood, but also chunks of human flesh!
    • +
    • We have also discovered a way to replant the infamous Cash Trees and 'Eggy' plants. We can now harvest their seeds, and the rare products are inside the fruit shells.
    • +
    • Similar to the new variety of Tower Caps, it is now possible to get various grass flooring depending on the plants potency!
    • +
    • Our sponsors at Knitters United has released a new variation of the botany Aprons and Coveralls which can hold a larger variety of items!
    • +
    • A new version of Plant-B-Gone was produced which are much more lethal to plants, yet at the same time has no extra effect on humans besides the norm.

5 July 2014

-

Firecage updated:

+

Firecage updated:

  • Recently the Space Wizard Federation, with some assistance from the Cult of Nar-Sie, recently created a new strain of Killer Tomato. A sad side effect is this effected all current and future Killer Tomato strains in our galaxy. They are now reported to be extremely violent and deadly, use extreme caution when growing them.
From 78b4e35fc7334ab81f313f3d66a1e5de39dff0de Mon Sep 17 00:00:00 2001 From: Firecage Date: Mon, 7 Jul 2014 15:55:00 +0200 Subject: [PATCH 41/41] Update changelog.html --- html/changelog.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 91eba9c5129..ad8b1e345b8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -59,12 +59,12 @@ should be listed in the changelog upon commit tho. Thanks. -->

Firecage updated:

  • We, of the NanoTrasen Botany Research and Developent(NTBiRD), has some important announcements for the Botany staff aboard our stations.
  • -
  • We have recently released a new strain of Tower Cap. It is now ensured that more planks can be gotten from a single log.
  • -
  • Head Scientist [REDACTED] is thanked for his new strain of Blood Tomatoes. It now not only contains human blood, but also chunks of human flesh!
  • -
  • We have also discovered a way to replant the infamous Cash Trees and 'Eggy' plants. We can now harvest their seeds, and the rare products are inside the fruit shells.
  • -
  • Similar to the new variety of Tower Caps, it is now possible to get various grass flooring depending on the plants potency!
  • -
  • Our sponsors at Knitters United has released a new variation of the botany Aprons and Coveralls which can hold a larger variety of items!
  • -
  • A new version of Plant-B-Gone was produced which are much more lethal to plants, yet at the same time has no extra effect on humans besides the norm.
  • +
  • We have recently released a new strain of Tower Cap. It is now ensured that more planks can be gotten from a single log.
  • +
  • Head Scientist [REDACTED] is thanked for his new strain of Blood Tomatoes. It now not only contains human blood, but also chunks of human flesh!
  • +
  • We have also discovered a way to replant the infamous Cash Trees and 'Eggy' plants. We can now harvest their seeds, and the rare products are inside the fruit shells.
  • +
  • Similar to the new variety of Tower Caps, it is now possible to get various grass flooring depending on the plants potency!
  • +
  • Our sponsors at Knitters United has released a new variation of the botany Aprons and Coveralls which can hold a larger variety of items!
  • +
  • A new version of Plant-B-Gone was produced which are much more lethal to plants, yet at the same time has no extra effect on humans besides the norm.