diff --git a/.travis.yml b/.travis.yml index cf15b927ed0..e46ce8997db 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,6 +36,7 @@ script: - shopt -s globstar - (! grep 'step_[xy]' _maps/**/*.dmm) - md5sum -c - <<< "29d5a6e23d172846354505e60ecfe7e7 *html/changelogs/example.yml" + - tools/check_filedirs.sh tgstation.dme - python tools/ss13_genchangelog.py html/changelog.html html/changelogs - source $HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR}/byond/bin/byondsetup - bash dm.sh -M${DM_MAPFILE} tgstation.dme diff --git a/_maps/map_files/MetaStation/MetaStation.v41G.dmm b/_maps/map_files/MetaStation/MetaStation.v41G.dmm index 6b8a848d759..51cf098c9f5 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41G.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41G.dmm @@ -3570,7 +3570,7 @@ "bqx" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge) "bqy" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkblue"; tag = "icon-darkbluecorners (WEST)"},/area/bridge) "bqz" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/storage/fancy/donut_box,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge) -"bqA" = (/obj/structure/displaycase{pixel_y = 5},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) +"bqA" = (/obj/structure/displaycase/captain{pixel_y = 5},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "bqB" = (/obj/structure/sign/map/left{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "bqC" = (/obj/structure/sign/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "bqD" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) @@ -6526,7 +6526,7 @@ "cvm" = (/obj/item/weapon/folder/white,/obj/item/weapon/stamp/rd{pixel_x = 3; pixel_y = -2},/obj/structure/table/reinforced,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) "cvn" = (/obj/machinery/computer/aifixer,/obj/structure/window/reinforced{dir = 4},/obj/machinery/requests_console{announcementConsole = 1; department = "Research Director's Desk"; departmentType = 5; name = "Research Director RC"; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) "cvo" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor) -"cvp" = (/obj/structure/lamarr,/obj/machinery/light/small{dir = 1},/obj/structure/sign/biohazard{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/hor) +"cvp" = (/obj/structure/displaycase/labcage,/obj/machinery/light/small{dir = 1},/obj/structure/sign/biohazard{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/hor) "cvq" = (/obj/item/weapon/storage/secure/safe{pixel_x = 32; pixel_y = 0},/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor) "cvr" = (/obj/machinery/portable_atmospherics/scrubber/huge,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/toxins/storage) "cvs" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/toxins/storage) diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm index 702ab5ca619..1be7ce132eb 100644 --- a/_maps/map_files/MiniStation/MiniStation.dmm +++ b/_maps/map_files/MiniStation/MiniStation.dmm @@ -20,7 +20,7 @@ "at" = (/obj/machinery/computer/med_data,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/bridge) "au" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/PDAs{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/ids,/turf/simulated/floor/plasteel,/area/bridge) "av" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/lockbox/medal,/turf/simulated/floor/plasteel,/area/bridge) -"aw" = (/obj/structure/lamarr,/turf/simulated/floor/plasteel,/area/bridge) +"aw" = (/obj/structure/displaycase/labcage,/turf/simulated/floor/plasteel,/area/bridge) "ax" = (/obj/structure/table/reinforced,/obj/machinery/recharger,/obj/item/weapon/hand_tele,/turf/simulated/floor/plasteel,/area/bridge) "ay" = (/turf/simulated/floor/plasteel,/area/bridge) "az" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/bridge) @@ -29,7 +29,7 @@ "aC" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/bridge) "aD" = (/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/bridge) "aE" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plasteel,/area/bridge) -"aF" = (/obj/structure/displaycase,/turf/simulated/floor/plasteel,/area/bridge) +"aF" = (/obj/structure/displaycase/captain,/turf/simulated/floor/plasteel,/area/bridge) "aG" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/bridge) "aH" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel,/area/bridge) "aI" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel,/area/bridge) @@ -227,7 +227,7 @@ "es" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "et" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/security/brig) "eu" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall,/area/space) -"ev" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/storage) +"ev" = (/obj/machinery/suit_storage_unit/mining,/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/storage) "ew" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "ex" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "ey" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plasteel,/area/quartermaster/storage) @@ -1141,7 +1141,7 @@ "vW" = (/obj/structure/closet/wardrobe/black,/turf/simulated/floor/plasteel/shuttle,/area/shuttle/arrival) "vX" = (/obj/structure/closet/wardrobe/grey,/turf/simulated/floor/plasteel/shuttle,/area/shuttle/arrival) "vY" = (/turf/simulated/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/arrival) -"vZ" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/simulated/floor/plating,/area/shuttle/arrival) +"vZ" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/simulated/floor/plating/airless,/area/shuttle/arrival) "wa" = (/turf/simulated/floor/plasteel/shuttle,/turf/simulated/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/shuttle/arrival) "wb" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/internals/emergency_oxygen,/turf/simulated/floor/plating,/area/hallway/primary/central) "wc" = (/turf/simulated/wall,/area/crew_quarters/heads{name = "\improper Job Assignment"}) @@ -1165,7 +1165,7 @@ "wu" = (/turf/simulated/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/arrival) "wv" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/arrival) "ww" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark{name = "JoinLate"},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/arrival) -"wx" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/shuttle/arrival) +"wx" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/shuttle/arrival) "wy" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "o2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/engine/engineering) "wz" = (/obj/effect/landmark{name = "Observer-Start"},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/arrival) "wA" = (/obj/machinery/power/apc{auto_name = 1; dir = 1; name = "_North APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/crew_quarters/heads{name = "\improper Job Assignment"}) @@ -1642,7 +1642,7 @@ "GP" = (/obj/machinery/telecomms/processor/preset_one,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) "GQ" = (/obj/machinery/telecomms/broadcaster/preset_left/ministation,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) "GR" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_s"; name = "south of station"; turf_type = /turf/simulated/floor/plating/snow; width = 18},/turf/space,/area/space) - + (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/MiniStation/z2.dmm b/_maps/map_files/MiniStation/z2.dmm index e3dbfe6a3ef..ac11b27332e 100644 --- a/_maps/map_files/MiniStation/z2.dmm +++ b/_maps/map_files/MiniStation/z2.dmm @@ -112,11 +112,11 @@ "ch" = (/turf/indestructible/riveted,/area/start) "ci" = (/obj/effect/landmark/start,/turf/simulated/floor/plating,/area/start) "cj" = (/turf/indestructible/splashscreen,/area/start) -"ck" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/turf/simulated/floor/plating,/area/shuttle/supply) +"ck" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/supply) "cl" = (/turf/space,/turf/simulated/wall/shuttle{icon_state = "swall_f6"; dir = 2},/area/shuttle/supply) "cm" = (/obj/machinery/flasher{id = "tdomeflash"; name = "Thunderdome Flash"},/turf/simulated/floor/bluegrid,/area/tdome/arena_source) "cn" = (/turf/simulated/floor/bluegrid,/area/tdome/arena_source) -"co" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/shuttle/supply) +"co" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/shuttle/supply) "cp" = (/turf/simulated/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/supply) "cq" = (/turf/space,/turf/simulated/wall/shuttle{icon_state = "swall_f10"; dir = 2},/area/shuttle/supply) "cr" = (/turf/indestructible/abductor{icon_state = "alien21"},/area/abductor_ship) @@ -277,8 +277,8 @@ "fq" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{dir = 8; dwidth = 12; height = 9; width = 21},/obj/docking_port/stationary{dir = 8; dwidth = 12; height = 9; id = "emergency_away"; name = "Centcom"; width = 21},/turf/simulated/floor/plating,/area/space) "fr" = (/turf/simulated/floor/plating,/area/centcom/evac) "fs" = (/turf/indestructible/fakeglass{color = "#008000"; dir = 4; icon_state = "fakewindows"},/area/wizard_station) -"ft" = (/turf/indestructible/fakeglass{color = "#008000"; dir = 8; icon_state = "fakewindows"},/area/wizard_station) -"fu" = (/turf/indestructible/riveted{tag = "icon-uranium2"; icon_state = "uranium2"},/area/wizard_station) +"ft" = (/turf/indestructible/fakeglass{color = "#008000"; dir = 8; icon_state = "fakewindows2"},/area/wizard_station) +"fu" = (/turf/indestructible/riveted/uranium,/area/wizard_station) "fv" = (/turf/indestructible/riveted,/area/syndicate_mothership) "fw" = (/turf/simulated/floor/plating,/turf/simulated/wall/shuttle{icon_state = "swall_f6"; dir = 2},/area/shuttle/transport) "fx" = (/turf/simulated/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/transport) @@ -287,11 +287,11 @@ "fA" = (/turf/simulated/floor/plating,/turf/simulated/wall/shuttle{icon_state = "swall_f10"; dir = 2},/area/shuttle/transport) "fB" = (/turf/indestructible/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/ferry) "fC" = (/turf/indestructible/fakeglass,/area/centcom/control) -"fD" = (/obj/item/weapon/shard{color = "#008000"},/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage5"; icon_state = "cultdamage5"},/area/wizard_station) +"fD" = (/obj/item/weapon/shard{color = "#008000"},/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage5"},/area/wizard_station) "fE" = (/turf/simulated/floor/plasteel/cult,/area/wizard_station) -"fF" = (/obj/machinery/computer/shuttle,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station) -"fG" = (/turf/indestructible/riveted{tag = "icon-uranium10"; icon_state = "uranium10"},/area/wizard_station) -"fH" = (/turf/indestructible/riveted{tag = "icon-uranium5"; icon_state = "uranium5"},/area/wizard_station) +"fF" = (/turf/simulated/floor/plasteel/cult/airless,/area/wizard_station) +"fG" = (/obj/machinery/computer/shuttle,/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage"},/area/wizard_station) +"fH" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage2"},/area/wizard_station) "fI" = (/turf/simulated/floor/plating/snow,/area/syndicate_mothership) "fJ" = (/obj/structure/flora/grass/brown,/turf/simulated/floor/plating/snow,/area/syndicate_mothership) "fK" = (/obj/structure/flora/grass/both,/turf/simulated/floor/plating/snow,/area/syndicate_mothership) @@ -308,10 +308,10 @@ "fV" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/simulated/floor/plating,/area/space) "fW" = (/obj/machinery/vending/wallmed{name = "Emergency NanoMed"; req_access_txt = "0"},/turf/simulated/wall/shuttle{icon_state = "swall3"; dir = 2},/area/space) "fX" = (/obj/structure/stool/bed/chair{dir = 8},/obj/item/device/radio/intercom{pixel_x = 25},/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/space) -"fY" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage2"; icon_state = "cultdamage2"},/area/wizard_station) -"fZ" = (/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage3"; icon_state = "cultdamage3"},/area/wizard_station) -"ga" = (/turf/indestructible/riveted{tag = "icon-uranium3"; icon_state = "uranium3"},/area/wizard_station) -"gb" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plasteel/cult,/area/wizard_station) +"fY" = (/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage3"},/area/wizard_station) +"fZ" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plasteel/cult/airless,/area/wizard_station) +"ga" = (/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage"},/area/wizard_station) +"gb" = (/obj/structure/showcase{desc = "A strange machine supposedly from another world. The Wizard Federation has been meddling with it for years."; icon_state = "processor"; name = "byond random number generator"},/turf/simulated/floor/plasteel/cult/airless,/area/wizard_station) "gc" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/transport) "gd" = (/turf/simulated/floor/plasteel/shuttle,/area/shuttle/transport) "ge" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 12; id = "ferry"; name = "ferry shuttle"; travelDir = 180; width = 5},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 12; id = "ferry_away"; name = "unknown"; turf_type = /turf/simulated/floor; width = 5},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/transport) @@ -320,36 +320,36 @@ "gh" = (/turf/indestructible/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/centcom/ferry) "gi" = (/turf/indestructible/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/evac) "gj" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/indestructible/riveted,/area/centcom/evac) -"gk" = (/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station) -"gl" = (/obj/structure/showcase{desc = "A strange machine supposedly from another world. The Wizard Federation has been meddling with it for years."; icon_state = "processor"; name = "byond random number generator"},/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage7"; icon_state = "cultdamage7"},/area/wizard_station) -"gm" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/cult,/area/wizard_station) -"gn" = (/obj/structure/showcase{desc = "A historical figure of great importance to the wizard federation. He spent his long life learning magic, stealing artifacts, and harassing idiots with swords. May he rest forever, Rodney."; icon = 'icons/mob/mob.dmi'; icon_state = "nim"; name = "wizard of yendor showcase"},/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage4"; icon_state = "cultdamage4"},/area/wizard_station) +"gk" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/cult/airless,/area/wizard_station) +"gl" = (/obj/structure/showcase{desc = "A historical figure of great importance to the wizard federation. He spent his long life learning magic, stealing artifacts, and harassing idiots with swords. May he rest forever, Rodney."; icon = 'icons/mob/mob.dmi'; icon_state = "nim"; name = "wizard of yendor showcase"},/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage4"},/area/wizard_station) +"gm" = (/obj/effect/forcefield,/obj/structure/door_assembly/door_assembly_uranium{anchored = 1; name = "Bridge"},/turf/simulated/floor/plasteel/cult,/area/wizard_station) +"gn" = (/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/cult{icon_state = "cultdamage6"},/area/wizard_station) "go" = (/obj/structure/flora/bush,/turf/simulated/floor/plating/snow,/area/syndicate_mothership) "gp" = (/turf/simulated/wall/shuttle{icon_state = "swallc1"; dir = 2},/area/shuttle/transport) "gq" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/transport) "gr" = (/obj/machinery/door/airlock/centcom{name = "Transport Shuttle"; opacity = 1; req_access_txt = "101"},/turf/simulated/floor/plasteel,/area/centcom/ferry) "gs" = (/turf/indestructible/fakeglass,/area/centcom/evac) "gt" = (/turf/indestructible/fakeglass{color = "#008000"; dir = 6; icon_state = "fakewindows2"},/area/wizard_station) -"gu" = (/obj/effect/forcefield,/obj/structure/door_assembly{anchored = 1; icon_state = "door_as_uranium1"; name = "Bridge"},/turf/simulated/floor/plasteel/cult,/area/wizard_station) -"gv" = (/turf/indestructible/riveted{tag = "icon-uranium9"; icon_state = "uranium9"},/area/wizard_station) -"gw" = (/turf/indestructible/riveted{tag = "icon-uranium6"; icon_state = "uranium6"},/area/wizard_station) +"gu" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel/cult{icon_state = "cultdamage"},/area/wizard_station) +"gv" = (/turf/simulated/floor/plasteel/cult{icon_state = "cultdamage7"},/area/wizard_station) +"gw" = (/obj/effect/forcefield,/turf/simulated/floor/plasteel/cult{icon_state = "cultdamage"},/area/wizard_station) "gx" = (/turf/simulated/floor/plating,/turf/simulated/wall/shuttle{icon_state = "swall_f5"; dir = 2},/area/shuttle/transport) "gy" = (/turf/simulated/floor/plating,/turf/simulated/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/shuttle/transport) "gz" = (/turf/simulated/floor/plasteel{icon_state = "greencorner"},/area/centcom/ferry) "gA" = (/turf/simulated/floor/plasteel{icon_state = "greencorner"; dir = 8},/area/centcom/evac) "gB" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/space) -"gC" = (/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage6"; icon_state = "cultdamage6"},/area/wizard_station) -"gD" = (/turf/indestructible/riveted{tag = "icon-uranium1"; icon_state = "uranium1"},/area/wizard_station) -"gE" = (/obj/structure/mirror{pixel_x = 28},/turf/simulated/floor/plasteel/cult,/area/wizard_station) -"gF" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station) +"gC" = (/turf/simulated/floor/plasteel/airless,/area/wizard_station) +"gD" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plasteel/airless,/area/wizard_station) +"gE" = (/turf/simulated/floor/plasteel/cult{icon_state = "cultdamage"},/area/wizard_station) +"gF" = (/obj/effect/forcefield,/turf/simulated/floor/plasteel/cult{icon_state = "cultdamage5"},/area/wizard_station) "gG" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/simulated/floor/plasteel/shuttle,/area/space) "gH" = (/turf/simulated/wall/shuttle{icon_state = "swall0"; dir = 2},/area/wizard_station) "gI" = (/turf/simulated/wall/shuttle{icon_state = "swall4"; dir = 2},/area/wizard_station) "gJ" = (/turf/indestructible/fakedoor{name = "Squad 4 Pod"},/area/wizard_station) "gK" = (/obj/effect/forcefield,/turf/simulated/floor/plasteel/cult,/area/wizard_station) "gL" = (/turf/simulated/floor/plasteel/cult,/turf/simulated/wall/shuttle{icon_state = "swall_f10"; dir = 2},/area/wizard_station) -"gM" = (/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage7"; icon_state = "cultdamage7"},/area/wizard_station) -"gN" = (/obj/effect/forcefield,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station) +"gM" = (/obj/effect/forcefield,/turf/simulated/floor/plasteel/cult{icon_state = "cultdamage7"},/area/wizard_station) +"gN" = (/turf/simulated/floor/plasteel/cult{icon_state = "cultdamage5"},/area/wizard_station) "gO" = (/turf/simulated/floor/plating/snow,/turf/simulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership) "gP" = (/turf/indestructible/riveted,/area/centcom/holding) "gQ" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/turf/simulated/floor/plating/airless,/area/wizard_station) @@ -360,11 +360,11 @@ "gV" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/space/transit,/area/wizard_station) "gW" = (/obj/machinery/status_display,/turf/simulated/wall/shuttle{icon_state = "swall11"; dir = 2},/area/space) "gX" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/space) -"gY" = (/turf/simulated/floor/plasteel,/area/wizard_station) -"gZ" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plasteel,/area/wizard_station) +"gY" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage2"},/area/wizard_station) +"gZ" = (/obj/structure/table/wood/poker,/obj/item/toy/cards/cardhand,/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage2"},/area/wizard_station) "ha" = (/obj/machinery/door/poddoor/preopen,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plating/airless,/area/wizard_station) -"hb" = (/obj/effect/forcefield,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage5"; icon_state = "cultdamage5"},/area/wizard_station) -"hc" = (/obj/effect/forcefield,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage7"; icon_state = "cultdamage7"},/area/wizard_station) +"hb" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel/cult{icon_state = "cultdamage"},/area/wizard_station) +"hc" = (/turf/simulated/floor/plasteel/cult{icon_state = "cultdamage3"},/area/wizard_station) "hd" = (/turf/simulated/wall/shuttle{icon_state = "wall3"},/area/shuttle/syndicate) "he" = (/turf/simulated/floor/plating/snow,/turf/simulated/wall/shuttle{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate) "hf" = (/obj/structure/grille,/obj/machinery/door/poddoor/shutters{id = "syndieshutters"; name = "blast shutters"},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/shuttle/syndicate) @@ -375,9 +375,9 @@ "hk" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/turf/simulated/floor/plasteel/shuttle,/area/space) "hl" = (/turf/simulated/wall/shuttle{icon_state = "swall12"; dir = 2},/area/wizard_station) "hm" = (/turf/simulated/floor/plasteel/cult,/turf/simulated/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/wizard_station) -"hn" = (/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage5"; icon_state = "cultdamage5"},/area/wizard_station) -"ho" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage2"; icon_state = "cultdamage2"},/area/wizard_station) -"hp" = (/obj/structure/table/wood/poker,/obj/item/toy/cards/cardhand,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage2"; icon_state = "cultdamage2"},/area/wizard_station) +"hn" = (/obj/structure/door_assembly/door_assembly_uranium{anchored = 1; name = "Break Room"},/turf/simulated/floor/plasteel/cult,/area/wizard_station) +"ho" = (/obj/structure/table/wood,/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/obj/structure/mirror/magic{pixel_y = 28},/turf/simulated/floor/plasteel/cult,/area/wizard_station) +"hp" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/hardsuit/wizard,/turf/simulated/floor/plasteel/cult/airless,/area/wizard_station) "hq" = (/obj/structure/table,/obj/machinery/microwave,/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "hr" = (/obj/structure/table,/obj/item/device/flashlight/lamp{pixel_x = 4; pixel_y = 1},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "hs" = (/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) @@ -401,7 +401,7 @@ "hK" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel/shuttle/red,/area/space) "hL" = (/turf/simulated/floor/plasteel/shuttle/red,/area/space) "hM" = (/obj/machinery/vending/magivend,/turf/simulated/floor/plasteel/cult,/area/wizard_station) -"hN" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station) +"hN" = (/obj/effect/forcefield,/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage"},/area/wizard_station) "hO" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "hP" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1; icon_state = "comfychair"; name = "pilot's chair"; tag = "icon-comfychair (NORTH)"},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "hQ" = (/turf/simulated/floor/plating/snow,/turf/simulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 4},/area/syndicate_mothership) @@ -419,11 +419,11 @@ "ic" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/simulated/floor/plasteel/black,/area/centcom/evac) "id" = (/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/space) "ie" = (/turf/simulated/wall/shuttle{icon_state = "swall1"; dir = 2},/area/space) -"if" = (/obj/structure/door_assembly{anchored = 1; icon_state = "door_as_uranium1"; name = "Break Room"},/turf/simulated/floor/plasteel/cult,/area/wizard_station) -"ig" = (/turf/indestructible/riveted{tag = "icon-uranium8"; icon_state = "uranium8"},/area/wizard_station) -"ih" = (/turf/indestructible/riveted{tag = "icon-uranium12"; icon_state = "uranium12"},/area/wizard_station) -"ii" = (/turf/indestructible/riveted{tag = "icon-uranium4"; icon_state = "uranium4"},/area/wizard_station) -"ij" = (/turf/indestructible/riveted{tag = "icon-uranium14"; icon_state = "uranium14"},/area/wizard_station) +"if" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage"},/area/wizard_station) +"ig" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel/cult/airless,/area/wizard_station) +"ih" = (/obj/effect/decal/cleanable/blood/splatter,/obj/structure/rack{health = 9999},/obj/item/clothing/suit/space/hardsuit/wizard,/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage"},/area/wizard_station) +"ii" = (/obj/effect/decal/cleanable/blood/splatter,/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/simulated/floor/plasteel/cult/airless,/area/wizard_station) +"ij" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel/airless,/area/wizard_station) "ik" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; name = "Break Room"},/turf/simulated/floor/plasteel/cult,/area/wizard_station) "il" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 10},/obj/item/device/multitool,/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "im" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_y = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) @@ -450,9 +450,9 @@ "iH" = (/obj/structure/table/wood,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/turf/simulated/floor/plasteel/cult,/area/wizard_station) "iI" = (/obj/structure/table/wood,/obj/item/weapon/retractor,/turf/simulated/floor/plasteel/cult,/area/wizard_station) "iJ" = (/obj/structure/table/wood,/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/simulated/floor/plasteel/cult,/area/wizard_station) -"iK" = (/obj/structure/table/wood,/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/simulated/floor/plasteel/cult,/area/wizard_station) -"iL" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/hardsuit/wizard,/turf/simulated/floor/plasteel/cult,/area/wizard_station) -"iM" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station) +"iK" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plasteel/airless,/area/wizard_station) +"iL" = (/obj/effect/landmark/start{name = "wizard"},/turf/simulated/floor/plasteel/cult{icon_state = "cultdamage5"},/area/wizard_station) +"iM" = (/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel/cult/airless,/area/wizard_station) "iN" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel/cult,/area/wizard_station) "iO" = (/turf/simulated/floor/plating/snow,/turf/simulated/wall/shuttle{icon_state = "diagonalWall3"},/area/shuttle/syndicate) "iP" = (/obj/machinery/door/window{name = "Cockpit"; req_access_txt = "150"},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) @@ -468,7 +468,7 @@ "iZ" = (/turf/indestructible/fakeglass{color = "#008000"; dir = 1; icon_state = "fakewindows"},/area/wizard_station) "ja" = (/obj/structure/cult/tome,/turf/simulated/floor/plasteel/cult,/area/wizard_station) "jb" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/clothing/suit/wizrobe/red,/obj/item/clothing/head/wizard/red,/obj/item/weapon/staff,/obj/item/clothing/shoes/sandal,/turf/simulated/floor/plasteel/cult,/area/wizard_station) -"jc" = (/obj/effect/decal/cleanable/blood/splatter,/obj/structure/rack{health = 9999},/obj/item/clothing/suit/space/hardsuit/wizard,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station) +"jc" = (/obj/effect/decal/cleanable/blood/splatter,/obj/structure/rack,/obj/item/weapon/staff,/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage"},/area/wizard_station) "jd" = (/turf/simulated/floor/plasteel/cult,/turf/simulated/wall/shuttle{icon_state = "swall_f6"; dir = 2},/area/wizard_station) "je" = (/turf/simulated/wall/shuttle{icon_state = "swall8"; dir = 2},/area/wizard_station) "jf" = (/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/weapon/crowbar/red,/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) @@ -488,9 +488,9 @@ "jt" = (/obj/structure/bookcase,/turf/simulated/floor/plasteel/cult,/area/wizard_station) "ju" = (/obj/structure/cult/talisman{desc = "A altar dedicated to the Wizard's Federation"},/obj/item/weapon/kitchen/knife/ritual,/turf/simulated/floor/plasteel/cult,/area/wizard_station) "jv" = (/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/simulated/floor/plasteel/cult,/area/wizard_station) -"jw" = (/obj/effect/decal/cleanable/blood/splatter,/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/simulated/floor/plasteel/cult,/area/wizard_station) -"jx" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel,/area/wizard_station) -"jy" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plasteel,/area/wizard_station) +"jw" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/forcefield,/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage"},/area/wizard_station) +"jx" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage4"},/area/wizard_station) +"jy" = (/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage4"},/area/wizard_station) "jz" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "jA" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "jB" = (/turf/indestructible/fakeglass{icon_state = "fakewindows"; dir = 9},/area/syndicate_mothership) @@ -504,8 +504,8 @@ "jJ" = (/turf/simulated/floor/plasteel{icon_state = "green"; dir = 6},/area/tdome/tdomeobserve) "jK" = (/turf/indestructible/fakedoor{name = "Centcom Security"},/area/centcom/evac) "jL" = (/turf/indestructible/fakeglass{color = "#008000"},/area/wizard_station) -"jM" = (/obj/effect/landmark/start{name = "wizard"},/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage5"; icon_state = "cultdamage5"},/area/wizard_station) -"jN" = (/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel/cult,/area/wizard_station) +"jM" = (/obj/structure/door_assembly/door_assembly_uranium{anchored = 1; name = "Corridor A"},/turf/simulated/floor/plasteel/cult,/area/wizard_station) +"jN" = (/obj/effect/forcefield,/turf/simulated/floor/plasteel/cult{icon_state = "cultdamage3"},/area/wizard_station) "jO" = (/turf/simulated/floor/plasteel/cult,/turf/simulated/wall/shuttle{icon_state = "swall_f5"; dir = 2},/area/wizard_station) "jP" = (/turf/indestructible/fakedoor{name = "Squad 3 Pod"},/area/wizard_station) "jQ" = (/turf/indestructible/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/syndicate_mothership) @@ -513,10 +513,10 @@ "jS" = (/obj/machinery/door/poddoor/shutters{id = "nukeop_ready"; name = "shuttle dock"},/turf/simulated/floor/plating,/area/syndicate_mothership) "jT" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (NORTH)"; icon_state = "wooden_chair_wings"; dir = 1},/turf/simulated/floor/plasteel/cult,/area/wizard_station) "jU" = (/obj/structure/cult/pylon,/turf/simulated/floor/plasteel/cult,/area/wizard_station) -"jV" = (/obj/effect/decal/cleanable/blood/splatter,/obj/structure/rack,/obj/item/weapon/staff,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station) -"jW" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/forcefield,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station) -"jX" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage4"; icon_state = "cultdamage4"},/area/wizard_station) -"jY" = (/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage4"; icon_state = "cultdamage4"},/area/wizard_station) +"jV" = (/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage2"},/area/wizard_station) +"jW" = (/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel/cult{icon_state = "cultdamage"},/area/wizard_station) +"jX" = (/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage5"},/area/wizard_station) +"jY" = (/obj/structure/table/wood,/obj/effect/landmark{name = "Teleport-Scroll"},/obj/item/weapon/dice/d20,/obj/item/weapon/dice,/turf/simulated/floor/carpet,/area/wizard_station) "jZ" = (/obj/machinery/suit_storage_unit/syndicate,/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "ka" = (/obj/effect/landmark{name = "Syndicate-Uplink"},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "kb" = (/turf/indestructible/fakeglass,/area/syndicate_mothership) @@ -525,8 +525,8 @@ "ke" = (/obj/machinery/computer/telecrystals/uplinker,/turf/simulated/floor/plasteel/cult{tag = "icon-podhatch (SOUTHWEST)"; icon_state = "podhatch"; dir = 10},/area/syndicate_mothership) "kf" = (/obj/structure/toilet{pixel_y = 8},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"},/obj/machinery/door/window{name = "Tactical Toilet"; opacity = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "kg" = (/obj/structure/urinal{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) -"kh" = (/obj/structure/door_assembly{anchored = 1; icon_state = "door_as_uranium1"; name = "Corridor A"},/turf/simulated/floor/plasteel/cult,/area/wizard_station) -"ki" = (/turf/indestructible/riveted{tag = "icon-uranium13"; icon_state = "uranium13"},/area/wizard_station) +"kh" = (/turf/simulated/floor/carpet,/area/wizard_station) +"ki" = (/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage6"},/area/wizard_station) "kj" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; name = "Corridor A"},/turf/simulated/floor/plasteel/cult,/area/wizard_station) "kk" = (/obj/structure/table,/obj/item/device/aicard,/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "kl" = (/obj/structure/stool,/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) @@ -543,7 +543,7 @@ "kw" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "kx" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space/transit,/area/wizard_station) "ky" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) -"kz" = (/obj/effect/forcefield,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage3"; icon_state = "cultdamage3"},/area/wizard_station) +"kz" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/wiz,/turf/simulated/floor/carpet,/area/wizard_station) "kA" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'FOURTH WALL'."; name = "\improper FOURTH WALL"; pixel_x = -32},/turf/simulated/floor/plating/snow,/area/syndicate_mothership) "kB" = (/obj/structure/table,/obj/item/weapon/c4{pixel_x = 2; pixel_y = 1},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "kC" = (/turf/simulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) @@ -554,8 +554,8 @@ "kH" = (/obj/item/weapon/soap/syndie,/obj/structure/mopbucket,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "kI" = (/turf/simulated/floor/plasteel{icon_state = "redbluefull"; dir = 2},/area/tdome/tdomeobserve) "kJ" = (/obj/structure/stool/bed/chair,/obj/effect/landmark{name = "tdomeobserve"},/turf/simulated/floor/plasteel{icon_state = "redbluefull"; dir = 2},/area/tdome/tdomeobserve) -"kK" = (/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage2"; icon_state = "cultdamage2"},/area/wizard_station) -"kL" = (/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station) +"kK" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage"},/area/wizard_station) +"kL" = (/turf/simulated/floor/plasteel/cult/airless{icon_state = "cultdamage7"},/area/wizard_station) "kM" = (/obj/machinery/door/window{dir = 4; name = "EVA Storage"; req_access_txt = "150"},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "kN" = (/obj/machinery/door/airlock/external{req_access_txt = "150"},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "kO" = (/obj/machinery/computer/telecrystals/boss,/turf/simulated/floor/plasteel/cult{tag = "icon-podhatch (NORTHEAST)"; icon_state = "podhatch"; dir = 5},/area/syndicate_mothership) @@ -565,7 +565,7 @@ "kS" = (/turf/indestructible/fakedoor{name = "Thunderdome"},/area/tdome/tdomeobserve) "kT" = (/obj/machinery/computer/security/telescreen,/turf/simulated/floor/plasteel{icon_state = "redbluefull"; dir = 2},/area/tdome/tdomeobserve) "kU" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "EVA Storage"; req_access_txt = "150"},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) -"kV" = (/obj/structure/table/wood,/obj/effect/landmark{name = "Teleport-Scroll"},/obj/item/weapon/dice/d20,/obj/item/weapon/dice,/turf/simulated/floor/carpet{dir = 9; icon_state = "carpetside"},/area/wizard_station) +"kV" = (/obj/structure/dresser,/obj/item/weapon/storage/backpack/satchel,/turf/simulated/floor/carpet,/area/wizard_station) "kW" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate/black/red,/obj/item/clothing/head/helmet/space/syndicate/black/red,/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "kX" = (/turf/simulated/floor/plating/snow,/turf/simulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership) "kY" = (/turf/simulated/floor/plasteel/black,/area/syndicate_mothership) @@ -578,11 +578,11 @@ "lf" = (/turf/simulated/floor/plating/snow,/turf/simulated/floor/plasteel/cult{tag = "icon-gravsnow_corner (NORTH)"; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership) "lg" = (/turf/simulated/floor/plating/snow,/obj/structure/flora/bush,/turf/simulated/floor/plasteel/cult{tag = "icon-gravsnow_corner (NORTH)"; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership) "lh" = (/turf/indestructible/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/tdome/tdomeobserve) -"li" = (/turf/simulated/floor/carpet{dir = 5; icon_state = "carpetside"},/area/wizard_station) -"lj" = (/turf/simulated/floor/carpet{dir = 1; icon_state = "carpetside"},/area/wizard_station) -"lk" = (/obj/structure/dresser,/obj/item/weapon/storage/backpack/satchel,/turf/simulated/floor/carpet{dir = 10; icon_state = "carpetside"},/area/wizard_station) +"li" = (/obj/structure/table/wood,/obj/item/weapon/storage/bag/tray,/obj/item/weapon/reagent_containers/food/snacks/burger/spell,/turf/simulated/floor/carpet,/area/wizard_station) +"lj" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/wizard_station) +"lk" = (/obj/structure/window/reinforced{color = "#008000"; dir = 1},/turf/simulated/floor/plating/lava/airless,/area/wizard_station) "ll" = (/obj/effect/forcefield,/turf/space,/area/wizard_station) -"lm" = (/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage6"; icon_state = "cultdamage6"},/area/wizard_station) +"lm" = (/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/lava/airless,/area/wizard_station) "ln" = (/turf/simulated/floor/plasteel/cult,/turf/simulated/wall/shuttle{dir = 2; icon_state = "swall_f10"; layer = 2},/area/wizard_station) "lo" = (/obj/machinery/recharge_station,/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "lp" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) @@ -597,10 +597,6 @@ "ly" = (/obj/structure/table,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "lz" = (/obj/structure/stool,/turf/simulated/floor/plasteel/black,/area/syndicate_mothership) "lA" = (/turf/indestructible/riveted,/area/tdome/arena) -"lB" = (/turf/simulated/floor{dir = 8; icon_state = "carpetside"},/area/wizard_station) -"lC" = (/turf/simulated/floor{dir = 4; icon_state = "carpetside"},/area/wizard_station) -"lD" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/wiz,/turf/simulated/floor/plasteel{icon_state = "carpet"; dir = 2},/area/wizard_station) -"lE" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plasteel/cult{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station) "lF" = (/turf/simulated/wall/shuttle{icon_state = "swall1"; dir = 2},/area/wizard_station) "lG" = (/turf/simulated/wall/shuttle{icon_state = "swall3"; dir = 2},/area/wizard_station) "lH" = (/obj/machinery/door/window{dir = 4; name = "Infirmary"; req_access_txt = "150"},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) @@ -614,15 +610,12 @@ "lP" = (/obj/machinery/door/poddoor{id = "thunderdome"; name = "Thunderdome Blast Door"},/turf/simulated/floor/plating,/area/tdome/arena) "lQ" = (/obj/effect/landmark{name = "tdome1"},/turf/simulated/floor/plating,/area/tdome/tdome1) "lR" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/saber/green,/turf/simulated/floor/plasteel/black,/area/tdome/arena) -"lS" = (/obj/structure/table/wood,/obj/item/weapon/storage/bag/tray,/obj/item/weapon/reagent_containers/food/snacks/burger/spell,/turf/simulated/floor/carpet{dir = 6; icon_state = "carpetside"},/area/wizard_station) -"lU" = (/turf/simulated/floor{dir = 2; icon_state = "carpetside"},/area/wizard_station) "lV" = (/turf/indestructible/fakedoor{name = "Squad 2 Pod"},/area/wizard_station) "lW" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "lX" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access_txt = "150"},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "lY" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access_txt = "150"},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "lZ" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome2"},/turf/simulated/floor/plating,/area/tdome/tdome2) "ma" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome1"},/turf/simulated/floor/plating,/area/tdome/tdome1) -"mb" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/wizard_station) "mc" = (/turf/simulated/wall/shuttle,/area/wizard_station) "md" = (/obj/structure/table,/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/syringe/charcoal{pixel_y = 2},/obj/item/weapon/reagent_containers/syringe/charcoal{pixel_y = 4},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) "me" = (/obj/structure/table,/obj/item/weapon/gun/syringe{pixel_x = 1; pixel_y = 2},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate) @@ -650,10 +643,7 @@ "mA" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"},/turf/simulated/floor/plating,/area/shuttle/syndicate) "mB" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"},/turf/simulated/floor/plating,/area/shuttle/syndicate) "mC" = (/obj/structure/shuttle/engine/propulsion,/turf/simulated/floor/plating,/area/shuttle/syndicate) -"mD" = (/turf/indestructible/riveted{tag = "icon-uranium11"; icon_state = "uranium11"},/area/wizard_station) -"mE" = (/obj/structure/window/reinforced{color = "#008000"; dir = 1},/turf/simulated/floor/plasteel/cult{tag = "icon-lava"; icon_state = "lava"},/area/wizard_station) "mF" = (/obj/machinery/door/poddoor{id = "thunderdomehea"; name = "Heavy Supply"},/turf/simulated/floor/plasteel/black,/area/tdome/arena) -"mG" = (/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plasteel/cult{tag = "icon-lava"; icon_state = "lava"},/area/wizard_station) "mH" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/simulated/floor/plasteel/black,/area/tdome/arena) "mI" = (/turf/indestructible/fakeglass{icon_state = "fakewindows"; dir = 8},/area/tdome/tdomeadmin) "mJ" = (/turf/indestructible/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/tdome/tdomeadmin) @@ -869,35 +859,35 @@ aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMaMaM aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMeueueueueueueueueueueueueueueueueWeueueReXdJeYfaeZeQeXeReJfcfbfbfbfdeJeJeJejeTekeUfeeTekeUejfcfbfdeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMeufffffffffffffffffffffffffffgfjfhfkeueReXfldJdJdJfmeXeReJfneVeVfoeVeVeVeJejekekeUdVeTekekfqfpfrfpeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaevftfsfuaaaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMeufffwfxfxfyfxfxfxfzfxfxfAfffBfjfhfkeueReXdSdJdJdJdTfCeReJfneVeVfoeVeVeVeJejeTekeUdVeTekeUejfcfbfdeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaaeBaafDfFfEfHfGaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIfIfIfIfIfJfIfIfIfLfKfIfIfIfLfIfIfIfIfIfIfLfIfIfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMeufNfMfPfOfQfQfQfQfQfQfQfyfSfRfjfhfkeueRfCdSdJdJdJdNdFeheJfTeVeVfoeVeVeVfUfVeTekeUfWeTekfXejaMaMeJeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaaeBfifYfZfEgbgaaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfJfIfIfIfIfIfIfIfIfIfIfIfLfIfIfIfIfIfLfIfIfIfIfIfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMeufNgcgdgdgdgdgdgdgdgdgdgegffffhfhggeugheudLdJdJdJdJdJdJeVeVeVeVfoeVeVeVgifVeTekeUdVeTekeUfVaMaMgjeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaafuglgkgbgmgngaaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIfIfIgofIfIfIfIfIfJfIfIfKfLfIfIfLfIfIfLfKfIfLfIfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMeufNgpgqgqgqgqgqgqgqgqgqfyfSfgfjfhfhgrfhfhdJdJdJdJdJdJdJeVeVeVeVfoeVeVeVgsfVeTekeUdVeTekeUejaMaMeJeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaafHfGgtgugtgwgvaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfJfIfIfLfKfIfIfLfIfKfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMeuffgxfxfxfyfxfxfxfzfxfxgyfffBfjfhgzeugheufldJdJdJfmdFeheJgAeVeVfoeVeVeVeJejeTekeUgBeTekeUejfcfbfdeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaeBeBgDgCgFgEgDaaaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfJfIfIfIfIfIfKfIfLfKfIfLfIfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMeufffffffffffffffffffffffffffRfjfhfkeueReOdQdJdJdJdReOeReJfneVeVfoeVeVeVeJejekekekekekekekgGfpfrfpeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaagHgJgIgLgKgMfEgNeBaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIfIgOgOgOgOgOgOgOfIfIfIfIfIfIfIfLfIfIgofKfIfIfIfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgRgPgPeReXdQdJdJdJdReXeReJfcfdgTgSeJeVeVeJejgUdVdVgWeLekgXejfcfbfdeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaagVgQgZgYhagKfEgkhchbeBeBaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIhehdhfhfhfhfhfhdhgfIfIfIfIgofIgOfJgOfJfIfLfIfLfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPeRfCdQdJdJdJdRfCeReJhhhhhhhheJeVeVeJejeLeLhiejdVhkdVejaMaMeJeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaeBaagIhlhlhmgKfEhngkhbaahohpaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIhdhqhshrhuhthvhvhdhwfIfIgOfvfvhxhyfvfvgOhAhzgOfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPhBhBhDhChGhEhHhBhBeJhhhhhhhheJeVeVeJejeLeLhIejhJhLhKejaMaMeJeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaagNeBaaaaeBhFhMfZhNfZgNeBeBaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIhdhOhshshPhshshshdhwfIhQfvfvhShRhRhSfvfvfvfvfvfvfvfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPhUhThWhVhYhXhWhThUeJiahZicibeJeVeVeJejideLhiiehJhLhKejaMaMeJeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaagwigifiiihijihihigikiiihihijihigaaeBaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIhdilhshshsimhsinhdhwgohQfvioipipipipiriqitisiviuiwfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPhTixiyhVhYhXiyizhTeJhhiAiBhheJeVeVeJiDiCiEiEiEiEiEiCiFaMaMeJeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaagDiGfEfEiGgDiHiIfEfEfEiKiJgDiLiMgNiNeBeBaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIiOhdhdhdiPhdhdhdiQfIfIiRfviSipiTiTiUipipipiViWiWiWfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPiXhTiXhVhYhXiXhTiXeJhhhhhhhheJeVeVeJaMiDiYiYiYiYiYiFaMaMaMeJeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaiZjafEfEjagtiNiNfEfEfEfEjbiZjcjdhlhljeaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIfIfIhdjfhsjghdjhgOgOgOjifvipiTjjjkiTipjljmisjojnfvfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPjphThThVhYhXhThTjqeJhhhhhhjreJeVeVeJeJeJeJeJeJeJeJeJeJeJeJeJeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaajsjtfEgkfEkphngkfEjufEfEjvjsjwkujxjykvkxaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIfIfIhdjzhsjAhdjBjCjCjChyfvipiTjDjEiTipjljFfvfvfvfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPjHjGjGhVhYhXjIjIjJeJeJjKeJeJeJeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaajLjafEfZhnkDfZfEfEjMfEfEfEjLjNjOjejPgHaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIhehdhdhdhdhdjzhsjAhdjQjRjRjRjRjSipipipipipipjljFfvfvfvfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPhBhBhBhBhYhBhBhBhBhBaMaMaMaMeJeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaafujTfEfEjTfujUfEgkfZfEfEjUfujVjXjWjYaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIhdjZhshskahdjzhsjAhdkbkchxjChyfvkdiTiTiTipipjlkefvkgkffvfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhBhYhBaMaMaMaMaMaMaMaMeJeJeJeJeJeJeJeJeJeJeJeJeJeJeJeJeJeJeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaafHigkhiiihkiihiggtkjgtiiihkiihigeBeBeBaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIhdjZhsklkkhdjzhsjAhdhdknkmhgkofvkqkskrksksipipipktkwkwkyfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhBhBhBhBhBhBhBhBhGhBhBhBhBhBhBhBhBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaahFgkaaeBaaeBkzgMhFaaaaeBaaaaaaaaeBaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvkAfIhdjZhshskBhdhshshshdhshshshdiRfvkCkEkCkCkFipipipfvkHkGkyfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhBkIkJkJkJkJkJkIkIkIkJkJkJkJkJkIhBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaeBeBaakKgkaallkLhFeBaahnaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIhdjZhshshskMhshshskNhshshshdhQfvfvjmkOkQkPfvkRfvfvfvfvfvfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMkSkIkIkIkTkIkIkIkIkIkIkIkTkIkIkIkSaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaeBeBaalrgklsaaaaaaeBaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIhdjZhshshskUhshshshjhshskWhdkXkXkofvfvfvfvfvkYkYkZlblalcfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhBkIkJkJkJkJkJkIkIkIkJkJkJkJkJkIhBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaaeBgwigldiifGeBaaeBeBaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIhehdhdhdhdhdhdlehshshdhdhdhdhdhdhglflflflgkofvkYkYkYkYkYkYfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhBhElhlhlhlhlhlhlhlhlhlhlhlhlhhChBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaaaagDkVljligDkKjdhalnlmeBaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIhdlololpltlqhdhshshshdlulwlvlylxhdfIfJfIfIfKiskYkYkYkYkYlzfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAlAlAlAlAlAlAlAlAmgmhmhmhmhmhmhmhmhmhmhmhmhmhmglAlAlAlAlAlAlAlAlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaaaagtlBlDlCgtlElFgYlGfEgaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIhdhshshsklhslHhshshslIhsklhskllJhdfIgofLfJgofvlKlKlKlKlKlLfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAlMlOlNlNlNlNlNlPnemhmhmhmhmhmhmhmhmhmhmhmhmhnglPlQlQlQlQlQlOlRlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaagMeBfulklUlSfufZlVgYlGaaeBaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIhdlWhshshshslXhshshslYhshshshshshdfIfIfIfLhQfvfvfvfvfvfvfvfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAlMlOlNlZlNlZlNlPnemhmhmhmhmhmhmhmhmhmhmhmhmhnglPlQmalQmalQlOlRlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaeBgwkiiggtiikifGmcmblGaaeBaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIhdlWhshsmemdhdmfmimfhdmjmkhshshshdfIfLfIgohQfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAlMlOlNlNmllNlNlPnemhmhmhmhmhnxnynxmhmhmhmhmhnglPlQlQmmlQlQlOlRlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaeBgDfEmnmomnfEgDaanqaaaaeBaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIhdhshsmphdhdhdmqmrhshdhdhdhshshshdfIfIfJfIhQfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAlMlOlNlNlNlNlNlPnemhmhmhmhmhnxnDnxmhmhmhmhmhnglPlQlQlQlQlQlOlRlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaeBgknzfEfEfEfEfEnzaaaaaaaagkaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIhdmsmumthdfIhdmvmvmvhdfIhdmwmymxhdfIfIfIfIhQfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAlMlOlNlZlNlZlNlPnemhmhmhmhmhmhmhmhmhmhmhmhmhnglPlQmalQmalQlOlRlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaeBeBgMfEfumzfEfEfEmzfuaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIhdmvmvmvhdfIiOmAmCmBiQfIhdmvmvmvhdfIfIfIfIhQfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAlMlOlNlNlNlNlNlPnemhmhmhmhmhmhmhmhmhmhmhmhmhnglPlQlQlQlQlQlOlRlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaeBiiihmDmEmEmEmEmEgaaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIiOmAmCmBiQfIfIfIfIfIfIfIiOmAmCmBiQfIfIfIfIhQfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAlAlAmFmFmFmFmFlAmgmhmhmhmhmhmhmhmhmhmhmhmhmhmglAmFmFmFmFmFlAlAlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaafHigmGmGmGiigvaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIhQfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAmHmHmHmHmHlAmImJmJmJmJmJmJmJmJmJmJmJmJmJmKlAmLmLmLmLmLlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaaeBaafDfGfFfufuaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIfIfIfIfIfJfIfIfIfLfKfIfIfIfLfIfIfIfIfIfIfLfIfIfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMeufNfMfPfOfQfQfQfQfQfQfQfyfSfRfjfhfkeueRfCdSdJdJdJdNdFeheJfTeVeVfoeVeVeVfUfVeTekeUfWeTekfXejaMaMeJeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaaeBfifHfYfFfZfuaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfJfIfIfIfIfIfIfIfIfIfIfIfLfIfIfIfIfIfLfIfIfIfIfIfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMeufNgcgdgdgdgdgdgdgdgdgdgegffffhfhggeugheudLdJdJdJdJdJdJeVeVeVeVfoeVeVeVgifVeTekeUdVeTekeUfVaMaMgjeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaafugbgafZgkglfuaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIfIfIgofIfIfIfIfIfJfIfIfKfLfIfIfLfIfIfLfKfIfLfIfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMeufNgpgqgqgqgqgqgqgqgqgqfyfSfgfjfhfhgrfhfhdJdJdJdJdJdJdJeVeVeVeVfoeVeVeVgsfVeTekeUdVeTekeUejaMaMeJeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaafufugtgmgtfufuaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfJfIfIfLfKfIfIfLfIfKfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMeuffgxfxfxfyfxfxfxfzfxfxgyfffBfjfhgzeugheufldJdJdJfmdFeheJgAeVeVfoeVeVeVeJejeTekeUgBeTekeUejfcfbfdeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaeBeBfugngufEfuaaaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfJfIfIfIfIfIfKfIfLfKfIfLfIfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMeufffffffffffffffffffffffffffRfjfhfkeueReOdQdJdJdJdReOeReJfneVeVfoeVeVeVeJejekekekekekekekgGfpfrfpeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaagHgJgIgLgKgvfEgweBaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIfIgOgOgOgOgOgOgOfIfIfIfIfIfIfIfLfIfIgofKfIfIfIfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgRgPgPeReXdQdJdJdJdReXeReJfcfdgTgSeJeVeVeJejgUdVdVgWeLekgXejfcfbfdeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaagVgQgDgChagKfEgEgMgFeBeBaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIhehdhfhfhfhfhfhdhgfIfIfIfIgofIgOfJgOfJfIfLfIfLfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPeRfCdQdJdJdJdRfCeReJhhhhhhhheJeVeVeJejeLeLhiejdVhkdVejaMaMeJeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaeBaagIhlhlhmgKfEgNgEgFaagYgZaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIhdhqhshrhuhthvhvhdhwfIfIgOfvfvhxhyfvfvgOhAhzgOfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPhBhBhDhChGhEhHhBhBeJhhhhhhhheJeVeVeJejeLeLhIejhJhLhKejaMaMeJeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaagweBaaaaeBhFhMhchbhcgweBeBaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIhdhOhshshPhshshshdhwfIhQfvfvhShRhRhSfvfvfvfvfvfvfvfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPhUhThWhVhYhXhWhThUeJiahZicibeJeVeVeJejideLhiiehJhLhKejaMaMeJeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaafufuhnfufufufufufuikfufufufufufuaaeBaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIhdilhshshsimhsinhdhwgohQfvioipipipipiriqitisiviuiwfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPhTixiyhVhYhXiyizhTeJhhiAiBhheJeVeVeJiDiCiEiEiEiEiEiCiFaMaMeJeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaafuiGfEfEiGfuiHiIfEfEfEhoiJfuhpifhNigeBeBaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIiOhdhdhdiPhdhdhdiQfIfIiRfviSipiTiTiUipipipiViWiWiWfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPiXhTiXhVhYhXiXhTiXeJhhhhhhhheJeVeVeJaMiDiYiYiYiYiYiFaMaMaMeJeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaiZjafEfEjaiZiNiNfEfEfEfEjbiZihjdhlhljeaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIfIfIhdjfhsjghdjhgOgOgOjifvipiTjjjkiTipjljmisjojnfvfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPjphThThVhYhXhThTjqeJhhhhhhjreJeVeVeJeJeJeJeJeJeJeJeJeJeJeJeJeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaajsjtfEgEfEkpgNgEfEjufEfEjvjsiikuijiKkvkxaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIfIfIhdjzhsjAhdjBjCjCjChyfvipiTjDjEiTipjljFfvfvfvfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPjHjGjGhVhYhXjIjIjJeJeJjKeJeJeJeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaajLjafEhcgNkDhcfEfEiLfEfEfEjLiMjOjejPgHaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIhehdhdhdhdhdjzhsjAhdjQjRjRjRjRjSipipipipipipjljFfvfvfvfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMgPhBhBhBhBhYhBhBhBhBhBaMaMaMaMeJeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaafujTfEfEjTfujUfEgEhcfEfEjUfujcjxjwjyaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIhdjZhshskahdjzhsjAhdkbkchxjChyfvkdiTiTiTipipjlkefvkgkffvfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhBhYhBaMaMaMaMaMaMaMaMeJeJeJeJeJeJeJeJeJeJeJeJeJeJeJeJeJeJeJaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaafufujMfufufufufugtkjgtfufufufufueBeBeBaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIhdjZhsklkkhdjzhsjAhdhdknkmhgkofvkqkskrksksipipipktkwkwkyfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhBhBhBhBhBhBhBhBhGhBhBhBhBhBhBhBhBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaahFgaaaeBaaeBjNgvhFaaaaeBaaaaaaaaeBaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvkAfIhdjZhshskBhdhshshshdhshshshdiRfvkCkEkCkCkFipipipfvkHkGkyfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhBkIkJkJkJkJkJkIkIkIkJkJkJkJkJkIhBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaeBeBaajVgaaalljWhFeBaajXaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIhdjZhshshskMhshshskNhshshshdhQfvfvjmkOkQkPfvkRfvfvfvfvfvfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMkSkIkIkIkTkIkIkIkIkIkIkIkTkIkIkIkSaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaeBeBaalrgElsaaaaaaeBaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIhdjZhshshskUhshshshjhshskWhdkXkXkofvfvfvfvfvkYkYkZlblalcfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhBkIkJkJkJkJkJkIkIkIkJkJkJkJkJkIhBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaaeBfufuldfufueBaaeBeBaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIhehdhdhdhdhdhdlehshshdhdhdhdhdhdhglflflflgkofvkYkYkYkYkYkYfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhBhElhlhlhlhlhlhlhlhlhlhlhlhlhhChBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaaaafujYkhkhfujVjdhalnkieBaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIhdlololpltlqhdhshshshdlulwlvlylxhdfIfJfIfIfKiskYkYkYkYkYlzfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAlAlAlAlAlAlAlAlAmgmhmhmhmhmhmhmhmhmhmhmhmhmhmglAlAlAlAlAlAlAlAlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaaaagtkhkzkhgtkKlFgClGfFfuaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIhdhshshsklhslHhshshslIhsklhskllJhdfIgofLfJgofvlKlKlKlKlKlLfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAlMlOlNlNlNlNlNlPnemhmhmhmhmhmhmhmhmhmhmhmhmhnglPlQlQlQlQlQlOlRlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaakLeBfukVkhlifufYlVgClGaaeBaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIhdlWhshshshslXhshshslYhshshshshshdfIfIfIfLhQfvfvfvfvfvfvfvfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAlMlOlNlZlNlZlNlPnemhmhmhmhmhmhmhmhmhmhmhmhmhnglPlQmalQmalQlOlRlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaeBfufufugtfufufumcljlGaaeBaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIhdlWhshsmemdhdmfmimfhdmjmkhshshshdfIfLfIgohQfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAlMlOlNlNmllNlNlPnemhmhmhmhmhnxnynxmhmhmhmhmhnglPlQlQmmlQlQlOlRlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaeBfufEmnmomnfEfuaanqaaaaeBaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIhdhshsmphdhdhdmqmrhshdhdhdhshshshdfIfIfJfIhQfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAlMlOlNlNlNlNlNlPnemhmhmhmhmhnxnDnxmhmhmhmhmhnglPlQlQlQlQlQlOlRlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaeBganzfEfEfEfEfEnzaaaaaaaagaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIhdmsmumthdfIhdmvmvmvhdfIhdmwmymxhdfIfIfIfIhQfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAlMlOlNlZlNlZlNlPnemhmhmhmhmhmhmhmhmhmhmhmhmhnglPlQmalQmalQlOlRlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaeBeBkLfFfumzfEfEfEmzfuaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIhdmvmvmvhdfIiOmAmCmBiQfIhdmvmvmvhdfIfIfIfIhQfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAlMlOlNlNlNlNlNlPnemhmhmhmhmhmhmhmhmhmhmhmhmhnglPlQlQlQlQlQlOlRlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaeBfufufulklklklklkfuaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIiOmAmCmBiQfIfIfIfIfIfIfIiOmAmCmBiQfIfIfIfIhQfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAlAlAmFmFmFmFmFlAmgmhmhmhmhmhmhmhmhmhmhmhmhmhmglAmFmFmFmFmFlAlAlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaafufulmlmlmfufuaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIhQfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAmHmHmHmHmHlAmImJmJmJmJmJmJmJmJmJmJmJmJmJmKlAmLmLmLmLmLlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanUnUnUaaaaaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvfvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlAlAlAlAlAlAlAmMmNmNmNmNmNmOmQmPmNmNmNmNmNmMlAlAlAlAlAlAlAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmRmMmMmMmSmMmTmTmTmTmTmMmSmMmMmMmRaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmRmRmUmRmRmRmRmVmXmWmRmRmRmRmUmRmRaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index de5001da2a8..ddb6d50c0f7 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -2818,7 +2818,7 @@ "bck" = (/obj/structure/table/wood,/obj/item/weapon/storage/fancy/donut_box,/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bcl" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bcm" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/captain) -"bcn" = (/obj/structure/displaycase,/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bcn" = (/obj/structure/displaycase/captain,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bco" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Dorm"; location = "HOP2"},/turf/simulated/floor/plasteel,/area/hallway/primary/central) "bcp" = (/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_x = 32; pixel_y = 28; tag = "icon-direction_evac (EAST)"},/obj/structure/sign/directions/security{dir = 1; icon_state = "direction_sec"; pixel_x = 32; pixel_y = 36; tag = "icon-direction_sec (NORTH)"},/turf/simulated/floor/plasteel,/area/hallway/primary/central) "bcq" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard) @@ -3969,7 +3969,7 @@ "byr" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/hor) "bys" = (/obj/structure/rack,/obj/item/device/aicard,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/crew_quarters/hor) "byt" = (/turf/simulated/wall/r_wall,/area/crew_quarters/hor) -"byu" = (/obj/structure/lamarr,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/crew_quarters/hor) +"byu" = (/obj/structure/displaycase/labcage,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/crew_quarters/hor) "byv" = (/obj/structure/grille,/obj/machinery/door/poddoor/preopen{id = "telelab"; name = "test chamber blast door"},/obj/structure/window/reinforced/fulltile,/obj/machinery/door/firedoor/heavy,/turf/simulated/floor/engine,/area/toxins/explab) "byw" = (/obj/machinery/door/poddoor/preopen{id = "telelab"; name = "test chamber blast door"},/obj/machinery/door/firedoor/heavy,/turf/simulated/floor/engine,/area/toxins/explab) "byx" = (/obj/machinery/atmospherics/components/unary/heat_reservoir/heater{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -6579,7 +6579,7 @@ "cwC" = (/obj/machinery/power/port_gen/pacman,/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) "cwD" = (/obj/structure/table,/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) "cwE" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/ai_monitored/storage/secure) - + (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index 4036e5a1f10..b4547824db6 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -267,144 +267,4 @@ var/pipenetwarnings = 10 corresponding = new trace_gas.type() G.trace_gases += corresponding - corresponding.moles = trace_gas.moles*G.volume/total_volume - - -/* -/datum/pipeline/proc/mingle_with_turf(turf/simulated/target, mingle_volume) - var/datum/gas_mixture/air_sample = air.remove_ratio(mingle_volume/air.volume) - air_sample.volume = mingle_volume - - var/datum/gas_mixture/turf_air = target.return_air() - - equalize_gases(list(air_sample, turf_air)) - air.merge(air_sample) - //turf_air already modified by equalize_gases() - - if(istype(target)) - if(target.air) - if(target.air.check_tile_graphic()) - target.update_visuals(target.air) - update = 1 - -/datum/pipeline/proc/reconcile_air() - //Perfectly equalize all gases members instantly - - //Calculate totals from individual components - var/total_thermal_energy = 0 - var/total_heat_capacity = 0 - var/datum/gas_mixture/air_transient = new() - var/list/gases = list(air) - gases.Add(other_airs) - for(var/datum/gas_mixture/gas in gases) - air_transient.volume += gas.volume - total_thermal_energy += gas.thermal_energy() - total_heat_capacity += gas.heat_capacity() - - air_transient.oxygen += gas.oxygen - air_transient.nitrogen += gas.nitrogen - air_transient.toxins += gas.toxins - air_transient.carbon_dioxide += gas.carbon_dioxide - - if(gas.trace_gases.len) - for(var/datum/gas/trace_gas in gas.trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in air_transient.trace_gases - if(!corresponding) - corresponding = new trace_gas.type() - air_transient.trace_gases += corresponding - - corresponding.moles += trace_gas.moles - - if(air_transient.volume > 0) - - if(total_heat_capacity > 0) - air_transient.temperature = total_thermal_energy/total_heat_capacity - - //Allow air mixture to react - if(air_transient.react()) - update = 1 - - else - air_transient.temperature = 0 - - //Update individual gas_mixtures by volume ratio - for(var/datum/gas_mixture/gas in gases) - gas.oxygen = air_transient.oxygen*gas.volume/air_transient.volume - gas.nitrogen = air_transient.nitrogen*gas.volume/air_transient.volume - gas.toxins = air_transient.toxins*gas.volume/air_transient.volume - gas.carbon_dioxide = air_transient.carbon_dioxide*gas.volume/air_transient.volume - - gas.temperature = air_transient.temperature - - if(air_transient.trace_gases.len) - for(var/datum/gas/trace_gas in air_transient.trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in gas.trace_gases - if(!corresponding) - corresponding = new trace_gas.type() - gas.trace_gases += corresponding - - corresponding.moles = trace_gas.moles*gas.volume/air_transient.volume - return 1 - -/proc/equalize_gases(datum/gas_mixture/list/gases) - //Perfectly equalize all gases members instantly - - //Calculate totals from individual components - var/total_volume = 0 - var/total_thermal_energy = 0 - var/total_heat_capacity = 0 - - var/total_oxygen = 0 - var/total_nitrogen = 0 - var/total_toxins = 0 - var/total_carbon_dioxide = 0 - - var/list/total_trace_gases = list() - - for(var/datum/gas_mixture/gas in gases) - total_volume += gas.volume - total_thermal_energy += gas.thermal_energy() - total_heat_capacity += gas.heat_capacity() - - total_oxygen += gas.oxygen - total_nitrogen += gas.nitrogen - total_toxins += gas.toxins - total_carbon_dioxide += gas.carbon_dioxide - - if(gas.trace_gases.len) - for(var/datum/gas/trace_gas in gas.trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in total_trace_gases - if(!corresponding) - corresponding = new trace_gas.type() - total_trace_gases += corresponding - - corresponding.moles += trace_gas.moles - - if(total_volume > 0) - - //Calculate temperature - var/temperature = 0 - - if(total_heat_capacity > 0) - temperature = total_thermal_energy/total_heat_capacity - - //Update individual gas_mixtures by volume ratio - for(var/datum/gas_mixture/gas in gases) - gas.oxygen = total_oxygen*gas.volume/total_volume - gas.nitrogen = total_nitrogen*gas.volume/total_volume - gas.toxins = total_toxins*gas.volume/total_volume - gas.carbon_dioxide = total_carbon_dioxide*gas.volume/total_volume - - gas.temperature = temperature - - if(total_trace_gases.len) - for(var/datum/gas/trace_gas in total_trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in gas.trace_gases - if(!corresponding) - corresponding = new trace_gas.type() - gas.trace_gases += corresponding - - corresponding.moles = trace_gas.moles*gas.volume/total_volume - - return 1 -*/ \ No newline at end of file + corresponding.moles = trace_gas.moles*G.volume/total_volume \ No newline at end of file diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm index 0dee6d8186a..50e2645eced 100644 --- a/code/LINDA/LINDA_turf_tile.dm +++ b/code/LINDA/LINDA_turf_tile.dm @@ -55,18 +55,20 @@ /turf/simulated/New() ..() - + levelupdate() + if(smooth) + smooth_icon(src) + visibilityChanged() if(!blocks_air) air = new - air.oxygen = oxygen air.carbon_dioxide = carbon_dioxide air.nitrogen = nitrogen air.toxins = toxins - air.temperature = temperature /turf/simulated/Del() + visibilityChanged() if(active_hotspot) active_hotspot.Kill() ..() diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index b03c73b01c0..9c9d1da8b9d 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -23,12 +23,13 @@ #define FRIDAY_13TH "Friday the 13th" //Human Overlays Indexes///////// -#define SPECIES_LAYER 26 // mutantrace colors... these are on a seperate layer in order to prvent +#define SPECIES_LAYER 27 // mutantrace colors... these are on a seperate layer in order to prvent +#define MUTATIONS_LAYER 26 //mutations. Hulk, Tk headglows, etc #define BODY_BEHIND_LAYER 25 #define BODY_LAYER 24 //underwear, undershirts, socks, eyes, lips(makeup) #define BODY_ADJ_LAYER 23 -#define MUTATIONS_LAYER 22 //Tk headglows etc. -#define AUGMENTS_LAYER 21 +#define AUGMENTS_LAYER 22 +#define FRONT_MUTATIONS_LAYER 21 //mutations that should appear above body and augments layer (e.g. laser eyes) #define DAMAGE_LAYER 20 //damage indicators (cuts and burns) #define UNIFORM_LAYER 19 #define ID_LAYER 18 @@ -49,7 +50,7 @@ #define R_HAND_LAYER 3 //Having the two hands seperate seems rather silly, merge them together? It'll allow for code to be reused on mobs with arbitarily many hands #define BODY_FRONT_LAYER 2 #define FIRE_LAYER 1 //If you're on fire -#define TOTAL_LAYERS 26 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; +#define TOTAL_LAYERS 27 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; //Human Overlay Index Shortcuts for alternate_worn_layer, layers //Because I *KNOW* somebody will think layer+1 means "above" diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 21626590306..1d7c5cfdd24 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -380,3 +380,56 @@ return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y) +/proc/pollCandidates(var/Question, var/jobbanType, var/datum/game_mode/gametypeCheck, var/be_special_flag = 0, var/poll_time = 300) + var/list/mob/dead/observer/candidates = list() + var/time_passed = world.time + if (!Question) + Question = "Would you like to be a special role?" + + for(var/mob/dead/observer/G in player_list) + if(!G.key || !G.client) + continue + if(be_special_flag) + if(!(G.client.prefs.be_special & be_special_flag)) + continue + if (gametypeCheck) + if(!gametypeCheck.age_check(G.client)) + continue + if (jobbanType) + if(jobban_isbanned(G, jobbanType) || jobban_isbanned(G, "Syndicate")) + continue + spawn(0) + G << 'sound/misc/notice2.ogg' //Alerting them to their consideration + switch(alert(G,Question,"Please answer in [poll_time/10] seconds!","Yes","No")) + if("Yes") + G << "Choice registered: Yes." + if((world.time-time_passed)>poll_time)//If more than 30 game seconds passed. + G << "Sorry, you were too late for the consideration!" + G << 'sound/machines/buzz-sigh.ogg' + return + candidates += G + if("No") + G << "Choice registered: No." + return + else + return + sleep(poll_time) + + //Check all our candidates, to make sure they didn't log off during the 30 second wait period. + for(var/mob/dead/observer/G in candidates) + if(!G.key || !G.client) + candidates.Remove(G) + + return candidates + +/proc/makeBody(mob/dead/observer/G_found) // Uses stripped down and bastardized code from respawn character + if(!G_found || !G_found.key) return + + //First we spawn a dude. + var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned. + + G_found.client.prefs.copy_to(new_character) + new_character.dna.update_dna_identity() + new_character.key = G_found.key + + return new_character diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 1bc6978f701..ad8c54e1ca9 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1415,26 +1415,32 @@ B --><-- A */ -/atom/movable/var/atom/orbiting = null //This is just so you can stop an orbit. //orbit() can run without it (swap orbiting for A) //but then you can never stop it and that's just silly. +/atom/movable/var/atom/orbiting = null +//we raise this each time orbit is called to prevent mutiple calls in a short time frame from breaking things +/atom/movable/var/orbitid = 0 -/atom/movable/proc/orbit(atom/A, radius = 10, clockwise = 1, angle_increment = 15) +/atom/movable/proc/orbit(atom/A, radius = 10, clockwise = 1, angle_increment = 15, lockinorbit = 0) if(!istype(A)) return + orbitid++ + var/myid = orbitid if (orbiting) stop_orbit() - sleep(1) //sadly this is the only way to ensure the original orbit proc stops and resets the atom's transform. - if (orbiting || !istype(A)) //post sleep re-check - return + //sadly this is the only way to ensure the original orbit proc stops and resets the atom's transform. + sleep(1) + if (orbiting || !istype(A) || orbitid != myid) //post sleep re-check + return orbiting = A + var/lastloc = loc var/angle = 0 var/matrix/initial_transform = matrix(transform) spawn - while(orbiting && orbiting.loc) - loc = orbiting.loc - + while(orbiting && orbiting.loc && orbitid == myid && (!lockinorbit || loc == lastloc)) + loc = get_turf(orbiting.loc) + lastloc = loc angle += angle_increment var/matrix/shift = matrix(initial_transform) @@ -1489,4 +1495,4 @@ B --><-- A I.pixel_x = x_offset I.pixel_y = y_offset - return I \ No newline at end of file + return I diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index aa1082cdf82..25454eefcff 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -14,4 +14,5 @@ var/global/list/chemical_reagents_list //list of all /datum/reagent datums in var/global/list/surgeries_list = list() //list of all surgeries by name, associated with their path. var/global/list/table_recipes = list() //list of all table craft recipes var/global/list/rcd_list = list() //list of Rapid Construction Devices. -var/global/list/apcs_list = list() //list of all Area Power Controller machines, seperate from machines for powernet speeeeeeed. \ No newline at end of file +var/global/list/apcs_list = list() //list of all Area Power Controller machines, seperate from machines for powernet speeeeeeed. +var/global/list/tracking_implants = list() //list of all tracking implants to work out what treks everyone are on. Sadly not on lavaworld not implemented... \ No newline at end of file diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index ccd6ccaf7f2..b3b0d91fbd1 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -5,8 +5,10 @@ recieving object instead, so that's the default action. This allows you to drag almost anything into a trash can. */ -/atom/MouseDrop(atom/over) +/atom/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) if(!usr || !over) return + if(over == src) + return usr.client.Click(src, src_location, src_control, params) if(!Adjacent(usr) || !over.Adjacent(usr)) return // should stop you from dragging through windows over.MouseDrop_T(src,usr) diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index b381803ba67..e843e61a035 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -64,6 +64,8 @@ var/datum/subsystem/events/SSevent for(var/datum/round_event_control/E in control) if(E.occurrences >= E.max_occurrences) continue if(E.earliest_start >= world.time) continue + if(ticker.mode.config_tag in E.gamemode_blacklist) continue + if(E.gamemode_whitelist && !(ticker.mode.config_tag in E.gamemode_whitelist)) continue if(E.holidayID) if(!holidays || !holidays[E.holidayID]) continue if(E.weight < 0) //for round-start events etc. @@ -81,6 +83,8 @@ var/datum/subsystem/events/SSevent for(var/datum/round_event_control/E in control) if(E.occurrences >= E.max_occurrences) continue if(E.earliest_start >= world.time) continue + if(ticker.mode.config_tag in E.gamemode_blacklist) continue + if(E.gamemode_whitelist && !(ticker.mode.config_tag in E.gamemode_whitelist)) continue if(E.holidayID) if(!holidays || !holidays[E.holidayID]) continue sum_of_weights -= E.weight diff --git a/code/controllers/subsystem/objects.dm b/code/controllers/subsystem/objects.dm index 61c7b804aea..24e206139b7 100644 --- a/code/controllers/subsystem/objects.dm +++ b/code/controllers/subsystem/objects.dm @@ -15,6 +15,7 @@ var/datum/subsystem/objects/SSobj NEW_SS_GLOBAL(SSobj) /datum/subsystem/objects/Initialize(timeofday, zlevel) + setupGenetics() for(var/atom/movable/AM in world) if (zlevel && AM.z != zlevel) continue diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index f351bd6d9cb..46f76fb41cd 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -59,7 +59,6 @@ var/datum/subsystem/ticker/ticker return ..() if(!syndicate_code_phrase) syndicate_code_phrase = generate_code_phrase() if(!syndicate_code_response) syndicate_code_response = generate_code_phrase() - setupGenetics() setupFactions() ..() diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 45f8ddab2f6..cd4363d9dff 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -252,6 +252,7 @@ body += "" body += "" body += "" + body += "" if(iscarbon(D)) body += "" body += "" @@ -592,6 +593,29 @@ body if(usr.client) usr.client.cmd_assume_direct_control(M) + else if(href_list["offer_control"]) + if(!check_rights(0)) return + + var/mob/M = locate(href_list["offer_control"]) + if(!istype(M)) + usr << "This can only be used on instances of type /mob" + return + M << "Control of your mob has been offered to dead players." + log_admin("[key_name(usr)] has offered control of ([key_name(M)]) to ghosts.") + message_admins("[key_name_admin(usr)] has offered control of ([key_name_admin(M)]) to ghosts") + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [M.real_name]?", "pAI", null, FALSE, 100) + var/mob/dead/observer/theghost = null + + if(candidates.len) + theghost = pick(candidates) + M << "Your mob has been taken over by a ghost!" + message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(M)])") + M.ghostize() + M.key = theghost.key + else + M << "There were no ghosts willing to take control." + message_admins("No ghosts were willing to take control of [key_name_admin(M)])") + else if(href_list["delall"]) if(!check_rights(R_DEBUG|R_SERVER)) return @@ -813,8 +837,7 @@ body if(result) var/newtype = species_list[result] - hardset_dna(H, null, null, null, null, newtype) - H.regenerate_icons() + H.set_species(newtype) else if(href_list["purrbation"]) if(!check_rights(R_SPAWN)) return @@ -828,7 +851,7 @@ body usr << "Mob doesn't exist anymore" return - if(H.dna && H.dna.species.id == "human") + if(H.dna.species.id == "human") if(H.dna.features["tail_human"] == "None" || H.dna.features["ears"] == "None") usr << "Put [H] on purrbation." H << "You suddenly feel valid." diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm index 8f48fdab86a..198faec9fe4 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -35,6 +35,6 @@ Bonus M << "[pick("You feel confused.", "You forgot what you were thinking about.")]" else M << "You are unable to think straight!" - M.confused = min(100, M.confused + 2) + M.confused = min(100, M.confused + 8) return diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm index cb730215ee9..68875694060 100644 --- a/code/datums/diseases/advance/symptoms/genetics.dm +++ b/code/datums/diseases/advance/symptoms/genetics.dm @@ -31,7 +31,8 @@ Bonus ..() if(prob(SYMPTOM_ACTIVATION_PROB * 5)) // 15% chance var/mob/living/carbon/M = A.affected_mob - if(!check_dna_integrity(M)) return + if(!M.has_dna()) + return switch(A.stage) if(4, 5) M << "[pick("Your skin feels itchy.", "You feel light headed.")]" @@ -44,7 +45,7 @@ Bonus possible_mutations = (bad_mutations | not_good_mutations) - mutations_list[RACEMUT] var/mob/living/carbon/M = A.affected_mob if(M) - if(!check_dna_integrity(M)) + if(!M.has_dna()) return archived_dna = M.dna.struc_enzymes @@ -52,10 +53,10 @@ Bonus /datum/symptom/genetic_mutation/End(datum/disease/advance/A) var/mob/living/carbon/M = A.affected_mob if(M && archived_dna) - if(!check_dna_integrity(M)) + if(!M.has_dna()) return - hardset_dna(M, se = archived_dna) - domutcheck(M) + M.dna.struc_enzymes = archived_dna + M.domutcheck() /* ////////////////////////////////////// diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index eb38e8689af..1ee18603a61 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -43,7 +43,7 @@ affected_mob.adjustToxLoss(2) affected_mob.updatehealth() if(4) - if(!src.transformed && !src.carrier) + if(!transformed && !carrier) //Save original dna for when the disease is cured. original_dna = new affected_mob.dna.type affected_mob.dna.copy_dna(original_dna) @@ -51,24 +51,22 @@ affected_mob << "You don't feel like yourself.." var/datum/dna/transform_dna = strain_data["dna"] - transform_dna.transfer_identity(affected_mob) + transform_dna.transfer_identity(affected_mob, transfer_SE = 1) affected_mob.real_name = affected_mob.dna.real_name + affected_mob.updateappearance(mutcolor_update=1) + affected_mob.domutcheck() - updateappearance(affected_mob) - domutcheck(affected_mob) - - src.transformed = 1 - src.carrier = 1 //Just chill out at stage 4 + transformed = 1 + carrier = 1 //Just chill out at stage 4 return /datum/disease/dnaspread/Del() if (original_dna && transformed && affected_mob) - original_dna.transfer_identity(affected_mob) + original_dna.transfer_identity(affected_mob, transfer_SE = 1) affected_mob.real_name = affected_mob.dna.real_name - - updateappearance(affected_mob) - domutcheck(affected_mob) + affected_mob.updateappearance(mutcolor_update=1) + affected_mob.domutcheck() affected_mob << "You feel more like yourself." ..() \ No newline at end of file diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 1b83792a13c..b5913c3e71a 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -201,9 +201,8 @@ if(3) if(ishuman(affected_mob)) var/mob/living/carbon/human/human = affected_mob - if(human.dna && human.dna.species.id != "slime") - hardset_dna(human, null, null, null, null, /datum/species/slime) - human.regenerate_icons() + if(human.dna.species.id != "slime") + human.set_species(/datum/species/slime) /datum/disease/transformation/corgi name = "The Barkening" diff --git a/code/datums/martial.dm b/code/datums/martial.dm index 96d8726d596..2929c4b0a2e 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -27,34 +27,22 @@ /datum/martial_art/proc/basic_hit(mob/living/carbon/human/A,mob/living/carbon/human/D) A.do_attack_animation(D) - var/damage = rand(0,9) + var/damage = rand(0,9) + A.dna.species.punchmod - var/atk_verb = "punch" + var/atk_verb = A.dna.species.attack_verb if(D.lying) atk_verb = "kick" - else if(A.dna) - atk_verb = A.dna.species.attack_verb - - if(A.dna) - damage += A.dna.species.punchmod if(!damage) - if(A.dna) - playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1) - else - playsound(D.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - D.visible_message("[A] has attempted to [atk_verb] [D]!") - add_logs(A, D, "attempted to [atk_verb]") - return 0 + playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1) + D.visible_message("[A] has attempted to [atk_verb] [D]!") + add_logs(A, D, "attempted to [atk_verb]") + return 0 var/obj/item/organ/limb/affecting = D.get_organ(ran_zone(A.zone_sel.selecting)) var/armor_block = D.run_armor_check(affecting, "melee") - if(A.dna) - playsound(D.loc, A.dna.species.attack_sound, 25, 1, -1) - else - playsound(D.loc, 'sound/weapons/punch1.ogg', 25, 1, -1) - + playsound(D.loc, A.dna.species.attack_sound, 25, 1, -1) D.visible_message("[A] has [atk_verb]ed [D]!", \ "[A] has [atk_verb]ed [D]!") @@ -104,24 +92,18 @@ var/atk_verb = pick("left hook","right hook","straight punch") - var/damage = rand(5,8) - if(A.dna) - damage += A.dna.species.punchmod + var/damage = rand(5,8) + A.dna.species.punchmod if(!damage) - if(A.dna) - playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1) - else - playsound(D.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - D.visible_message("[A] has attempted to hit [D] with a [atk_verb]!") - add_logs(A, D, "attempted to hit", atk_verb) - return 0 + playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1) + D.visible_message("[A] has attempted to hit [D] with a [atk_verb]!") + add_logs(A, D, "attempted to hit", atk_verb) + return 0 var/obj/item/organ/limb/affecting = D.get_organ(ran_zone(A.zone_sel.selecting)) var/armor_block = D.run_armor_check(affecting, "melee") - playsound(D.loc, 'sound/weapons/punch1.ogg', 25, 1, -1) - + playsound(D.loc, A.dna.species.attack_sound, 25, 1, -1) D.visible_message("[A] has hit [D] with a [atk_verb]!", \ "[A] has hit [D] with a [atk_verb]!") diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 116bc8ac19c..f84c04f531a 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -976,10 +976,10 @@ usr << "Resetting DNA failed!" else var/mob/living/carbon/C = current - C.dna = changeling.first_prof.dna + changeling.first_prof.dna.transfer_identity(C, transfer_SE=1) C.real_name = changeling.first_prof.name - updateappearance(C) - domutcheck(C) + C.updateappearance(mutcolor_update=1) + C.domutcheck() else if (href_list["nuclear"]) switch(href_list["nuclear"]) @@ -1409,7 +1409,7 @@ var/mob/living/carbon/human/H = current - hardset_dna(H,null,null,null,null,/datum/species/abductor,null) + H.set_species(/datum/species/abductor) var/datum/species/abductor/S = H.dna.species switch(role) diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index 83455d194f7..64ff70e3eef 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -16,6 +16,9 @@ var/text_gain_indication = "" var/text_lose_indication = "" var/list/visual_indicators = list() + var/layer_used = MUTATIONS_LAYER //which mutation layer to use + var/list/species_allowed = list() //to restrict mutation to only certain species + var/health_req //minimum health required to acquire the mutation /datum/mutation/human/proc/force_give(mob/living/carbon/human/owner) set_block(owner) @@ -33,7 +36,7 @@ return before + injection + after /datum/mutation/human/proc/set_block(mob/living/carbon/owner, on = 1) - if(owner && istype(owner) && owner.dna) + if(owner && owner.has_dna()) owner.dna.struc_enzymes = set_se(owner.dna.struc_enzymes, on) /datum/mutation/human/proc/check_block_string(se_string) @@ -51,17 +54,25 @@ /datum/mutation/human/proc/on_acquiring(mob/living/carbon/human/owner) if(!owner || !istype(owner) || (src in owner.dna.mutations)) return 1 + if(species_allowed.len && !species_allowed.Find(owner.dna.species.id)) + return 1 + if(health_req && owner.health < health_req) + return 1 owner.dna.mutations.Add(src) - owner << text_gain_indication + if(text_gain_indication) + owner << text_gain_indication if(visual_indicators.len) - owner.update_mutation_overlays() + var/list/mut_overlay = list(get_visual_indicator(owner)) + if(owner.overlays_standing[layer_used]) + mut_overlay = owner.overlays_standing[layer_used] + mut_overlay |= get_visual_indicator(owner) + owner.remove_overlay(layer_used) + owner.overlays_standing[layer_used] = mut_overlay + owner.apply_overlay(layer_used) /datum/mutation/human/proc/get_visual_indicator(mob/living/carbon/human/owner) return -/datum/mutation/human/proc/lose_indication(mob/living/carbon/human/owner) - owner.overlays.Remove(visual_indicators) - /datum/mutation/human/proc/on_attack_hand(mob/living/carbon/human/owner, atom/target) return @@ -76,9 +87,16 @@ /datum/mutation/human/proc/on_losing(mob/living/carbon/human/owner) if(owner && istype(owner) && (owner.dna.mutations.Remove(src))) - owner << text_lose_indication + if(text_lose_indication) + owner << text_lose_indication if(visual_indicators.len) - owner.update_mutation_overlays() + var/list/mut_overlay = list() + if(owner.overlays_standing[layer_used]) + mut_overlay = owner.overlays_standing[layer_used] + owner.remove_overlay(layer_used) + mut_overlay.Remove(get_visual_indicator(owner)) + owner.overlays_standing[layer_used] = mut_overlay + owner.apply_overlay(layer_used) return 0 return 1 @@ -96,6 +114,8 @@ get_chance = 15 lowest_value = 256 * 12 text_gain_indication = "Your muscles hurt!" + species_allowed = list("human") //no skeleton/lizard hulk + health_req = 25 /datum/mutation/human/hulk/New() ..() @@ -583,32 +603,42 @@ message = replacetext(message," muh valids "," getting my kicks ") return trim(message) - /datum/mutation/human/laser_eyes - name = "Laser Eyes" quality = POSITIVE dna_block = NON_SCANNABLE text_gain_indication = "You feel pressure building up behind your eyes." + layer_used = FRONT_MUTATIONS_LAYER + +/datum/mutation/human/laser_eyes/New() + ..() + visual_indicators |= image("icon"='icons/effects/genetics.dmi', "icon_state"="lasereyes_s", "layer"=-FRONT_MUTATIONS_LAYER) + +/datum/mutation/human/laser_eyes/get_visual_indicator(mob/living/carbon/human/owner) + return visual_indicators[1] /datum/mutation/human/laser_eyes/on_ranged_attack(mob/living/carbon/human/owner, atom/target) if(owner.a_intent == "harm") owner.LaserEyes(target) -/mob/living/carbon/human/proc/update_mutation_overlays() - remove_overlay(MUTATIONS_LAYER) - var/image/standing +/mob/living/carbon/proc/update_mutations_overlay() + return +/mob/living/carbon/human/update_mutations_overlay() for(var/datum/mutation/human/CM in dna.mutations) + if(CM.species_allowed.len && !CM.species_allowed.Find(dna.species.id)) + CM.force_lose(src) //shouldn't have that mutation at all + continue if(CM.visual_indicators.len) + var/list/mut_overlay = list() + if(overlays_standing[CM.layer_used]) + mut_overlay = overlays_standing[CM.layer_used] var/image/V = CM.get_visual_indicator(src) - if(!standing) - standing = V - else - standing.overlays += V - - if(standing) - overlays_standing[MUTATIONS_LAYER] = standing - apply_overlay(MUTATIONS_LAYER) - + if(!mut_overlay.Find(V)) //either we lack the visual indicator or we have the wrong one + remove_overlay(CM.layer_used) + for(var/image/I in CM.visual_indicators) + mut_overlay.Remove(I) + mut_overlay |= V + overlays_standing[CM.layer_used] = mut_overlay + apply_overlay(CM.layer_used) diff --git a/code/datums/spells/bloodcrawl.dm b/code/datums/spells/bloodcrawl.dm index 0216a494c35..495a2335baa 100644 --- a/code/datums/spells/bloodcrawl.dm +++ b/code/datums/spells/bloodcrawl.dm @@ -1,13 +1,14 @@ /obj/effect/proc_holder/spell/bloodcrawl - name = "Blood crawl" - desc = "Use blood to travel." - charge_max = 10 + name = "Blood Crawl" + desc = "Use pools of blood to phase out of existence." + charge_max = 0 clothes_req = 0 selection_type = "range" range = 1 cooldown_min = 0 overlay = null action_icon_state = "bloodcrawl" + action_background_icon_state = "bg_demon" var/phased = 0 /obj/effect/proc_holder/spell/bloodcrawl/choose_targets(mob/user = usr) @@ -16,7 +17,7 @@ perform(target) return revert_cast() - user << "You need blood to blood crawl." + user << "There must be a nearby source of blood!" /obj/effect/proc_holder/spell/bloodcrawl/perform(obj/effect/decal/cleanable/target, recharge = 1, mob/living/user = usr) if(istype(user)) @@ -24,9 +25,9 @@ if(user.phasein(target)) phased = 0 else - user.phaseout(target) - phased = 1 + if(user.phaseout(target)) + phased = 1 start_recharge() return revert_cast() - user << "You cannot blood crawl." \ No newline at end of file + user << "You are unable to blood crawl!" diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm index ee2189c36f4..f199a06048f 100644 --- a/code/datums/spells/lichdom.dm +++ b/code/datums/spells/lichdom.dm @@ -55,7 +55,7 @@ lich.real_name = user.mind.name user.mind.transfer_to(lich) - hardset_dna(lich,null,null,lich.real_name,null,/datum/species/skeleton) + lich.hardset_dna(null,null,lich.real_name,null,/datum/species/skeleton) lich << "Your bones clatter and shutter as they're pulled back into this world!" charge_max += 600 var/mob/old_body = current_body @@ -98,7 +98,7 @@ marked_item.desc = "A terrible aura surrounds this item, its very existence is offensive to life itself..." marked_item.color = "#003300" user << "With a hideous feeling of emptiness you watch in horrified fascination as skin sloughs off bone! Blood boils, nerves disintegrate, eyes boil in their sockets! As your organs crumble to dust in your fleshless chest you come to terms with your choice. You're a lich!" - hardset_dna(user, null, null, null, null, /datum/species/skeleton) + user.set_species(/datum/species/skeleton) current_body = user.mind.current if(ishuman(user)) var/mob/living/carbon/human/H = user diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm index a32bae29911..75d971cced4 100644 --- a/code/datums/spells/wizard.dm +++ b/code/datums/spells/wizard.dm @@ -41,7 +41,6 @@ clothes_req = 1 invocation = "BIRUZ BENNAR" invocation_type = "shout" - message = "You feel strong! You feel a pressure building behind your eyes!" range = -1 include_user = 1 centcom_cancast = 0 @@ -248,7 +247,7 @@ sound="sound/magic/Blind.ogg" /obj/effect/proc_holder/spell/targeted/genetic/blind - disabilities = 1 + disabilities = BLIND duration = 300 sound="sound/magic/Blind.ogg" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index a59c0d7c867..373d98c3b36 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -280,11 +280,11 @@ var/list/blood_splatter_icons = list() //returns 1 if made bloody, returns 0 otherwise /atom/proc/add_blood(mob/living/carbon/M) - if(ishuman(M) && M.dna) + if(ishuman(M)) var/mob/living/carbon/human/H = M if(NOBLOOD in H.dna.species.specflags) return 0 - if(rejects_blood() || !istype(M) || !check_dna_integrity(M)) + if(rejects_blood() || !M.has_dna()) return 0 return 1 @@ -358,7 +358,7 @@ var/list/blood_splatter_icons = list() // Only adds blood on the floor -- Skie /atom/proc/add_blood_floor(mob/living/carbon/M) if(istype(src, /turf/simulated)) - if(check_dna_integrity(M)) //mobs with dna = (monkeys + humans at time of writing) + if(M.has_dna()) //mobs with dna = (monkeys + humans at time of writing) var/obj/effect/decal/cleanable/blood/B = locate() in contents if(!B) blood_splatter(src,M,1) diff --git a/code/game/dna.dm b/code/game/dna.dm index b402edbda36..33615f83cfb 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -1,19 +1,4 @@ -#define INJECTOR_TIMEOUT 300 -#define REJUVENATORS_INJECT 15 -#define REJUVENATORS_MAX 90 -#define NUMBER_OF_BUFFERS 3 -#define RADIATION_STRENGTH_MAX 15 -#define RADIATION_STRENGTH_MULTIPLIER 1 //larger has a more range - -#define RADIATION_DURATION_MAX 30 -#define RADIATION_ACCURACY_MULTIPLIER 3 //larger is less accurate - -#define RADIATION_IRRADIATION_MULTIPLIER 0.2 //multiplier for how much radiation a test subject recieves - -#define BAD_MUTATION_DIFFICULTY 2 -#define GOOD_MUTATION_DIFFICULTY 4 -#define OP_MUTATION_DIFFICULTY 5 /////////////////////////// DNA DATUM /datum/dna var/unique_enzymes @@ -27,26 +12,26 @@ var/mob/living/carbon/holder /datum/dna/New(mob/living/carbon/new_holder) - if(new_holder && istype(new_holder)) + if(new_holder) holder = new_holder -/datum/dna/proc/transfer_identity(mob/living/carbon/destination) - if(check_dna_integrity(destination)) - destination.dna.unique_enzymes = unique_enzymes - destination.dna.uni_identity = uni_identity - destination.dna.blood_type = blood_type - hardset_dna(destination, null, null, null, null, species.type) - destination.dna.features = features - destination.dna.real_name = real_name - destination.dna.mutations = mutations +/datum/dna/proc/transfer_identity(mob/living/carbon/destination, transfer_SE = 0) + destination.dna.unique_enzymes = unique_enzymes + destination.dna.uni_identity = uni_identity + destination.dna.blood_type = blood_type + destination.set_species(species.type, icon_update=0) + destination.dna.features = features + destination.dna.real_name = real_name + if(transfer_SE) + destination.dna.struc_enzymes = struc_enzymes /datum/dna/proc/copy_dna(datum/dna/new_dna) new_dna.unique_enzymes = unique_enzymes new_dna.struc_enzymes = struc_enzymes new_dna.uni_identity = uni_identity new_dna.blood_type = blood_type - new_dna.species = new species.type new_dna.features = features + new_dna.species = new species.type new_dna.real_name = real_name new_dna.mutations = mutations @@ -70,55 +55,72 @@ for(var/datum/mutation/human/HM in group) HM.force_lose(holder) -/datum/dna/proc/generate_uni_identity(mob/living/carbon/character) +/datum/dna/proc/generate_uni_identity() . = "" var/list/L = new /list(DNA_UNI_IDENTITY_BLOCKS) - if(istype(character)) - L[DNA_GENDER_BLOCK] = construct_block((character.gender!=MALE)+1, 2) - if(istype(character, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = character - if(!H.dna.species) - hardset_dna(H, null, null, null, null, /datum/species/human) - if(!hair_styles_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/hair, hair_styles_list, hair_styles_male_list, hair_styles_female_list) - L[DNA_HAIR_STYLE_BLOCK] = construct_block(hair_styles_list.Find(H.hair_style), hair_styles_list.len) - L[DNA_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.hair_color) - if(!facial_hair_styles_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/facial_hair, facial_hair_styles_list, facial_hair_styles_male_list, facial_hair_styles_female_list) - L[DNA_FACIAL_HAIR_STYLE_BLOCK] = construct_block(facial_hair_styles_list.Find(H.facial_hair_style), facial_hair_styles_list.len) - L[DNA_FACIAL_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.facial_hair_color) - L[DNA_SKIN_TONE_BLOCK] = construct_block(skin_tones.Find(H.skin_tone), skin_tones.len) - L[DNA_EYE_COLOR_BLOCK] = sanitize_hexcolor(H.eye_color) + + L[DNA_GENDER_BLOCK] = construct_block((holder.gender!=MALE)+1, 2) + if(ishuman(holder)) + var/mob/living/carbon/human/H = holder + if(!hair_styles_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/hair, hair_styles_list, hair_styles_male_list, hair_styles_female_list) + L[DNA_HAIR_STYLE_BLOCK] = construct_block(hair_styles_list.Find(H.hair_style), hair_styles_list.len) + L[DNA_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.hair_color) + if(!facial_hair_styles_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/facial_hair, facial_hair_styles_list, facial_hair_styles_male_list, facial_hair_styles_female_list) + L[DNA_FACIAL_HAIR_STYLE_BLOCK] = construct_block(facial_hair_styles_list.Find(H.facial_hair_style), facial_hair_styles_list.len) + L[DNA_FACIAL_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.facial_hair_color) + L[DNA_SKIN_TONE_BLOCK] = construct_block(skin_tones.Find(H.skin_tone), skin_tones.len) + L[DNA_EYE_COLOR_BLOCK] = sanitize_hexcolor(H.eye_color) for(var/i=1, i<=DNA_UNI_IDENTITY_BLOCKS, i++) if(L[i]) . += L[i] else . += random_string(DNA_BLOCK_SIZE,hex_characters) return . -/datum/dna/proc/generate_struc_enzymes(mob/living/carbon/character) - var/list/L = list("0","1","2","3","4","5","6") +/datum/dna/proc/generate_struc_enzymes() var/list/sorting = new /list(DNA_STRUC_ENZYMES_BLOCKS) var/result = "" for(var/datum/mutation/human/A in good_mutations + bad_mutations + not_good_mutations) - if(A.name == RACEMUT && istype(character,/mob/living/carbon/monkey)) + if(A.name == RACEMUT && ismonkey(holder)) sorting[A.dna_block] = num2hex(A.lowest_value + rand(0, 256 * 6), DNA_BLOCK_SIZE) - character.dna.mutations.Add(A) + mutations |= A else - sorting[A.dna_block] = random_string(DNA_BLOCK_SIZE, L) + sorting[A.dna_block] = random_string(DNA_BLOCK_SIZE, list("0","1","2","3","4","5","6")) for(var/B in sorting) result += B return result -/datum/dna/proc/generate_unique_enzymes(mob/living/carbon/character) +/datum/dna/proc/generate_unique_enzymes() . = "" - if(istype(character)) - real_name = character.real_name - . += md5(character.real_name) + if(istype(holder)) + real_name = holder.real_name + . += md5(holder.real_name) else - . += repeat_string(DNA_UNIQUE_ENZYMES_LEN, "0") + . += random_string(DNA_UNIQUE_ENZYMES_LEN, hex_characters) return . +/datum/dna/proc/update_ui_block(blocknumber) + if(!blocknumber || !ishuman(holder)) + return + var/mob/living/carbon/human/H = holder + switch(blocknumber) + if(DNA_HAIR_COLOR_BLOCK) + setblock(uni_identity, blocknumber, sanitize_hexcolor(H.hair_color)) + if(DNA_FACIAL_HAIR_COLOR_BLOCK) + setblock(uni_identity, blocknumber, sanitize_hexcolor(H.facial_hair_color)) + if(DNA_SKIN_TONE_BLOCK) + setblock(uni_identity, blocknumber, construct_block(skin_tones.Find(H.skin_tone), skin_tones.len)) + if(DNA_EYE_COLOR_BLOCK) + setblock(uni_identity, blocknumber, sanitize_hexcolor(H.eye_color)) + if(DNA_GENDER_BLOCK) + setblock(uni_identity, blocknumber, construct_block((H.gender!=MALE)+1, 2)) + if(DNA_FACIAL_HAIR_STYLE_BLOCK) + setblock(uni_identity, blocknumber, construct_block(facial_hair_styles_list.Find(H.facial_hair_style), facial_hair_styles_list.len)) + if(DNA_HAIR_STYLE_BLOCK) + setblock(uni_identity, blocknumber, construct_block(hair_styles_list.Find(H.hair_style), hair_styles_list.len)) + /datum/dna/proc/mutations_say_mods(message) if(message) for(var/datum/mutation/human/M in mutations) @@ -131,79 +133,130 @@ spans |= M.get_spans() return spans -/proc/hardset_dna(mob/living/carbon/owner, ui, se, real_name, blood_type, datum/species/mrace, features) - if(!ismonkey(owner) && !ishuman(owner)) - return - if(!owner.dna) - create_dna(owner, mrace) +/datum/dna/proc/is_same_as(datum/dna/D) + if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name) + if(species.type == D.species.type && features == D.features && blood_type == D.blood_type) + return 1 + return 0 - if(mrace && !ismonkey(owner)) - if(owner.dna.species.exotic_blood) - var/datum/reagent/exotic_blood = new owner.dna.species.exotic_blood - owner.reagents.del_reagent(exotic_blood.id) - owner.dna.species = new mrace() +//used to update dna UI, UE, and dna.real_name. +/datum/dna/proc/update_dna_identity() + uni_identity = generate_uni_identity() + unique_enzymes = generate_unique_enzymes() - if(features) - owner.dna.features = features +/datum/dna/proc/initialize_dna(newblood_type) + if(newblood_type) + blood_type = newblood_type + unique_enzymes = generate_unique_enzymes() + uni_identity = generate_uni_identity() + struc_enzymes = generate_struc_enzymes() + features = list("mcolor" = "FFF", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None") - if(real_name) - owner.real_name = real_name - owner.dna.generate_unique_enzymes(owner) - if(blood_type) - owner.dna.blood_type = blood_type - if(ui) - owner.dna.uni_identity = ui - updateappearance(owner) +/////////////////////////// DNA MOB-PROCS ////////////////////// - if(se) - owner.dna.struc_enzymes = se - domutcheck(owner) - - check_dna_integrity(owner) - - owner.regenerate_icons() +/mob/proc/set_species(datum/species/mrace, icon_update = 1) return -/proc/check_dna_integrity(mob/living/carbon/character) - if(!character || !(istype(character, /mob/living/carbon/human) || istype(character, /mob/living/carbon/monkey))) //Evict xenos from carbon 2012 +/mob/living/carbon/set_species(datum/species/mrace, icon_update = 1) + if(has_dna()) + if(dna.species.exotic_blood) + var/datum/reagent/EB = dna.species.exotic_blood + reagents.del_reagent(initial(EB.id)) + dna.species = new mrace() + +/mob/living/carbon/human/set_species(datum/species/mrace, icon_update = 1) + ..() + if(icon_update) + update_body() + update_hair() + update_mutcolor() + update_mutations_overlay()// no lizard with human hulk overlay please. + + +/mob/proc/has_dna() + return + +/mob/living/carbon/has_dna() + return dna + + +/mob/living/carbon/human/proc/hardset_dna(ui, se, newreal_name, newblood_type, datum/species/mrace, newfeatures) + + if(newfeatures) + dna.features = newfeatures + + if(mrace) + set_species(mrace, icon_update=0) + + if(newreal_name) + real_name = newreal_name + dna.generate_unique_enzymes() + + if(newblood_type) + dna.blood_type = newblood_type + + if(ui) + dna.uni_identity = ui + updateappearance(icon_update=0) + + if(se) + dna.struc_enzymes = se + domutcheck() + + if(mrace || newfeatures || ui) + update_body() + update_hair() + update_mutcolor() + update_mutations_overlay() + + +/mob/living/carbon/proc/create_dna() + dna = new /datum/dna(src) + if(!dna.species) + dna.species = new /datum/species/human() + +//proc used to update the mob's appearance after its dna UI has been changed +/mob/living/carbon/proc/updateappearance(icon_update=1, mutcolor_update=0, mutations_overlay_update=0) + if(!has_dna()) return - if(!character.dna) - if(ready_dna(character)) - return character.dna + gender = (deconstruct_block(getblock(dna.uni_identity, DNA_GENDER_BLOCK), 2)-1) ? FEMALE : MALE + +mob/living/carbon/human/updateappearance(icon_update=1, mutcolor_update=0, mutations_overlay_update=0) + ..() + var/structure = dna.uni_identity + hair_color = sanitize_hexcolor(getblock(structure, DNA_HAIR_COLOR_BLOCK)) + facial_hair_color = sanitize_hexcolor(getblock(structure, DNA_FACIAL_HAIR_COLOR_BLOCK)) + skin_tone = skin_tones[deconstruct_block(getblock(structure, DNA_SKIN_TONE_BLOCK), skin_tones.len)] + eye_color = sanitize_hexcolor(getblock(structure, DNA_EYE_COLOR_BLOCK)) + facial_hair_style = facial_hair_styles_list[deconstruct_block(getblock(structure, DNA_FACIAL_HAIR_STYLE_BLOCK), facial_hair_styles_list.len)] + hair_style = hair_styles_list[deconstruct_block(getblock(structure, DNA_HAIR_STYLE_BLOCK), hair_styles_list.len)] + if(icon_update) + update_body() + update_hair() + if(mutcolor_update) + update_mutcolor() + if(mutations_overlay_update) + update_mutations_overlay() + + +/mob/proc/domutcheck() + return + +/mob/living/carbon/domutcheck() + if(!has_dna()) return - if(length(character.dna.uni_identity) != DNA_UNI_IDENTITY_BLOCKS*DNA_BLOCK_SIZE) - character.dna.uni_identity = character.dna.generate_uni_identity(character) - if(length(character.dna.struc_enzymes)!= DNA_STRUC_ENZYMES_BLOCKS*DNA_BLOCK_SIZE) - character.dna.struc_enzymes = character.dna.generate_struc_enzymes() - if(!character.dna.real_name || length(character.dna.unique_enzymes) != DNA_UNIQUE_ENZYMES_LEN) - character.dna.unique_enzymes = character.dna.generate_unique_enzymes(character) - return character.dna + for(var/datum/mutation/human/A in good_mutations | bad_mutations | not_good_mutations) + if(ismob(A.check_block(src))) + return //we got monkeyized/humanized, this mob will be deleted, no need to continue. -/proc/ready_dna(mob/living/carbon/character, blood_type) - if(!istype(character, /mob/living/carbon/monkey) && !istype(character, /mob/living/carbon/human)) - return - if(!character.dna) - create_dna(character) - if(blood_type) - character.dna.blood_type = blood_type - character.dna.real_name = character.real_name - character.dna.uni_identity = character.dna.generate_uni_identity(character) - character.dna.struc_enzymes = character.dna.generate_struc_enzymes(character) - character.dna.unique_enzymes = character.dna.generate_unique_enzymes(character) - character.dna.features = character.features - return character.dna + update_mutations_overlay() -/proc/create_dna(mob/living/carbon/C, datum/species/S) //don't use this unless you're about to use hardset_dna or ready_dna - C.dna = new /datum/dna(C) - C.dna.holder = C - if(S) C.dna.species = new S() // do not remove; this is here to prevent runtimes -/////////////////////////// DNA DATUM -/////////////////////////// DNA HELPER-PROCS +/////////////////////////// DNA HELPER-PROCS ////////////////////////////// /proc/getleftblocks(input,blocknumber,blocksize) if(blocknumber > 1) return copytext(input,1,((blocksize*blocknumber)-(blocksize-1))) @@ -219,45 +272,35 @@ if(!istring || !blocknumber || !replacement || !blocksize) return 0 return getleftblocks(istring, blocknumber, blocksize) + replacement + getrightblocks(istring, blocknumber, blocksize) -/proc/scramble(input,rs,rd) - var/length = length(input) - var/ran = gaussian(0, rs*RADIATION_STRENGTH_MULTIPLIER) - if(ran == 0) ran = pick(-1,1) //hacky, statistically should almost never happen. 0-change makes people mad though - else if(ran < 0) ran = round(ran) //negative, so floor it - else ran = -round(-ran) //positive, so ceiling it - return num2hex(Wrap(hex2num(input)+ran, 0, 16**length), length) - -/proc/randomize_radiation_accuracy(position_we_were_supposed_to_hit, radduration, number_of_blocks) - return Wrap(round(position_we_were_supposed_to_hit + gaussian(0, RADIATION_ACCURACY_MULTIPLIER/radduration), 1), 1, number_of_blocks+1) - /proc/randmut(mob/living/carbon/M, list/candidates, difficulty = 2) - if(!check_dna_integrity(M)) + if(!M.has_dna()) return var/datum/mutation/human/num = pick(candidates) . = num.force_give(M) return /proc/randmutb(mob/living/carbon/M) - if(!check_dna_integrity(M)) + if(!M.has_dna()) return var/datum/mutation/human/HM = pick((bad_mutations | not_good_mutations) - mutations_list[RACEMUT]) . = HM.force_give(M) /proc/randmutg(mob/living/carbon/M) - if(!check_dna_integrity(M)) + if(!M.has_dna()) return var/datum/mutation/human/HM = pick(good_mutations) . = HM.force_give(M) /proc/randmuti(mob/living/carbon/M) - if(!check_dna_integrity(M)) return - var/num = rand(1, DNA_STRUC_ENZYMES_BLOCKS) + if(!M.has_dna()) + return + var/num = rand(1, DNA_UNI_IDENTITY_BLOCKS) var/newdna = setblock(M.dna.uni_identity, num, random_string(DNA_BLOCK_SIZE, hex_characters)) M.dna.uni_identity = newdna return /proc/clean_dna(mob/living/carbon/M) - if(!check_dna_integrity(M)) + if(!M.has_dna()) return M.dna.remove_all_mutations() @@ -266,691 +309,20 @@ randmut(M, candidates, difficulty) /proc/scramble_dna(mob/living/carbon/M, ui=FALSE, se=FALSE, probability) - if(!check_dna_integrity(M)) + if(!M.has_dna()) return 0 if(se) for(var/i=1, i<=DNA_STRUC_ENZYMES_BLOCKS, i++) if(prob(probability)) M.dna.struc_enzymes = setblock(M.dna.struc_enzymes, i, random_string(DNA_BLOCK_SIZE, hex_characters)) - domutcheck(M) + M.domutcheck() if(ui) for(var/i=1, i<=DNA_UNI_IDENTITY_BLOCKS, i++) if(prob(probability)) M.dna.uni_identity = setblock(M.dna.uni_identity, i, random_string(DNA_BLOCK_SIZE, hex_characters)) - updateappearance(M) + M.updateappearance(mutations_overlay_update=1) return 1 -/////////////////////////// DNA HELPER-PROCS - -/////////////////////////// DNA MISC-PROCS -/proc/updateappearance(mob/living/carbon/C) - if(!check_dna_integrity(C)) - return 0 - - var/structure = C.dna.uni_identity - C.gender = (deconstruct_block(getblock(structure, DNA_GENDER_BLOCK), 2)-1) ? FEMALE : MALE - if(istype(C, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = C - H.hair_color = sanitize_hexcolor(getblock(structure, DNA_HAIR_COLOR_BLOCK)) - H.facial_hair_color = sanitize_hexcolor(getblock(structure, DNA_FACIAL_HAIR_COLOR_BLOCK)) - H.skin_tone = skin_tones[deconstruct_block(getblock(structure, DNA_SKIN_TONE_BLOCK), skin_tones.len)] - H.eye_color = sanitize_hexcolor(getblock(structure, DNA_EYE_COLOR_BLOCK)) - H.facial_hair_style = facial_hair_styles_list[deconstruct_block(getblock(structure, DNA_FACIAL_HAIR_STYLE_BLOCK), facial_hair_styles_list.len)] - H.hair_style = hair_styles_list[deconstruct_block(getblock(structure, DNA_HAIR_STYLE_BLOCK), hair_styles_list.len)] - - H.update_body() - H.update_hair() - return 1 - -/proc/domutcheck(mob/living/carbon/M) - if(!check_dna_integrity(M)) - return 0 - - var/mob/living/carbon/C = M - var/mob/living/carbon/temp - - for(var/datum/mutation/human/A in good_mutations | bad_mutations | not_good_mutations) - temp = A.check_block(C) - if(ismob(temp)) - C = temp - -//////////////////////////////////////////////////////////// Monkey Block - if(M) - M.regenerate_icons() - return 1 -/////////////////////////// DNA MISC-PROCS - - -/////////////////////////// DNA MACHINES -/obj/machinery/dna_scannernew - name = "\improper DNA scanner" - desc = "It scans DNA structures." - icon = 'icons/obj/Cryogenic2.dmi' - icon_state = "scanner" - density = 1 - var/locked = 0 - anchored = 1 - use_power = 1 - idle_power_usage = 50 - active_power_usage = 300 - var/damage_coeff - var/scan_level - var/precision_coeff - -/obj/machinery/dna_scannernew/New() - ..() - component_parts = list() - component_parts += new /obj/item/weapon/circuitboard/clonescanner(null) - component_parts += new /obj/item/weapon/stock_parts/scanning_module(null) - component_parts += new /obj/item/weapon/stock_parts/manipulator(null) - component_parts += new /obj/item/weapon/stock_parts/micro_laser(null) - component_parts += new /obj/item/weapon/stock_parts/console_screen(null) - component_parts += new /obj/item/stack/cable_coil(null, 1) - component_parts += new /obj/item/stack/cable_coil(null, 1) - RefreshParts() - - -/obj/machinery/dna_scannernew/RefreshParts() - scan_level = 0 - damage_coeff = 0 - precision_coeff = 0 - for(var/obj/item/weapon/stock_parts/scanning_module/P in component_parts) - scan_level += P.rating - for(var/obj/item/weapon/stock_parts/manipulator/P in component_parts) - precision_coeff = P.rating - for(var/obj/item/weapon/stock_parts/micro_laser/P in component_parts) - damage_coeff = P.rating - -/obj/machinery/dna_scannernew/update_icon() - - //no power or maintenance - if(stat & (NOPOWER|BROKEN)) - icon_state = initial(icon_state)+ (state_open ? "_open" : "") + "_unpowered" - return - - if((stat & MAINT) || panel_open) - icon_state = initial(icon_state)+ (state_open ? "_open" : "") + "_maintenance" - return - - //running and someone in there - if(occupant) - icon_state = initial(icon_state)+ "_occupied" - return - - //running - icon_state = initial(icon_state)+ (state_open ? "_open" : "") - -/obj/machinery/dna_scannernew/power_change() - ..() - update_icon() - -/obj/machinery/dna_scannernew/proc/toggle_open(mob/user) - if(panel_open) - user << "Close the maintenance panel first." - return - - if(state_open) - close_machine() - return - - else if(locked) - user << "The bolts are locked down, securing the door shut." - return - - open_machine() - -/obj/machinery/dna_scannernew/container_resist() - var/mob/living/user = usr - var/breakout_time = 2 - if(state_open || !locked) //Open and unlocked, no need to escape - state_open = 1 - return - user.changeNext_move(CLICK_CD_BREAKOUT) - user.last_special = world.time + CLICK_CD_BREAKOUT - user << "You lean on the back of [src] and start pushing the door open... (this will take about [breakout_time] minutes.)" - user.visible_message("You hear a metallic creaking from [src]!") - - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds - if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked) - return - - locked = 0 - visible_message("[user] successfully broke out of [src]!") - user << "You successfully break out of [src]!" - - open_machine() - -/obj/machinery/dna_scannernew/close_machine() - if(!state_open) - return 0 - - ..() - - // search for ghosts, if the corpse is empty and the scanner is connected to a cloner - if(occupant) - if(locate(/obj/machinery/computer/cloning, get_step(src, NORTH)) \ - || locate(/obj/machinery/computer/cloning, get_step(src, SOUTH)) \ - || locate(/obj/machinery/computer/cloning, get_step(src, EAST)) \ - || locate(/obj/machinery/computer/cloning, get_step(src, WEST))) - - occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!") - return 1 - -/obj/machinery/dna_scannernew/open_machine() - if(state_open) - return 0 - - ..() - - return 1 - -/obj/machinery/dna_scannernew/relaymove(mob/user as mob) - if(user.stat || locked) - return - - open_machine() - return - -/obj/machinery/dna_scannernew/attackby(obj/item/I, mob/user, params) - - if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, I))//sent icon_state is irrelevant... - update_icon()//..since we're updating the icon here, since the scanner can be unpowered when opened/closed - return - - if(exchange_parts(user, I)) - return - - if(default_pry_open(I)) - return - - if(default_deconstruction_crowbar(I)) - return - - if(istype(I, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = I - if(!ismob(G.affecting)) - return - - if(!state_open) - user << "Open the scanner first." - return - - var/mob/M = G.affecting - M.loc = loc - user.stop_pulling() - qdel(G) - -/obj/machinery/dna_scannernew/attack_hand(mob/user) - if(..(user,1,0)) //don't set the machine, since there's no dialog - return - - toggle_open(user) - -/obj/machinery/dna_scannernew/blob_act() - if(prob(75)) - qdel(src) - - -//DNA COMPUTER -/obj/machinery/computer/scan_consolenew - name = "\improper DNA scanner access console" - desc = "Scan DNA." - icon_screen = "dna" - icon_keyboard = "med_key" - density = 1 - circuit = /obj/item/weapon/circuitboard/scan_consolenew - var/radduration = 2 - var/radstrength = 1 - - var/list/buffer[NUMBER_OF_BUFFERS] - - var/injectorready = 0 //Quick fix for issue 286 (screwdriver the screen twice to restore injector) -Pete - var/current_screen = "mainmenu" - var/obj/machinery/dna_scannernew/connected = null - var/obj/item/weapon/disk/data/diskette = null - anchored = 1 - use_power = 1 - idle_power_usage = 10 - active_power_usage = 400 - -/obj/machinery/computer/scan_consolenew/attackby(obj/item/I, mob/user, params) - if (istype(I, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES - if (!src.diskette) - if(!user.drop_item()) - return - I.loc = src - src.diskette = I - user << "You insert [I]." - src.updateUsrDialog() - return - else - ..() - return - -/obj/machinery/computer/scan_consolenew/New() - ..() - - spawn(5) - for(dir in list(NORTH,EAST,SOUTH,WEST)) - connected = locate(/obj/machinery/dna_scannernew, get_step(src, dir)) - if(!isnull(connected)) - break - spawn(250) - injectorready = 1 - return - return - -/obj/machinery/computer/scan_consolenew/attack_hand(mob/user) - if(..()) - return - ShowInterface(user) - -/obj/machinery/computer/scan_consolenew/proc/ShowInterface(mob/user, last_change) - if(!user) return - var/datum/browser/popup = new(user, "scannernew", "DNA Modifier Console", 800, 630) // Set up the popup browser window - if(!( in_range(src, user) || istype(user, /mob/living/silicon) )) - popup.close() - return - popup.add_stylesheet("scannernew", 'html/browser/scannernew.css') - - var/mob/living/carbon/viable_occupant - var/occupant_status = "
Subject Status:
" - var/scanner_status - var/temp_html - if(connected && connected.is_operational()) - if(connected.occupant) //set occupant_status message - viable_occupant = connected.occupant - if(check_dna_integrity(viable_occupant) && (!(viable_occupant.disabilities & NOCLONE) || (connected.scan_level == 3))) //occupent is viable for dna modification - occupant_status += "[viable_occupant.name] => " - switch(viable_occupant.stat) - if(CONSCIOUS) occupant_status += "Conscious" - if(UNCONSCIOUS) occupant_status += "Unconscious" - else occupant_status += "DEAD - Cannot Operate" - occupant_status += "
" - occupant_status += "
Health:
[viable_occupant.health] %
" - occupant_status += "
Radiation Level:
[viable_occupant.radiation] %
" - var/rejuvenators = viable_occupant.reagents.get_reagent_amount("epinephrine") - occupant_status += "
Rejuvenators:
[rejuvenators] units
" - occupant_status += "
Unique Enzymes :
[viable_occupant.dna.unique_enzymes]
" - occupant_status += "
Last Operation:
[last_change ? last_change : "----"]
" - else - viable_occupant = null - occupant_status += "Invalid DNA structure" - if (viable_occupant && viable_occupant.stat == DEAD) - viable_occupant = null // No editing the dead. - else - occupant_status += "No subject detected" - - if(connected.state_open) - scanner_status = "Open" - else - scanner_status = "Closed" - if(connected.locked) - scanner_status += " (Locked)" - else - scanner_status += " (Unlocked)" - - - else - occupant_status += "----" - scanner_status += "Error: No scanner detected" - - var/status = "
" - status += "
Scanner:
[scanner_status]
" - status += "[occupant_status]" - - - status += "

Radiation Emitter Status

" - var/stddev = radstrength*RADIATION_STRENGTH_MULTIPLIER - status += "
Output Level:
[radstrength]
" - status += "
  \> Mutation:
(-[stddev] to +[stddev] = 68 %) (-[2*stddev] to +[2*stddev] = 95 %)
" - if(connected) - stddev = RADIATION_ACCURACY_MULTIPLIER/(radduration + (connected.precision_coeff ** 2)) - else - stddev = RADIATION_ACCURACY_MULTIPLIER/radduration - var/chance_to_hit - switch(stddev) //hardcoded values from a z-table for a normal distribution - if(0 to 0.25) chance_to_hit = ">95 %" - if(0.25 to 0.5) chance_to_hit = "68-95 %" - if(0.5 to 0.75) chance_to_hit = "55-68 %" - else chance_to_hit = "<38 %" - status += "
Pulse Duration:
[radduration]
" - status += "
  \> Accuracy:
[chance_to_hit]
" - status += "
" // Close statusDisplay div - var/buttons = "Scan " - if(connected) - buttons += " [connected.state_open ? "Close" : "Open"] Scanner " - if (connected.state_open) - buttons += "[connected.locked ? "Unlock" : "Lock"] Scanner " - else - buttons += "[connected.locked ? "Unlock" : "Lock"] Scanner " - else buttons += "Open Scanner Lock Scanner " - if(viable_occupant) buttons += "Inject Rejuvenators " - else buttons += "Inject Rejuvenators " - if(diskette) buttons += "Eject Disk " - else buttons += "Eject Disk " - if(current_screen == "buffer") buttons += "Radiation Emitter Menu " - else buttons += "Buffer Menu " - - switch(current_screen) - if("working") - temp_html += status - temp_html += "

System Busy

" - temp_html += "Working ... Please wait ([radduration] Seconds)" - if("buffer") - temp_html += status - temp_html += buttons - temp_html += "

Buffer Menu

" - - if(istype(buffer)) - for(var/i=1, i<=buffer.len, i++) - temp_html += "
Slot [i]: " - var/list/buffer_slot = buffer[i] - if( !buffer_slot || !buffer_slot.len || !buffer_slot["name"] || !((buffer_slot["UI"] && buffer_slot["UE"]) || buffer_slot["SE"]) ) - temp_html += "
\tNo Data" - if(viable_occupant) temp_html += "
Save to Buffer " - else temp_html += "
Save to Buffer " - temp_html += "Clear Buffer " - if(diskette) temp_html += "Load from Disk " - else temp_html += "Load from Disk " - temp_html += "Save to Disk " - else - var/ui = buffer_slot["UI"] - var/se = buffer_slot["SE"] - var/ue = buffer_slot["UE"] - var/name = buffer_slot["name"] - var/label = buffer_slot["label"] - var/blood_type = buffer_slot["blood_type"] - temp_html += "
\tLabel: [label ? label : name]" - temp_html += "
\tSubject: [name]" - if(ue && name && blood_type) - temp_html += "
\tBlood Type: [blood_type]" - temp_html += "
\tUE: [ue] " - if(viable_occupant) temp_html += "Occupant " - else temp_html += "Occupant" - if(injectorready) temp_html += "Injector" - else temp_html += "Injector" - else - temp_html += "
\tBlood Type: No Data" - temp_html += "
\tUE: No Data" - if(ui) - temp_html += "
\tUI: [ui] " - if(viable_occupant) temp_html += "Occupant " - else temp_html += "Occupant" - if(injectorready) temp_html += "Injector" - else temp_html += "Injector" - else - temp_html += "
\tUI: No Data" - if(se) - temp_html += "
\tSE: [se] " - if(viable_occupant && viable_occupant.stat != DEAD) temp_html += "Occupant " - else temp_html += "Occupant " - if(injectorready) temp_html += "Injector" - else temp_html += "Injector" - else - temp_html += "
\tSE: No Data" - if(viable_occupant) temp_html += "
Save to Buffer " - else temp_html += "
Save to Buffer " - temp_html += "Clear Buffer " - if(diskette) temp_html += "Load from Disk " - else temp_html += "Load from Disk " - if(diskette && !diskette.read_only) temp_html += "Save to Disk " - else temp_html += "Save to Disk " - else - temp_html += status - temp_html += buttons - temp_html += "

Radiation Emitter Menu

" - - temp_html += "-- Output Level ++" - temp_html += "
-- Pulse Duration ++" - - temp_html += "

Irradiate Subject

" - temp_html += "
Unique Identifier:
" - - var/max_line_len = 7*DNA_BLOCK_SIZE - if(viable_occupant) - temp_html += "
1
" - var/len = length(viable_occupant.dna.uni_identity) - for(var/i=1, i<=len, i++) - temp_html += "[copytext(viable_occupant.dna.uni_identity,i,i+1)]" - if ((i % max_line_len) == 0) - temp_html += "
" - if((i % DNA_BLOCK_SIZE) == 0 && i < len) - temp_html += "
[(i / DNA_BLOCK_SIZE) + 1]
" - else - temp_html += "----" - temp_html += "

" - - temp_html += "
Structural Enzymes:
" - if(viable_occupant) - temp_html += "
1
" - var/len = length(viable_occupant.dna.struc_enzymes) - for(var/i=1, i<=len, i++) - temp_html += "[copytext(viable_occupant.dna.struc_enzymes,i,i+1)]" - if ((i % max_line_len) == 0) - temp_html += "
" - if((i % DNA_BLOCK_SIZE) == 0 && i < len) - temp_html += "
[(i / DNA_BLOCK_SIZE) + 1]
" - else - temp_html += "----" - temp_html += "
" - - popup.set_content(temp_html) - popup.open() - - -/obj/machinery/computer/scan_consolenew/Topic(href, href_list) - if(..()) - return - if(!isturf(usr.loc)) - return - if(!( (isturf(loc) && in_range(src, usr)) || istype(usr, /mob/living/silicon) )) - return - if(current_screen == "working") - return - - add_fingerprint(usr) - usr.set_machine(src) - - var/mob/living/carbon/viable_occupant - if(connected) - viable_occupant = connected.occupant - if(!istype(viable_occupant) || !viable_occupant.dna || (viable_occupant.disabilities & NOCLONE)) - viable_occupant = null - - //Basic Tasks/////////////////////////////////////////// - var/num = round(text2num(href_list["num"])) - var/last_change - switch(href_list["task"]) - if("togglelock") - if(connected) connected.locked = !connected.locked - if("toggleopen") - if(connected) connected.toggle_open(usr) - if("setduration") - if(!num) - num = round(input(usr, "Choose pulse duration:", "Input an Integer", null) as num|null) - if(num) - radduration = Wrap(num, 1, RADIATION_DURATION_MAX+1) - if("setstrength") - if(!num) - num = round(input(usr, "Choose pulse strength:", "Input an Integer", null) as num|null) - if(num) - radstrength = Wrap(num, 1, RADIATION_STRENGTH_MAX+1) - if("screen") - current_screen = href_list["text"] - if("rejuv") - if(viable_occupant && viable_occupant.reagents) - var/epinephrine_amount = viable_occupant.reagents.get_reagent_amount("epinephrine") - var/can_add = max(min(REJUVENATORS_MAX - epinephrine_amount, REJUVENATORS_INJECT), 0) - viable_occupant.reagents.add_reagent("epinephrine", can_add) - if("setbufferlabel") - var/text = sanitize(input(usr, "Input a new label:", "Input an Text", null) as text|null) - if(num && text) - num = Clamp(num, 1, NUMBER_OF_BUFFERS) - var/list/buffer_slot = buffer[num] - if(istype(buffer_slot)) - buffer_slot["label"] = text - if("setbuffer") - if(num && viable_occupant) - num = Clamp(num, 1, NUMBER_OF_BUFFERS) - buffer[num] = list( - "label"="Buffer[num]:[viable_occupant.real_name]", - "UI"=viable_occupant.dna.uni_identity, - "SE"=viable_occupant.dna.struc_enzymes, - "UE"=viable_occupant.dna.unique_enzymes, - "name"=viable_occupant.real_name, - "blood_type"=viable_occupant.dna.blood_type - ) - if("clearbuffer") - if(num) - num = Clamp(num, 1, NUMBER_OF_BUFFERS) - var/list/buffer_slot = buffer[num] - if(istype(buffer_slot)) - buffer_slot.Cut() - if("transferbuffer") - if(num && viable_occupant && viable_occupant.stat != DEAD) - num = Clamp(num, 1, NUMBER_OF_BUFFERS) - var/list/buffer_slot = buffer[num] - if(istype(buffer_slot)) //15 and 40 are just magic numbers that were here before so i didnt touch them, they are initial boundaries of damage - viable_occupant.radiation += rand(15/(connected.damage_coeff ** 2),40/(connected.damage_coeff ** 2)) //Each laser level reduces damage by lvl^2, so no effect on 1 lvl, 4 times less damage on 2 and 9 times less damage on 3 - switch(href_list["text"]) //Numbers are this high because other way upgrading laser is just not worth the hassle, and i cant think of anything better to inmrove - if("se") - if(buffer_slot["SE"]) - viable_occupant.dna.struc_enzymes = buffer_slot["SE"] - domutcheck(viable_occupant) - if("ui") - if(buffer_slot["UI"]) - viable_occupant.dna.uni_identity = buffer_slot["UI"] - updateappearance(viable_occupant) - else - if(buffer_slot["name"] && buffer_slot["UE"] && buffer_slot["blood_type"]) - viable_occupant.real_name = buffer_slot["name"] - viable_occupant.name = buffer_slot["name"] - viable_occupant.dna.unique_enzymes = buffer_slot["UE"] - viable_occupant.dna.blood_type = buffer_slot["blood_type"] - updateappearance(viable_occupant) - if("injector") - if(num && injectorready) - num = Clamp(num, 1, NUMBER_OF_BUFFERS) - var/list/buffer_slot = buffer[num] - if(istype(buffer_slot)) - var/obj/item/weapon/dnainjector/I - switch(href_list["text"]) - if("se") - if(buffer_slot["SE"]) - I = new /obj/item/weapon/dnainjector(loc) - for(var/datum/mutation/human/HM in good_mutations + bad_mutations + not_good_mutations) - if(HM.check_block_string(buffer_slot["SE"])) - if(prob(HM.get_chance)) - I.add_mutations.Add(HM) - else - I.remove_mutations.Add(HM) - I.damage_coeff = connected.damage_coeff - if("ui") - if(buffer_slot["UI"]) - I = new /obj/item/weapon/dnainjector(loc) - I.fields = list("UI"=buffer_slot["UI"]) - I.damage_coeff = connected.damage_coeff - else - if(buffer_slot["name"] && buffer_slot["UE"] && buffer_slot["blood_type"]) - I = new /obj/item/weapon/dnainjector(loc) - I.fields = list("name"=buffer_slot["name"], "UE"=buffer_slot["UE"], "blood_type"=buffer_slot["blood_type"]) - I.damage_coeff = connected.damage_coeff - if(I) - injectorready = 0 - spawn(INJECTOR_TIMEOUT) - injectorready = 1 - if("loaddisk") - if(num && diskette && diskette.fields) - num = Clamp(num, 1, NUMBER_OF_BUFFERS) - buffer[num] = diskette.fields.Copy() - if("savedisk") - if(num && diskette && !diskette.read_only) - num = Clamp(num, 1, NUMBER_OF_BUFFERS) - var/list/buffer_slot = buffer[num] - if(istype(buffer_slot)) - diskette.name = "data disk \[[buffer_slot["label"]]\]" - diskette.fields = buffer_slot.Copy() - if("ejectdisk") - if(diskette) - diskette.loc = get_turf(src) - diskette = null - if("pulseui","pulsese") - if(num && viable_occupant && connected && viable_occupant.stat != DEAD) - radduration = Wrap(radduration, 1, RADIATION_DURATION_MAX+1) - radstrength = Wrap(radstrength, 1, RADIATION_STRENGTH_MAX+1) - - var/locked_state = connected.locked - connected.locked = 1 - - current_screen = "working" - ShowInterface(usr) - - sleep(radduration*10) - current_screen = "mainmenu" - - if(viable_occupant && connected && connected.occupant==viable_occupant) - viable_occupant.radiation += (RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength)/(connected.damage_coeff ** 2) //Read comment in "transferbuffer" section above for explanation - switch(href_list["task"]) //Same thing as there but values are even lower, on best part they are about 0.0*, effectively no damage - if("pulseui") - var/len = length(viable_occupant.dna.uni_identity) - num = Wrap(num, 1, len+1) - num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) //Each manipulator level above 1 makes randomization as accurate as selected time + manipulator lvl^2 - //Value is this high for the same reason as with laser - not worth the hassle of upgrading if the bonus is low - var/block = round((num-1)/DNA_BLOCK_SIZE)+1 - var/subblock = num - block*DNA_BLOCK_SIZE - last_change = "UI #[block]-[subblock]; " - - var/hex = copytext(viable_occupant.dna.uni_identity, num, num+1) - last_change += "[hex]" - hex = scramble(hex, radstrength, radduration) - last_change += "->[hex]" - - viable_occupant.dna.uni_identity = copytext(viable_occupant.dna.uni_identity, 1, num) + hex + copytext(viable_occupant.dna.uni_identity, num+1, 0) - updateappearance(viable_occupant) - if("pulsese") - var/len = length(viable_occupant.dna.struc_enzymes) - num = Wrap(num, 1, len+1) - num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) - - var/block = round((num-1)/DNA_BLOCK_SIZE)+1 - var/subblock = num - block*DNA_BLOCK_SIZE - last_change = "SE #[block]-[subblock]; " - - var/hex = copytext(viable_occupant.dna.struc_enzymes, num, num+1) - last_change += "[hex]" - hex = scramble(hex, radstrength, radduration) - last_change += "->[hex]" - - viable_occupant.dna.struc_enzymes = copytext(viable_occupant.dna.struc_enzymes, 1, num) + hex + copytext(viable_occupant.dna.struc_enzymes, num+1, 0) - domutcheck(viable_occupant) - else - current_screen = "mainmenu" - - if(connected) - connected.locked = locked_state - - ShowInterface(usr,last_change) - - -/////////////////////////// DNA MACHINES -#undef INJECTOR_TIMEOUT -#undef REJUVENATORS_INJECT -#undef REJUVENATORS_MAX -#undef NUMBER_OF_BUFFERS - -#undef RADIATION_STRENGTH_MAX -#undef RADIATION_STRENGTH_MULTIPLIER - -#undef RADIATION_DURATION_MAX -#undef RADIATION_ACCURACY_MULTIPLIER - -#undef RADIATION_IRRADIATION_MULTIPLIER - -//#undef BAD_MUTATION_DIFFICULTY -//#undef GOOD_MUTATION_DIFFICULTY -//#undef OP_MUTATION_DIFFICULTY - //value in range 1 to values. values must be greater than 0 //all arguments assumed to be positive integers /proc/construct_block(value, values, blocksize=DNA_BLOCK_SIZE) @@ -968,10 +340,4 @@ value = values return value - -/datum/dna/proc/is_same_as(datum/dna/D) - if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name) - if(species == D.species && features == D.features && blood_type == D.blood_type) - return 1 - return 0 - +/////////////////////////// DNA HELPER-PROCS \ No newline at end of file diff --git a/code/game/gamemodes/abduction/abduction.dm b/code/game/gamemodes/abduction/abduction.dm index 0b710001f38..1151de4f55f 100644 --- a/code/game/gamemodes/abduction/abduction.dm +++ b/code/game/gamemodes/abduction/abduction.dm @@ -107,7 +107,7 @@ H = agent.current L = agent_landmarks[team_number] H.loc = L.loc - hardset_dna(H, null, null, null, null, /datum/species/abductor) + H.set_species(/datum/species/abductor) S = H.dna.species S.agent = 1 S.team = team_number @@ -115,13 +115,12 @@ equip_common(H,team_number) equip_agent(H,team_number) greet_agent(agent,team_number) - H.regenerate_icons() scientist = scientists[team_number] H = scientist.current L = scientist_landmarks[team_number] H.loc = L.loc - hardset_dna(H, null, null, null, null, /datum/species/abductor) + H.set_species(/datum/species/abductor) S = H.dna.species S.scientist = 1 S.team = team_number @@ -129,7 +128,6 @@ equip_common(H,team_number) equip_scientist(H,team_number) greet_scientist(scientist,team_number) - H.regenerate_icons() return ..() //Used for create antag buttons @@ -156,7 +154,7 @@ H = agent.current L = agent_landmarks[team_number] H.loc = L.loc - hardset_dna(H, null, null, null, null, /datum/species/abductor) + H.set_species(/datum/species/abductor) S = H.dna.species S.agent = 1 S.team = team_number @@ -164,13 +162,13 @@ equip_common(H,team_number) equip_agent(H,team_number) greet_agent(agent,team_number) - H.regenerate_icons() + scientist = scientists[team_number] H = scientist.current L = scientist_landmarks[team_number] H.loc = L.loc - hardset_dna(H, null, null, null, null, /datum/species/abductor) + H.set_species(/datum/species/abductor) S = H.dna.species S.scientist = 1 S.team = team_number @@ -178,7 +176,7 @@ equip_common(H,team_number) equip_scientist(H,team_number) greet_scientist(scientist,team_number) - H.regenerate_icons() + /datum/game_mode/abduction/proc/greet_agent(datum/mind/abductor,team_number) @@ -332,7 +330,7 @@ if(!owner.current || !ishuman(owner.current)) return 0 var/mob/living/carbon/human/H = owner.current - if(!H.dna || !H.dna.species || !(H.dna.species.id == "abductor")) + if(H.dna.species.id != "abductor") return 0 var/datum/species/abductor/S = H.dna.species ab_team = S.team diff --git a/code/game/gamemodes/abduction/abduction_gear.dm b/code/game/gamemodes/abduction/abduction_gear.dm index 9595f0883b9..94966530738 100644 --- a/code/game/gamemodes/abduction/abduction_gear.dm +++ b/code/game/gamemodes/abduction/abduction_gear.dm @@ -288,7 +288,7 @@ var/obj/machinery/abductor/console/console if(ishuman(source)) var/mob/living/carbon/human/H = source - if(H.dna && istype(H.dna.species, /datum/species/abductor)) + if(H.dna.species.id == "abductor") var/datum/species/abductor/S = H.dna.species console = get_team_console(S.team) home = console.pad @@ -405,8 +405,6 @@ Congratulations! You are now trained for xenobiology research!"} if(!ishuman(user)) return 0 var/mob/living/carbon/human/H = user - if(!H.dna) - return 0 if(H.dna.species.id != "abductor") return 0 return 1 @@ -460,11 +458,16 @@ Congratulations! You are now trained for xenobiology research!"} /obj/item/weapon/abductor_baton/proc/SleepAttack(mob/living/L,mob/living/user) if(L.stunned) L.SetSleeping(60) - L.visible_message("[user] has induced sleep in [L] with [src]!", \ + L.visible_message("[user] has induced sleep in [L] with [src]!", \ "You suddenly feel very drowsy!") - playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) + playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) - add_logs(user, L, "put to sleep") + add_logs(user, L, "put to sleep") + else + L.drowsyness += 1 + user << "Sleep inducement works fully only on stunned specimens! " + L.visible_message("[user] tried to induce sleep in [L] with [src]!", \ + "You suddenly feel drowsy!") return /obj/item/weapon/abductor_baton/proc/CuffAttack(mob/living/L,mob/living/user) @@ -490,13 +493,21 @@ Congratulations! You are now trained for xenobiology research!"} "[user] probes you!") var/species = "Unknown species" + var/helptext = "Species unsuitable for experiments." + if(ishuman(L)) var/mob/living/carbon/human/H = L - if(H.dna && H.dna.species) - species = "[H.dna.species.name]" + species = "[H.dna.species.name]" if(L.mind && L.mind.changeling) species = "Changeling lifeform" + var/obj/item/organ/internal/gland/temp = locate() in H.internal_organs + if(temp) + helptext = "Experimental gland detected!" + else + helptext = "Subject suitable for experiments." + user << "Probing result:[species]" + user << "[helptext]" /obj/item/weapon/restraints/handcuffs/energy name = "hard-light energy field" diff --git a/code/game/gamemodes/abduction/abduction_surgery.dm b/code/game/gamemodes/abduction/abduction_surgery.dm index f22f188945b..a97011d53db 100644 --- a/code/game/gamemodes/abduction/abduction_surgery.dm +++ b/code/game/gamemodes/abduction/abduction_surgery.dm @@ -8,7 +8,7 @@ if(!ishuman(user)) return 0 var/mob/living/carbon/human/H = user - if(H.dna && istype(H.dna.species, /datum/species/abductor)) + if(H.dna.species.id == "abductor") return 1 if((locate(/obj/item/weapon/implant/abductor) in H)) return 1 diff --git a/code/game/gamemodes/abduction/gland.dm b/code/game/gamemodes/abduction/gland.dm index fd2ecdcce4c..db0aa0c32dc 100644 --- a/code/game/gamemodes/abduction/gland.dm +++ b/code/game/gamemodes/abduction/gland.dm @@ -120,9 +120,7 @@ /obj/item/organ/internal/gland/pop/activate() owner << "You feel unlike yourself." var/species = pick(list(/datum/species/lizard,/datum/species/slime,/datum/species/plant/pod,/datum/species/fly)) - hardset_dna(owner, null, null, null, null, species) - owner.regenerate_icons() - return + owner.set_species(species) /obj/item/organ/internal/gland/ventcrawling origin_tech = "materials=4;biotech=5;bluespace=3" @@ -241,7 +239,7 @@ /obj/effect/cocoon/abductor/proc/Copy(mob/living/carbon/human/H) var/mob/living/carbon/human/interactive/greytide/clone = new(src) - hardset_dna(clone,H.dna.uni_identity,H.dna.struc_enzymes,H.real_name, H.dna.blood_type, H.dna.species.type, H.dna.features) + clone.hardset_dna(H.dna.uni_identity,H.dna.struc_enzymes,H.real_name, H.dna.blood_type, H.dna.species.type, H.dna.features) //There's no define for this / get all items ? var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\ diff --git a/code/game/gamemodes/abduction/machinery/console.dm b/code/game/gamemodes/abduction/machinery/console.dm index 725ebf46091..24f17a5ce92 100644 --- a/code/game/gamemodes/abduction/machinery/console.dm +++ b/code/game/gamemodes/abduction/machinery/console.dm @@ -4,8 +4,6 @@ var/team = 0 /obj/machinery/abductor/proc/IsAbductor(mob/living/carbon/human/H) - if(!H.dna) - return 0 return H.dna.species.id == "abductor" /obj/machinery/abductor/proc/IsAgent(mob/living/carbon/human/H) diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 78e195f331c..722f1bce2af 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -98,6 +98,7 @@ M.mind.name = newname M.real_name = newname M.name = newname + M.dna.update_dna_identity() var/datum/objective/protect/new_objective = new /datum/objective/protect new_objective.owner = M:mind new_objective:target = usr:mind diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index a88707f19cc..119d38f0645 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -346,7 +346,8 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas return if(has_dna(target.dna)) user << "We already have this DNA in storage!" - if(!check_dna_integrity(target)) + return + if(!target.has_dna()) user << "[target] is not compatible with our biology." return return 1 @@ -405,10 +406,9 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas /proc/changeling_transform(var/mob/living/carbon/human/user, var/datum/changelingprofile/chosen_prof) var/datum/dna/chosen_dna = chosen_prof.dna user.real_name = chosen_prof.name - user.dna = chosen_dna - hardset_dna(user, null, null, null, null, chosen_dna.species.type, chosen_dna.features) - domutcheck(user) - updateappearance(user) + chosen_dna.transfer_identity(user, 1) + user.updateappearance(mutcolor_update=1) + user.domutcheck() //vars hackery. not pretty, but better than the alternative. for(var/slot in slots) diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index 19315f476c0..bdd7fc1ac7c 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -20,6 +20,9 @@ /obj/effect/proc_holder/changeling/proc/on_purchase(mob/user) return +/obj/effect/proc_holder/changeling/proc/on_refund(mob/user) + return + /obj/effect/proc_holder/changeling/Click() var/mob/user = usr if(!user || !user.mind || !user.mind.changeling) diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index 8b5f9794d53..d9f6faa9457 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -388,16 +388,13 @@ var/list/sting_paths /mob/proc/remove_changeling_powers(keep_free_powers=0) if(ishuman(src) || ismonkey(src)) if(mind && mind.changeling) - digitalcamo = 0 - digitalinvis = 0 mind.changeling.changeling_speak = 0 mind.changeling.reset() for(var/obj/effect/proc_holder/changeling/p in mind.changeling.purchasedpowers) - if(!(p.dna_cost == 0 && keep_free_powers)) - mind.changeling.purchasedpowers -= p - if(istype(p,/obj/effect/proc_holder/changeling/augmented_eyesight)) - permanent_sight_flags -= SEE_MOBS - sight -= SEE_MOBS + if(p.dna_cost == 0 && keep_free_powers) + continue + mind.changeling.purchasedpowers -= p + p.on_refund(src) if(hud_used) hud_used.lingstingdisplay.icon_state = null hud_used.lingstingdisplay.invisibility = 101 diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index 054035f2e14..2d8316edfa5 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -130,7 +130,7 @@ if((target.disabilities & NOCLONE) || (target.disabilities & HUSK)) user << "DNA of [target] is ruined beyond usability!" return - if(!check_dna_integrity(target) || !ishuman(target)) + if(!ishuman(target)) user << "[target] is not compatible with this ability." return return 1 diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm index fb25c4401c0..98209853cff 100644 --- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm +++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm @@ -28,3 +28,8 @@ user.see_in_dark = 0 user.dna.species.invis_sight = initial(user.dna.species.invis_sight) return 1 + + +/obj/effect/proc_holder/changeling/augmented_eyesight/on_refund(mob/user) + user.permanent_sight_flags &= ~SEE_MOBS + user.sight &= ~SEE_MOBS \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/chameleon_skin.dm b/code/game/gamemodes/changeling/powers/chameleon_skin.dm index 36b7ba87339..f39505fa712 100644 --- a/code/game/gamemodes/changeling/powers/chameleon_skin.dm +++ b/code/game/gamemodes/changeling/powers/chameleon_skin.dm @@ -10,17 +10,21 @@ /obj/effect/proc_holder/changeling/chameleon_skin/sting_action(mob/user) - var/mob/living/carbon/human/H = user //SHOULD always be human, because req_human = 1 - if(!istype(H)) + var/mob/living/carbon/human/H = user //SHOULD always be human, because req_human = 1 //phil235 so why is it needd? + if(!istype(H)) // req_human could be done in can_sting stuff. return var/datum/mutation/human/HM = mutations_list[CHAMELEON] - if(H.dna && H.dna.mutations) - if(HM in H.dna.mutations) - HM.force_lose(H) - else - HM.force_give(H) + if(HM in H.dna.mutations) + HM.force_lose(H) + else + HM.force_give(H) feedback_add_details("changeling_powers","CS") return 1 - +/obj/effect/proc_holder/changeling/chameleon_skin/on_refund(mob/user) + if(user.has_dna()) + var/mob/living/carbon/C = user + var/datum/mutation/human/HM = mutations_list[CHAMELEON] + if(HM in C.dna.mutations) + HM.force_lose(C) \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/digitalcamo.dm b/code/game/gamemodes/changeling/powers/digitalcamo.dm index 13bf62bdbc4..79651c98a97 100644 --- a/code/game/gamemodes/changeling/powers/digitalcamo.dm +++ b/code/game/gamemodes/changeling/powers/digitalcamo.dm @@ -18,3 +18,7 @@ feedback_add_details("changeling_powers","CAM") return 1 + +/obj/effect/proc_holder/changeling/digitalcamo/on_refund(mob/user) + user.digitalcamo = 0 + user.digitalinvis = 0 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/humanform.dm b/code/game/gamemodes/changeling/powers/humanform.dm index 04d36c169ac..5fde1238159 100644 --- a/code/game/gamemodes/changeling/powers/humanform.dm +++ b/code/game/gamemodes/changeling/powers/humanform.dm @@ -24,12 +24,11 @@ if(!user || user.notransform) return 0 user << "We transform our appearance." - - user.humanize((TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPSRC), chosen_prof.name) - - changeling_transform(user, chosen_prof) changeling.purchasedpowers -= src + + var/newmob = user.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS) + + changeling_transform(newmob, chosen_prof) feedback_add_details("changeling_powers","LFT") - qdel(user) return 1 diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm index 2ce8470c19c..05406b02bdf 100644 --- a/code/game/gamemodes/changeling/powers/lesserform.dm +++ b/code/game/gamemodes/changeling/powers/lesserform.dm @@ -12,9 +12,7 @@ return 0 user << "Our genes cry out!" - user.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPSE | TR_KEEPSRC) + user.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) - // Human-form power now handled in monkeyize() feedback_add_details("changeling_powers","LF") - .=1 - qdel(user) \ No newline at end of file + return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index 71e6512b68b..1efb76bef3c 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -21,20 +21,23 @@ var/weapon_name_simple /obj/effect/proc_holder/changeling/weapon/try_to_sting(mob/user, mob/target) - if(istype(user.l_hand, weapon_type)) //Not the nicest way to do it, but eh - playsound(user, 'sound/effects/blobattack.ogg', 30, 1) - qdel(user.l_hand) - user.visible_message("With a sickening crunch, [user] reforms their [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms their [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms their [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "The [user.get_active_hand()] is stuck to your hand, you cannot grow a [weapon_name_simple] over it!" @@ -44,6 +47,10 @@ playsound(user, 'sound/effects/blobattack.ogg', 30, 1) return W +/obj/effect/proc_holder/changeling/weapon/on_refund(mob/user) + check_weapon(user, user.r_hand, 1) + check_weapon(user, user.l_hand, 0) + //Parent to space suits and armor. /obj/effect/proc_holder/changeling/suit name = "Organic Suit" @@ -61,10 +68,16 @@ var/blood_on_castoff = 0 /obj/effect/proc_holder/changeling/suit/try_to_sting(mob/user, mob/target) + if(check_suit(user)) + return + var/mob/living/carbon/human/H = user + ..(H, target) + +//checks if we already have an organic suit and casts it off. +/obj/effect/proc_holder/changeling/suit/proc/check_suit(mob/user) var/datum/changeling/changeling = user.mind.changeling if(!ishuman(user) || !changeling) - return - + return 1 var/mob/living/carbon/human/H = user if(istype(H.wear_suit, suit_type) || istype(H.head, helmet_type)) H.visible_message("[H] casts off their [suit_name_simple]!", "We cast off our [suit_name_simple][genetic_damage > 0 ? ", temporarily weakening our genomes." : "."]", "You hear the organic matter ripping and tearing!") @@ -82,8 +95,13 @@ changeling.geneticdamage += genetic_damage //Casting off a space suit leaves you weak for a few seconds. changeling.chem_recharge_slowdown -= recharge_slowdown + return 1 + +/obj/effect/proc_holder/changeling/suit/on_refund(mob/user) + if(!ishuman(user)) return - ..(H, target) + var/mob/living/carbon/human/H = user + check_suit(H) /obj/effect/proc_holder/changeling/suit/sting_action(mob/living/carbon/human/user) if(!user.canUnEquip(user.wear_suit)) diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm index b6880a371e7..d466f2b774d 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -16,6 +16,9 @@ for(var/datum/disease/D in user.viruses) D.cure() - + for(var/obj/item/organ/internal/I in user) + if(istype(I,/obj/item/organ/internal/body_egg/alien_embryo)) + I.Remove(user) + I.loc = get_turf(user) feedback_add_details("changeling_powers","AP") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm index 92d6c84daee..e9e28c37a4d 100644 --- a/code/game/gamemodes/changeling/powers/shriek.dm +++ b/code/game/gamemodes/changeling/powers/shriek.dm @@ -12,7 +12,7 @@ if(iscarbon(M)) if(!M.mind || !M.mind.changeling) M.adjustEarDamage(0,30) - M.confused += 20 + M.confused += 25 M.Jitter(50) else M << sound('sound/effects/screech.ogg') diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index 5cd021fff74..a94ff6fc68e 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -81,7 +81,7 @@ /obj/effect/proc_holder/changeling/sting/transformation/can_sting(mob/user, mob/target) if(!..()) return - if((target.disabilities & HUSK) || !check_dna_integrity(target)) + if((target.disabilities & HUSK) || !target.has_dna()) user << "Our sting appears ineffective against its DNA." return 0 return 1 @@ -92,15 +92,17 @@ if(ismonkey(target)) user << "Our genes cry out as we sting [target.name]!" - if(iscarbon(target) && (target.status_flags & CANWEAKEN)) + if(iscarbon(target)) var/mob/living/carbon/C = target - C.do_jitter_animation(500) - C.take_organ_damage(20, 0) //The process is extremely painful + if(C.status_flags & CANWEAKEN) + C.do_jitter_animation(500) + C.take_organ_damage(20, 0) //The process is extremely painful - target.visible_message("[target] begins to violenty convulse!","You feel a tiny prick and a begin to uncontrollably convulse!") - spawn(10) - hardset_dna(target, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.blood_type, NewDNA.species.type, NewDNA.features) - updateappearance(target) + target.visible_message("[target] begins to violenty convulse!","You feel a tiny prick and a begin to uncontrollably convulse!") + spawn(10) + NewDNA.transfer_identity(C, transfer_SE=1) + C.updateappearance(mutcolor_update=1) + C.domutcheck() feedback_add_details("changeling_powers","TS") return 1 @@ -125,7 +127,7 @@ /obj/effect/proc_holder/changeling/sting/false_armblade/can_sting(mob/user, mob/target) if(!..()) return - if((target.disabilities & HUSK) || !check_dna_integrity(target)) + if((target.disabilities & HUSK) || !target.has_dna()) user << "Our sting appears ineffective against its DNA." return 0 return 1 diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 9c3bf83d20c..eb56a644fb6 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -92,7 +92,8 @@ if(config.protect_assistant_from_antagonist) restricted_jobs += "Assistant" - acolytes_needed = max(2, round(num_players()/5)) //Scales the escape requirement with the amount of people in the round + acolytes_needed = round(num_players()/5,1) //Scales the escape requirement with the amount of people in the round; for every 5 players, one cultist added to the count, i.e. 25 players = 5 to escape + acolytes_needed = Clamp(acolytes_needed, 1, 15) //Max at 15 and minimum at 1 - before the update, people rarely got even 15 for(var/cultists_number = 1 to recommended_enemies) if(!antag_candidates.len) @@ -141,11 +142,11 @@ explanation = "Our knowledge must live on. Make sure at least [acolytes_needed] acolytes escape on the shuttle to spread their work on an another station." if("sacrifice") if(sacrifice_target) - explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. You will need the Rite of Tribute and three acolytes to do so." + explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. You will need the Sacrifice rune and three acolytes to do so." else explanation = "Free objective." if("eldergod") - explanation = "Summon Nar-Sie via the use of the Ritual of Dimensional Rending. It will only work if nine cultists stand on and around it." + explanation = "Summon Nar-Sie via the rune 'Call Forth The Geometer'. It will only work if nine acolytes stand on and around it." cult_mind.current << "Objective #[obj_count]: [explanation]" cult_mind.memory += "Objective #[obj_count]: [explanation]
" @@ -171,7 +172,7 @@ if(!where) mob << "Unfortunately, you weren't able to get a talisman. This is very bad and you should adminhelp immediately." else - mob << "You have a talisman in your [where], one that will help you start the cult on this station. Use it well, and remember - you are not the only one." + mob << "You have a talisman in your [where], one that will help you start the cult on this station. Use it well, and remember - you are not the only one." mob.update_icons() if(where == "backpack") var/obj/item/weapon/storage/B = mob.back @@ -203,13 +204,13 @@ cult -= cult_mind cult_mind.current.verbs -= /mob/living/proc/cult_innate_comm cult_mind.current.Paralyse(5) - cult_mind.current << "An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it." + cult_mind.current << "An unfamiliar white light flashes through your mind, cleansing the taint of the Dark One and all your memories as its servant." cult_mind.memory = "" update_cult_icons_removed(cult_mind) cult_mind.current.attack_log += "\[[time_stamp()]\] Has renounced the cult!" if(show_message) for(var/mob/M in viewers(cult_mind.current)) - M << "[cult_mind.current] looks like they just reverted to their old faith!" + M << "[cult_mind.current] looks like they just reverted to their old faith!" /datum/game_mode/proc/update_cult_icons_added(datum/mind/cult_mind) var/datum/atom_hud/antag/culthud = huds[ANTAG_HUD_CULT] @@ -259,7 +260,7 @@ if(!check_cult_victory()) feedback_set_details("round_end_result","win - cult win") feedback_set("round_end_result",acolytes_survived) - world << "The cult wins! It has succeeded in serving its dark masters!" + world << "The cult wins! It has succeeded in serving its dark master!" else feedback_set_details("round_end_result","loss - staff stopped the cult") feedback_set("round_end_result",acolytes_survived) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 000120ef61a..33c36715fc3 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -138,83 +138,82 @@ It also contains rune words, which are soon to be removed. Rite of Knowledge: \"karazet nahlizet ego\"
\


"*/ - text += "Rite of Translocation
The Rite of Translocation is a unique rite in that it requires a keyword before the scribing can begin. When invoked, the rune will \ + text += "Teleport
The Rite of Translocation is a unique rite in that it requires a keyword before the scribing can begin. When invoked, the rune will \ search for other Rites of Translocation with the same keyword. Assuming one is found, the user will be instantaneously transported to the location of the other rune. If more than two runes are scribed \ with the same keyword, it will choose randomly between all eligible runes and send the invoker to one of them.

" - text += "Rite of Forced Translocation
The Rite of Forced Translocation, like the Rite of Translocation, works by teleporting the person on the rune to one of the \ + text += "Teleport Other
The Rite of Forced Translocation, like the Rite of Translocation, works by teleporting the person on the rune to one of the \ same keyword. However, this rune will only work on people other than the user, allowing the user to send any living creature somewhere else.

" - text += "Rite of Knowledge
The Rite of Knowledge is a simplistic rune. When invoked, it will summon a single arcane tome to the rune's location before vanishing. \ + text += "Summon Tome
The Rite of Knowledge is a simplistic rune. When invoked, it will summon a single arcane tome to the rune's location before vanishing. \

" - text += "Rite of Enlightenment
The Rite of Enlightment is paramount to the success of the cult. It will allow you to convert normal crew members into cultists. \ - To do this, simply place the crew member upon the rune and invoke it. This may take some time, depending on the amount of cultists nearby. It takes twenty seconds, with each additional cultist shaving \ - off ten seconds of the conversion. With three or more cultists, conversion is instantaneous. Once invoked, only the original user must remain. If the target is loyalty-implanted or has a null rod in \ - their possession, this will not work.

" + text += "Convert
The Rite of Enlightment is paramount to the success of the cult. It will allow you to convert normal crew members into cultists. \ + To do this, simply place the crew member upon the rune and invoke it. This rune requires two acolytes to use. If the target to be converted is loyalty-implanted or a certain assignment, they will \ + be unable to be converted. People the Geometer wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like a null rod will not be converted.

" - text += "Rite of Tribute
The Rite of Tribute is used to offer sacrifice to the Geometer. Simply place any living creature upon the rune and invoke it (this will not \ + text += "Sacrifice
The Rite of Tribute is used to offer sacrifice to the Geometer. Simply place any living creature upon the rune and invoke it (this will not \ target cultists!). If this creature has a mind, a soul shard will be created and the creature's soul transported to it. This rune is required if the cult's objectives include the sacrifice of a crew \ member.

" - text += "Rite of Resurrection
The Rite of Resurrection is a delicate rite that requires two corpses. To perform the ritual, place the corpse you wish to revive onto \ + text += "Raise Dead
The Rite of Resurrection is a delicate rite that requires two corpses. To perform the ritual, place the corpse you wish to revive onto \ the rune and the offering body adjacent to it. When the rune is invoked, the body to be sacrificed will turn to ashes, the life force flowing into the revival target. Assuming the target is not moved \ within a few seconds, they will be brought back to life, healed of all ailments.

" - text += "Rite of Obscurity
The Rite of Obscurity is a rite that will cause all nearby runes to become invisible. The runes will still be considered by other rites \ + text += "Veil Runes
The Rite of Obscurity is a rite that will cause all nearby runes to become invisible. The runes will still be considered by other rites \ (such as the Rite of Translocation) but is unusuable directly.

" - text += "Rite of True Sight
The Rite of True Sight is the foil of the Rite of Obscurity. It will turn all invisible runes visible once more, in addition to causing \ + text += "Reveal Runes
The Rite of True Sight is the foil of the Rite of Obscurity. It will turn all invisible runes visible once more, in addition to causing \ all spirits nearby to become partially corporeal.

" - text += "Rite of False Truths
Many crew men enjoy drawing runes in crayon that resemble spell circles in order to play pranks on their fellow crewmen. The Rite of \ + text += "Disguise Runes
Many crew men enjoy drawing runes in crayon that resemble spell circles in order to play pranks on their fellow crewmen. The Rite of \ False Truths takes advantage of this very joke. When invoked, all nearby runes will appear dull, precisely resembling those drawn in crayon. They still cannot be cleaned by conventional means, so \ anyone trying to clean up the rune may become suspicious as it does not respond.

" - text += "Rite of Disruption
Robotic lifeforms have time and time again been the downfall of fledgling cults. The Rite of Disruption may allow you to gain the upper \ + text += "Electromagnetic Disruption
Robotic lifeforms have time and time again been the downfall of fledgling cults. The Rite of Disruption may allow you to gain the upper \ hand against these pests. By using the rune, a large electromagnetic pulse will be emitted from the rune's location.

" - text += "Rite of Astral Communion
The Rite of Astral Communion is perhaps the most ingenious rune that is usable by a single person. Upon invoking the rune, the \ + text += "Astral Communion
The Rite of Astral Communion is perhaps the most ingenious rune that is usable by a single person. Upon invoking the rune, the \ user's spirit will be ripped from their body. In this state, the user's physical body will be locked in place to the rune itself - any attempts to move it will result in the rune pulling it back. \ The body will also take constant damage while in this form, and may even die. The user's spirit will contain their consciousness, and will allow them to freely wander the station as a ghost. This may \ also be used to commune with the dead.

" - text += "Rite of the Corporeal Shield
While simple, the Rite of the Corporeal Shield serves an important purpose in defense and hindering passage. When invoked, the \ + text += "Form Shield
While simple, the Rite of the Corporeal Shield serves an important purpose in defense and hindering passage. When invoked, the \ rune will draw a small amount of life force from the user and make the space above the rune completely dense, rendering it impassable to all but the most complex means. The rune may be invoked again to \ undo this effect and allow passage again.

" - text += "Rite of the Unheard Whisper
The Rite of the Unheard Whisper is simple. When invoked, it will cause all non-cultists within a radius of seven tiles to become \ + text += "Deafen
The Rite of the Unheard Whisper is simple. When invoked, it will cause all non-cultists within a radius of seven tiles to become \ completely deaf for a large amount of time.

" - text += "Rite of the Unseen Glance
Much like the Rite of the Unheard Whisper, the Rite of the Unseen Glance serves a single purpose. Any non-cultists who can see \ + text += "Blind
Much like the Rite of the Unheard Whisper, the Rite of the Unseen Glance serves a single purpose. Any non-cultists who can see \ the rune will instantly be blinded for a substantial amount of time.

" - text += "Rite of Disorientation
A somewhat empowered version of the Rite of the Unseen Glance, this rune will cause any non-cultists that can see the rune to become \ + text += "Stun
A somewhat empowered version of the Rite of the Unseen Glance, this rune will cause any non-cultists that can see the rune to become \ disoriented, disabling them for a short time.

" - text += "Rite of Joined Souls
The Rite of Joined Souls requires two acolytes to use. When invoked, it will allow the user to summon a single cultist to the rune from \ + text += "Summon Cultist
The Rite of Joined Souls requires two acolytes to use. When invoked, it will allow the user to summon a single cultist to the rune from \ any location. This will deal a moderate amount of damage to all invokers.

" - text += "Rite of Binding
The Rite of Binding is the only way to create talismans. A blank sheet of paper must be on top of the rune, with a valid rune nearby. After \ + text += "Imbue Talisman
The Rite of Binding is the only way to create talismans. A blank sheet of paper must be on top of the rune, with a valid rune nearby. After \ invoking it, the paper will be converted into a talisman, and the rune inlaid upon it.

" - text += "Rite of Fabrication
The Rite of Fabrication is the main way of creating construct shells. To use it, one must place five sheets of plasteel on top of the rune \ + text += "Fabricate Shell
The Rite of Fabrication is the main way of creating construct shells. To use it, one must place five sheets of plasteel on top of the rune \ and invoke it. The sheets will them be twisted into a construct shell, ready to recieve a soul to occupy it.

" - text += "Rite of Arming
The Rite of Arming will equip the user with invoker's robes, a backpack, a Nar-Sian longsword, and a pair of boots. Any items that cannot \ + text += "Summon Arnaments
The Rite of Arming will equip the user with invoker's robes, a backpack, a Nar-Sian longsword, and a pair of boots. Any items that cannot \ be equipped will instead not be summoned regardless.

" - text += "Rite of Leeching
The Rite of Leeching will drain the life of any non-cultist above the rune and heal the invoker for the same amount.

" + text += "Drain Life
The Rite of Leeching will drain the life of any non-cultist above the rune and heal the invoker for the same amount.

" - text += "Rite of Boiling Blood
The Rite of Boiling Blood may be considered one of the most dangerous rites composed by the Nar-Sian cult. When invoked, it will do a \ + text += "Boil Blood
The Rite of Boiling Blood may be considered one of the most dangerous rites composed by the Nar-Sian cult. When invoked, it will do a \ massive amount of damage to all non-cultist viewers, but it will also emit an explosion upon invocation. Use with caution

" - text += "Rite of Spectral Manifestation
If you wish to bring a spirit back from the dead with a wish for vengeance and desire to serve, the Rite of Spectral \ + text += "Manifest Spirit
If you wish to bring a spirit back from the dead with a wish for vengeance and desire to serve, the Rite of Spectral \ Manifestation can do just that. When invoked, any spirits above the rune will be brought to life as a human wearing nothing that seeks only to serve you and the Geometer. However, the spirit's link \ to reality is fragile - you must remain on top of the rune, and you will slowly take damage. Upon stepping off the rune, the spirits will dissipate, dropping their items to the ground. You may manifest \ multiple spirits with one rune, but you will rapidly take damage in doing so.

" - text += "Ritual of Dimensional Rending
There is only one way to summon the avatar of Nar-Sie, and that is the Ritual of Dimensional Rending. This ritual, in \ + text += "Call Forth The Geometer
There is only one way to summon the avatar of Nar-Sie, and that is the Ritual of Dimensional Rending. This ritual, in \ comparison to other runes, is very large, requiring a 3x3 space of empty tiles to create. To invoke the rune, nine cultists must stand on the rune, so that all of them are within its circle. Then, \ simply invoke it. A brief tearing will be heard as the barrier between dimensions is torn open, and the avatar will come forth.


" @@ -222,17 +221,17 @@ It also contains rune words, which are soon to be removed. rune inlaid within it. The words of the rune can be whispered in order to invoke its effects, although usually to a lesser extent. To create a talisman, simply use a Rite of Binding as described above. \ Unless stated otherwise, talismans are invoked by activating them in your hand. A list of valid rites, as well as the effects of their talisman form, can be found below.


" - text += "Talisman of Translocation
The talisman form of the Rite of Translocation will transport the invoker to a randomly chosen rune of the same keyword, then \ + text += "Talisman of Teleportation
The talisman form of the Rite of Translocation will transport the invoker to a randomly chosen rune of the same keyword, then \ disappear.

" - text += "Talisman of Knowledge
This talisman functions identically to the rune. It can be used once, then disappears.

" + text += "Talisman of Tome summoning
This talisman functions identically to the rune. It can be used once, then disappears.

" - text += "Talismans of Obscurity, True Sight, and False Truths
These talismans all function identically to their rune counterparts, but with less range. In addition, \ + text += "Talismans of Veiling, Revealing, and Disguising
These talismans all function identically to their rune counterparts, but with less range. In addition, \ the Talisman of True Sight will not reveal spirits. They will disappear after one use.

" - text += "Talisman of Disruption
This talisman functions like the Rite of Disruption, but with halved range. It disappears after one use.

" + text += "Talisman of Electromagnets
This talisman functions like the Rite of Disruption. It disappears after one use.

" - text += "Talisman of Disorientation
Without this talisman, the cult would have no way of easily acquiring targets to convert. Commonly called \"stunpapers\", this \ + text += "Talisman of Stunning
Without this talisman, the cult would have no way of easily acquiring targets to convert. Commonly called \"stunpapers\", this \ talisman functions differently from others. Rather than simply reading the words, the target must be attacked directly with the talisman. The talisman will then knock down the target for a long \ duration in addition to rendering them incapable of speech. Robotic lifeforms will suffer the effects of a heavy electromagnetic pulse instead." @@ -269,7 +268,7 @@ It also contains rune words, which are soon to be removed. "You slice open your arm and begin drawing a sigil of the Geometer.") if(iscarbon(user)) var/mob/living/carbon/C = user - C.apply_damage(1, BRUTE, pick("l_arm", "r_arm")) + C.apply_damage(0.1, BRUTE, pick("l_arm", "r_arm")) if(!do_after(user, 50, target = get_turf(user))) return user.visible_message("[user] creates a strange circle in their own blood.", \ diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 7ee742718c1..d9ce858c153 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -171,7 +171,7 @@ structure_check() searches for nearby cultist structures required for the invoca var/list/teleport_runes = list() //Rite of Translocation: Warps the user to a random teleport rune with the same keyword. /obj/effect/rune/teleport - cultist_name = "Rite of Translocation" + cultist_name = "Teleport" cultist_desc = "Warps the user to a random rune of the same keyword." invocation = "Sas'so c'arta forbici!" icon_state = "2" @@ -210,7 +210,7 @@ var/list/teleport_runes = list() var/list/teleport_other_runes = list() //Rite of Forced Translocation: Warps the target to a random teleport rune with the same keyword. /obj/effect/rune/teleport_other - cultist_name = "Rite of Forced Translocation" + cultist_name = "Teleport Other" cultist_desc = "Warps the target to a random rune of the same keyword." invocation = "Sas'so c'arta forbica!" icon_state = "1" @@ -266,8 +266,8 @@ var/list/teleport_other_runes = list() //Rite of Knowledge: Creates an arcane tome at the rune's location and destroys the rune. /obj/effect/rune/summon_tome - cultist_name = "Rite of Knowledge" - cultist_desc = "Pulls an unstranslated arcane tome from the archives of the Geometer." + cultist_name = "Summon Tome" + cultist_desc = "Pulls an arcane tome from the archives of the Geometer." invocation = "N'ath reth sh'yro eth d'raggathnor!" icon_state = "5" color = rgb(0, 0, 255) @@ -281,12 +281,13 @@ var/list/teleport_other_runes = list() //Rite of Enlightenment: Converts a normal crewmember to the cult. Faster for every cultist nearby. /obj/effect/rune/convert - cultist_name = "Rite of Enlightenment" + cultist_name = "Convert" cultist_desc = "Converts a normal crewmember on top of it to the cult. Does not work on loyalty-implanted crew." invocation = "Mah'weyh pleggh at e'ntrath!" icon_state = "3" color = rgb(255, 0, 0) grammar = "certum nahlizet ego" + req_cultists = 2 /obj/effect/rune/convert/invoke(mob/living/user) var/list/convertees = list() @@ -308,31 +309,6 @@ var/list/teleport_other_runes = list() if(iscultist(M)) M << "\"I desire this one for myself. SACRIFICE THEM!\"" return - var/time = 300 - for(var/mob/living/M in orange(1,src)) - if(iscultist(M)) - time -= 100 - time = Clamp(time, 0, 300) - if(time) - visible_message("[src] begins to glow with a sinister light...") - for(var/mob/living/M in orange(1,src)) - if(iscultist(M)) - if(M != user) - M << "You have aided [user] in invoking the [cultist_name]. You may now safely depart." - else - M << "You begin the enlightenment of [new_cultist]. This will take [time / 10] seconds and you must stand still." - new_cultist << "Your head begins to ache..." - if(!do_mob(user, new_cultist, time)) - visible_message("[src] reluctantly falls dark.") - new_cultist << "Your headache fades." - return - if(is_sacrifice_target(new_cultist.mind)) - for(var/mob/living/M in orange(1,src)) - if(iscultist(M)) - M << "\"I desire this one for myself. SACRIFICE THEM!\"" - fail_invoke() - log_game("Convert rune failed - convertee is sacrifice target") - return new_cultist.visible_message("[new_cultist] writhes in pain as the markings below them glow a bloody red!", \ "AAAAAAAAAAAAAA-") ticker.mode.add_cultist(new_cultist.mind) @@ -345,14 +321,18 @@ var/list/teleport_other_runes = list() //Rite of Tribute: Sacrifices a crew member to Nar-Sie. Places them into a soul shard if they're in their body. /obj/effect/rune/sacrifice - cultist_name = "Rite of Tribute" + cultist_name = "Sacrifice" cultist_desc = "Sacrifices a crew member to the Geometer. May place them into a soul shard if their spirit remains in their body." icon_state = "3" - invocation = "Barhah hra zar'garis!" + invocation = "Ih wah'kd in teh'tin!" color = rgb(255, 255, 255) grammar = "veri nahlizet certum" var/rune_in_use = 0 +/obj/effect/rune/sacrifice/New() + ..() + icon_state = "[rand(1,6)]" + /obj/effect/rune/sacrifice/invoke(mob/living/user) if(rune_in_use) return @@ -397,28 +377,16 @@ var/list/teleport_other_runes = list() /obj/effect/rune/sacrifice/proc/sac(mob/living/T) var/sacrifice_fulfilled if(T) - if(T.mind) - var/obj/item/device/soulstone/stone = new /obj/item/device/soulstone(get_turf(src)) - if(!stone.transfer_soul("FORCE", T, usr)) //If it cannot be added - qdel(stone) - if(!T) - rune_in_use = 0 - return if(istype(T, /mob/living/simple_animal/pet/dog/corgi)) for(var/mob/living/carbon/C in orange(1,src)) if(iscultist(C)) C << "Even dark gods from another plane have standards, sicko." if(C.reagents) C.reagents.add_reagent("hell_water", 2) - sacrificed.Add(T.mind) - if(is_sacrifice_target(T.mind)) - sacrifice_fulfilled = 1 - if(isrobot(T)) - playsound(T, 'sound/magic/Disable_Tech.ogg', 100, 1) - T.dust() //To prevent the MMI from remaining - else - playsound(T, 'sound/magic/Disintegrate.ogg', 100, 1) - T.gib() + if(T.mind) + sacrificed.Add(T.mind) + if(is_sacrifice_target(T.mind)) + sacrifice_fulfilled = 1 for(var/mob/living/M in orange(1,src)) if(iscultist(M)) if(sacrifice_fulfilled) @@ -428,12 +396,25 @@ var/list/teleport_other_runes = list() M << "\"I accept this sacrifice.\"" else M << "\"I accept this meager sacrifice.\"" + if(T.mind) + var/obj/item/device/soulstone/stone = new /obj/item/device/soulstone(get_turf(src)) + if(!stone.transfer_soul("FORCE", T, usr)) //If it cannot be added + qdel(stone) + if(!T) + rune_in_use = 0 + return + if(isrobot(T)) + playsound(T, 'sound/magic/Disable_Tech.ogg', 100, 1) + T.dust() //To prevent the MMI from remaining + else + playsound(T, 'sound/magic/Disintegrate.ogg', 100, 1) + T.gib() rune_in_use = 0 //Ritual of Dimensional Rending: Calls forth the avatar of Nar-Sie upon the station. /obj/effect/rune/narsie - cultist_name = "Ritual of Dimensional Rending" + cultist_name = "Call Forth The Geometer" cultist_desc = "Tears apart dimensional barriers, calling forth the avatar of the Geometer." invocation = "Tok-lyr rqa'nap g'olt-ulotf!" req_cultists = 9 @@ -489,10 +470,11 @@ var/list/teleport_other_runes = list() //Rite of Resurrection: Requires two corpses. Revives one and gibs the other. /obj/effect/rune/raise_dead - cultist_name = "Rite of Resurrection" + cultist_name = "Raise Dead" cultist_desc = "Requires two corpses. The one placed upon the rune is brought to life, the other is turned to ash." invocation = null //Depends on the name of the user - see below - color = rgb(150, 0, 0) + icon_state = "1" + color = rgb(255, 0, 0) grammar = "nahlizet certum veri" /obj/effect/rune/raise_dead/invoke(mob/living/user) @@ -557,11 +539,11 @@ var/list/teleport_other_runes = list() //Rite of Obscurity: Turns all runes within a 3-tile radius invisible. /obj/effect/rune/hide_runes - cultist_name = "Rite of Obscurity" - cultist_desc = "Turns nearby runes invisible. They can be revealed by using the Rite of True Sight." + cultist_name = "Veil Runes" + cultist_desc = "Turns nearby runes invisible. They can be revealed by using the Reveal Runes rune." invocation = "Kla'atu barada nikt'o!" - icon_state = "3" - color = rgb(255,255,255) + icon_state = "1" + color = rgb(0,0,255) grammar = "geeri karazet nahlizet" /obj/effect/rune/hide_runes/invoke(mob/living/user) @@ -579,11 +561,11 @@ var/list/teleport_other_runes = list() //Rite of True Sight: Turns ghosts and obscured runes visible /obj/effect/rune/true_sight - cultist_name = "Rite of True Sight" + cultist_name = "Reveal Runes" cultist_desc = "Reveals all invisible objects nearby, from spirits to runes." invocation = "Nikt'o barada kla'atu!" - icon_state = "6" - color = rgb(255, 162, 33) + icon_state = "4" + color = rgb(255, 255, 255) grammar = "karazet geeri nahlizet" /obj/effect/rune/true_sight/invoke() @@ -599,7 +581,7 @@ var/list/teleport_other_runes = list() //Rite of False Truths: Makes runes appear like crayon ones /obj/effect/rune/make_runes_fake - cultist_name = "Rite of False Truths" + cultist_name = "Disguise Runes" cultist_desc = "Causes all nearby runes (including itself) to resemble those drawn in crayon." invocation = "By'o isit!" icon_state = "4" @@ -614,11 +596,11 @@ var/list/teleport_other_runes = list() //Rite of Disruption: Emits an EMP blast. /obj/effect/rune/emp - cultist_name = "Rite of Disruption" + cultist_name = "Electromagnetic Disruption" cultist_desc = "Emits a large electromagnetic pulse, hindering electronics and disabling silicons." invocation = "Ta'gh fara'qha fel d'amar det!" - icon_state = "1" - color = rgb(0, 0, 255) + icon_state = "5" + color = rgb(255, 0, 0) grammar = "mgar karazet balaq" /obj/effect/rune/emp/invoke(mob/living/user) @@ -632,11 +614,11 @@ var/list/teleport_other_runes = list() //Rite of Astral Communion: Separates one's spirit from their body. They will take damage while it is active. /obj/effect/rune/astral - cultist_name = "Rite of Astral Communion" + cultist_name = "Astral Communion" cultist_desc = "Severs the link between one's spirit and body. This effect is taxing and one's physical body will take damage while this is active." invocation = "Fwe'sh mah erl nyag r'ya!" - icon_state = "1" - color = rgb(68, 47, 255) + icon_state = "6" + color = rgb(0, 0, 255) var/rune_in_use = 0 //One at a time, please! var/mob/living/affecting = null grammar = "veri ire ego" @@ -702,10 +684,11 @@ var/list/teleport_other_runes = list() //Rite of the Corporeal Shield: When invoked, becomes solid and cannot be passed. Invoke again to undo. /obj/effect/rune/wall - cultist_name = "Rite of the Corporeal Shield" + cultist_name = "Form Shield" cultist_desc = "When invoked, makes the rune block passage. Can be invoked again to reverse this." invocation = "Khari'd! Eske'te tannin!" icon_state = "1" + color = rgb(255, 0, 0) grammar = "mgar ire ego" /obj/effect/rune/wall/examine(mob/user) @@ -724,10 +707,12 @@ var/list/teleport_other_runes = list() //Rite of the Unheard Whisper: Deafens all non-cultists nearby. /obj/effect/rune/deafen - cultist_name = "Rite of the Unheard Whisper" + cultist_name = "Deafen" cultist_desc = "Causes all non-followers nearby to lose their hearing." invocation = "Sti kaliedir!" grammar = "geeri jatkaa karazet" + color = rgb(0, 255, 0) + icon_state = "4" /obj/effect/rune/deafen/invoke(mob/living/user) visible_message("[src] blurs for a moment before fading away.") @@ -740,11 +725,11 @@ var/list/teleport_other_runes = list() //Rite of the Unseen Glance: Blinds all non-cultists nearby. /obj/effect/rune/blind - cultist_name = "Rite of the Unseen Glance" + cultist_name = "Blind" cultist_desc = "Causes all non-followers nearby to lose their sight." invocation = "Sti kaliesin!" - icon_state = "1" - color = rgb(0, 255, 0) + icon_state = "4" + color = rgb(0, 0, 255) grammar = "mgar jatkaa karazet" /obj/effect/rune/blind/invoke(mob/living/user) @@ -760,11 +745,11 @@ var/list/teleport_other_runes = list() //Rite of Disorientation: Stuns all non-cultists nearby for a brief time /obj/effect/rune/stun - cultist_name = "Rite of Disorientation" + cultist_name = "Stun" cultist_desc = "Stuns all nearby non-followers for a brief time." invocation = "Fuu ma'jin!" icon_state = "2" - color = rgb(150, 0, 255) + color = rgb(100, 0, 100) grammar = "certum geeri balaq" /obj/effect/rune/stun/invoke(mob/living/user) @@ -780,7 +765,7 @@ var/list/teleport_other_runes = list() //Rite of Joined Souls: Summons a single cultist. Requires 2 cultists. /obj/effect/rune/summon - cultist_name = "Rite of Joined Souls" + cultist_name = "Summon Cultist" cultist_desc = "Summons a single cultist to the rune." invocation = "N'ath reth sh'yro eth d'rekkathnor!" req_cultists = 2 @@ -817,11 +802,11 @@ var/list/teleport_other_runes = list() //Rite of Binding: Turns a nearby rune and a paper on top of the rune to a talisman, if both are valid. /obj/effect/rune/imbue - cultist_name = "Rite of Binding" + cultist_name = "Bind Talisman" cultist_desc = "Transforms papers and valid runes into talismans." invocation = "H'drak v'loso, mir'kanas verbot!" icon_state = "3" - color = rgb(150, 0, 255) + color = rgb(0, 0, 255) grammar = "veri balaq certum" /obj/effect/rune/imbue/invoke(mob/living/user) @@ -860,18 +845,13 @@ var/list/teleport_other_runes = list() log_game("Talisman Imbue rune failed - chosen rune invalid") return visible_message("[picked_rune] crumbles to dust, and bloody images form themselves on [paper_to_imbue].") - if(iscarbon(user)) - var/mob/living/carbon/C = user - C.apply_damage(5, BRUTE, pick("l_arm", "r_arm")) - else - user.adjustBruteLoss(5) qdel(paper_to_imbue) qdel(picked_rune) //Rite of Fabrication: Creates a construct shell out of 5 metal sheets. /obj/effect/rune/construct_shell - cultist_name = "Rite of Fabrication" + cultist_name = "Fabricate Shell" cultist_desc = "Turns five plasteel sheets into an empty construct shell, suitable for containing a soul shard." invocation = "Ethra p'ni dedol!" icon_state = "5" @@ -900,7 +880,7 @@ var/list/teleport_other_runes = list() //Rite of Arming: Creates cult robes, a trophy rack, and a cult sword on the rune. /obj/effect/rune/armor - cultist_name = "Rite of Arming" + cultist_name = "Summon Arnaments" cultist_desc = "Equips the user with robes, shoes, a backpack, and a longsword. Items that cannot be equipped will not be summoned." invocation = "N'ath reth sh'yro eth draggathnor!" icon_state = "4" @@ -919,7 +899,7 @@ var/list/teleport_other_runes = list() //Rite of Leeching: Deals brute damage to the target and heals the same amount to the invoker. /obj/effect/rune/leeching - cultist_name = "Rite of Leeching" + cultist_name = "Drain Life" cultist_desc = "Drains the life of the target on the rune, restoring it to the user." invocation = "Yu'gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!" //that's a mouthful icon_state = "2" @@ -948,7 +928,7 @@ var/list/teleport_other_runes = list() //Rite of Boiling Blood: Deals extremely high amounts of damage to non-cultists nearby /obj/effect/rune/blood_boil - cultist_name = "Rite of Boiling Blood" + cultist_name = "Boil Blood" cultist_desc = "Boils the blood of non-believers who can see the rune, dealing extreme amounts of damage." invocation = "Dedo ol'btoh!" icon_state = "4" @@ -975,7 +955,7 @@ var/list/teleport_other_runes = list() //Rite of Spectral Manifestation: Summons a ghost on top of the rune as a cultist human with no items. User must stand on the rune at all times, and takes damage for each summoned ghost. /obj/effect/rune/manifest - cultist_name = "Rite of Spectral Manifestation" + cultist_name = "Manifest Spirit" cultist_desc = "Manifests a spirit as a servant of the Geometer. The invoker must not move from atop the rune, and will take damage for each summoned spirit." invocation = "Gal'h'rfikk harfrandid mud'gib!" //how the fuck do you pronounce this icon_state = "6" diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 2a63281e1fb..bebcf0f2bdc 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -19,6 +19,7 @@ Rite of Disorientation var/cultist_desc = "A basic talisman. It serves no purpose." var/invocation = "Naise meam!" var/uses = 1 + var/health_cost = 0 //The amount of health taken from the user when invoking the talisman /obj/item/weapon/paper/talisman/examine(mob/user) ..() @@ -40,7 +41,9 @@ Rite of Disorientation qdel(src) /obj/item/weapon/paper/talisman/proc/invoke(mob/living/user) - + if(health_cost && iscarbon(user)) + var/mob/living/carbon/C = user + C.apply_damage(health_cost, BRUTE, pick("l_arm", "r_arm")) //Malformed Talisman: If something goes wrong. /obj/item/weapon/paper/talisman/malformed @@ -124,9 +127,10 @@ Rite of Disorientation //Rite of Translocation: Same as rune /obj/item/weapon/paper/talisman/teleport - cultist_name = "Rite of Translocation" + cultist_name = "Talisman of Teleportation" cultist_desc = "A single-use talisman that will teleport a user to a random rune of the same keyword." invocation = "Sas'so c'arta forbici!" + health_cost = 5 var/keyword = "ire" /obj/item/weapon/paper/talisman/teleport/invoke(mob/living/user) @@ -135,7 +139,7 @@ Rite of Disorientation if(R.keyword == src.keyword) possible_runes.Add(R) if(!possible_runes.len) - user << "There are no Rites of Translocation with the same keyword!" + user << "There are no Teleport runes with the same keyword!" log_game("Teleportation talisman failed - no teleport runes of the same keyword") uses++ //To prevent deletion return @@ -151,12 +155,18 @@ Rite of Disorientation spawn(1) //To give the keyword time to change from the imbue rune info += keyword +/obj/item/weapon/paper/talisman/teleport/examine(mob/user) + ..() + if(iscultist(user) && keyword) + user << "Keyword: [keyword]" + //Rite of Knowledge: Same as rune, but has two uses /obj/item/weapon/paper/talisman/summon_tome - cultist_name = "Rite of Knowledge" + cultist_name = "Talisman of Tome Summoning" cultist_desc = "A two-use talisman that will call untranslated tomes from the archives of the Geometer." invocation = "N'ath reth sh'yro eth d'raggathnor!" + health_cost = 1 /obj/item/weapon/paper/talisman/summon_tome/invoke(mob/living/user) user.visible_message("Dust flows from [user]'s hand for a moment.", \ @@ -171,9 +181,10 @@ Rite of Disorientation //Rite of Obscurity: Same as rune, but less range /obj/item/weapon/paper/talisman/hide_runes - cultist_name = "Rite of Obscurity" + cultist_name = "Talisman of Veiling" cultist_desc = "A talisman that will make all runes within a small radius invisible." invocation = "Kla'atu barada nikt'o!" + health_cost = 1 /obj/item/weapon/paper/talisman/hide_runes/invoke(mob/living/user) user.visible_message("Dust flows from [user]'s hand.", \ @@ -185,9 +196,10 @@ Rite of Disorientation //Rite of True Sight: Same as rune, but doesn't work on ghosts /obj/item/weapon/paper/talisman/true_sight - cultist_name = "Rite of True Sight" + cultist_name = "Talisman of Revealing" cultist_desc = "A talisman that reveals nearby invisible runes." invocation = "Nikt'o barada kla'atu!" + health_cost = 1 /obj/item/weapon/paper/talisman/true_sight/invoke(mob/living/user) user.visible_message("A flash of light shines from [user]'s hand!", \ @@ -198,9 +210,10 @@ Rite of Disorientation //Rite of False Truths: Same as rune /obj/item/weapon/paper/talisman/make_runes_fake - cultist_name = "Rite of False Truths" + cultist_name = "Talisman of Disguising" cultist_desc = "A talisman that will make nearby runes appear fake." invocation = "By'o isit!" + health_cost = 3 /obj/item/weapon/paper/talisman/make_runes_fake/invoke(mob/living/user) user.visible_message("Dust flows from [user]s hand.", \ @@ -211,21 +224,23 @@ Rite of Disorientation //Rite of Disruption: Same as rune, halved radius /obj/item/weapon/paper/talisman/emp - cultist_name = "Rite of Disruption" + cultist_name = "Talisman of Electromagnets" cultist_desc = "A talisman that will cause a moderately-sized electromagnetic pulse." invocation = "Ta'gh fara'qha fel d'amar det!" + health_cost = 5 /obj/item/weapon/paper/talisman/emp/invoke(mob/living/user) - user.visible_message("[user]'s hand glows a bright blue!", \ + user.visible_message("[user]'s hand flashes a bright blue!", \ "You speak the words of the talisman, emitting an EMP blast.") - empulse(src, 2, 4) + empulse(src, 4, 8) //Rite of Disorientation: Stuns and mutes a single target for quite some time /obj/item/weapon/paper/talisman/stun - cultist_name = "Rite of Disorientation" + cultist_name = "Talisman of Stunning" cultist_desc = "A talisman that will stun and mute a single target. To use, attack target directly." invocation = "Fuu ma'jin!" + health_cost = 10 //A lot of health because of how powerful this is /obj/item/weapon/paper/talisman/stun/attack_self(mob/living/user) user << "To use this talisman, attack the target directly." @@ -254,3 +269,20 @@ Rite of Disorientation qdel(src) return ..() + + +//Rite of Arming: Equips cultist armor on the user, where available +/obj/item/weapon/paper/talisman/armor + cultist_name = "Talisman of Arming" + cultist_desc = "A talisman that will equip the invoker with cultist equipment where available." + invocation = "N'ath reth sh'yro eth draggathnor!" + health_cost = 3 + +/obj/item/weapon/paper/talisman/armor/invoke(mob/living/user) + user.visible_message("Otherworldy objects suddenly appear on [user]!", \ + "You speak the words of the talisman, arming yourself!") + user.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head) + user.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit) + user.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), slot_shoes) + user.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back) + user.put_in_hands(new /obj/item/weapon/melee/cultblade(user)) diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index a16b2946415..e3ce3bf5ea1 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -147,11 +147,11 @@ var/DNAstring = input("Input DNA string to search for." , "Please Enter String." , "") if(!DNAstring) return - for(var/mob/living/carbon/M in mob_list) - if(!M.dna) + for(var/mob/living/carbon/C in mob_list) + if(!C.dna) continue - if(M.dna.unique_enzymes == DNAstring) - target = M + if(C.dna.unique_enzymes == DNAstring) + target = C break return attack_self() diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index e485a62657d..cb4d5ace22f 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -807,7 +807,7 @@ var/global/list/possible_items_special = list() var/turf/cloc = get_turf(changeling.current) if(cloc && cloc.onCentcom() && (changeling.current.stat != DEAD)) //Living changeling on centcomm.... for(var/name in check_names) //Is he (disguised as) one of the staff? - if(H.dna && H.dna.real_name == name) + if(H.dna.real_name == name) check_names -= name //This staff member is accounted for, remove them, so the team don't succeed by escape as 7 of the same engineer success++ //A living changeling staff member made it to centcomm continue changelings diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index 2e5721b5fe7..e2a6af4e114 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -1,4 +1,4 @@ -/datum/subsystem/ticker/proc/setupGenetics() +/datum/subsystem/objects/proc/setupGenetics() var/list/avnums = new /list(DNA_STRUC_ENZYMES_BLOCKS) for(var/i=1, i<=DNA_STRUC_ENZYMES_BLOCKS, i++) avnums[i] = i diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 88da9c66937..39b72b87b2c 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -166,10 +166,8 @@ Made by Xhuis thralls.Remove(thrall_mind) thrall_mind.current.attack_log += "\[[time_stamp()]\] Dethralled" thrall_mind.special_role = null - thrall_mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_shadowling_hivemind) - thrall_mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_glare) - thrall_mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk) - thrall_mind.remove_spell(/obj/effect/proc_holder/spell/targeted/thrall_vision) + for(var/obj/effect/proc_holder/spell/S in thrall_mind.spell_list) + thrall_mind.remove_spell(S) if(kill && ishuman(thrall_mind.current)) //If dethrallization surgery fails, kill the mob as well as dethralling them var/mob/living/carbon/human/H = thrall_mind.current H.visible_message("[H] jerks violently and falls still.", \ @@ -186,6 +184,30 @@ Made by Xhuis under their command...") return 1 +/datum/game_mode/proc/remove_shadowling(datum/mind/ling_mind) + if(!istype(ling_mind) || !(ling_mind in shadows)) return 0 + update_shadow_icons_removed(ling_mind) + shadows.Remove(ling_mind) + ling_mind.current.attack_log += "\[[time_stamp()]\] Deshadowlinged" + ling_mind.special_role = null + for(var/obj/effect/proc_holder/spell/S in ling_mind.spell_list) + ling_mind.remove_spell(S) + var/mob/living/M = ling_mind.current + if(issilicon(M)) + M.audible_message("[M] lets out a short blip.", \ + "You have been turned into a robot! You are no longer a shadowling! Though you try, you cannot remember anything about your time as one...") + else + M.visible_message("[M] screams and contorts!", \ + "THE LIGHT-- YOUR MIND-- BURNS--") + spawn(30) + if(!M || qdeleted(M)) + return + M.visible_message("[M] suddenly bloats and explodes!", \ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA----") + playsound(M, 'sound/magic/Disintegrate.ogg', 100, 1) + M.gib() + + /datum/game_mode/shadowling/proc/check_shadow_victory() var/success = 0 //Did they win? if(shadow_objectives.Find("enthrall")) @@ -244,7 +266,7 @@ Made by Xhuis light_amount = T.get_lumcount() if(light_amount > LIGHT_DAM_THRESHOLD && !H.incorporeal_move) //Can survive in very small light levels. Also doesn't take damage while incorporeal, for shadow walk purposes H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN) - H << "The light burns you!" + H << "The light burns you!" //Message spam to say "GET THE FUCK OUT" H << 'sound/weapons/sear.ogg' else if (light_amount < LIGHT_HEAL_THRESHOLD) H.heal_overall_damage(5,5) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index eb0a55a9ee9..fbcc07e8296 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -90,7 +90,7 @@ for(var/obj/machinery/computer/C in T.contents) C.SetLuminosity(0) C.visible_message("[C] grows dim, its screen barely readable.") - for(var/obj/effect/glowshroom/G in orange(2, usr)) //Very small radius + for(var/obj/effect/glowshroom/G in orange(7, usr)) //High radius because glowshroom spam wrecks shadowlings G.visible_message("[G] withers away!") qdel(G) for(var/mob/living/H in T.contents) @@ -297,7 +297,7 @@ user.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(usr), slot_gloves) user.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(usr), slot_wear_mask) user.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/shadowling(usr), slot_glasses) - hardset_dna(user, null, null, null, null, /datum/species/shadow/ling) + user.set_species(/datum/species/shadow/ling) /obj/effect/proc_holder/spell/targeted/collective_mind //Lets a shadowling bring together their thralls' strength, granting new abilities and a headcount @@ -334,27 +334,28 @@ user << "Your concentration has been broken. The mental hooks you have sent out now retract into your mind." return - if(thralls >= 3 && !blind_smoke_acquired) + if(thralls >= 3 && !screech_acquired) + screech_acquired = 1 + user << "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms." + user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech(null)) + + if(thralls >= 5 && !blind_smoke_acquired) blind_smoke_acquired = 1 user << "The power of your thralls has granted you the Blinding Smoke ability. It will create a choking cloud that will blind any non-thralls who enter. \ " - user.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/blindness_smoke + user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/blindness_smoke(null)) - if(thralls >= 5 && !drainLifeAcquired) + if(thralls >= 7 && !drainLifeAcquired) drainLifeAcquired = 1 user << "The power of your thralls has granted you the Drain Life ability. You can now drain the health of nearby humans to heal yourself." - user.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/drain_life + user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/drain_life(null)) - if(thralls >= 7 && !screech_acquired) - screech_acquired = 1 - user << "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms." - user.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech if(thralls >= 9 && !reviveThrallAcquired) reviveThrallAcquired = 1 user << "The power of your thralls has granted you the Black Recuperation ability. This will, after a short time, bring a dead thrall completely back to life \ with no bodily defects." - user.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revive_thrall + user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/revive_thrall(null)) if(thralls < victory_threshold) user << "You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present." @@ -492,7 +493,7 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell nearbyTargets = list() for(var/turf/T in targets) for(var/mob/living/carbon/M in T.contents) - if(M == src) continue + if(M == usr) continue targetsDrained++ nearbyTargets.Add(M) if(!targetsDrained) @@ -568,7 +569,7 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell thrallToRevive.visible_message("[thrallToRevive] slowly rises, no longer recognizable as human.", \ "You feel new power flow into you. You have been gifted by your masters. You now closely resemble them. You are empowered in \ darkness but wither slowly in light. In addition, Lesser Glare and Guise have been upgraded into their true forms.") - hardset_dna(thrallToRevive, null, null, null, null, /datum/species/shadow/ling/lesser) + thrallToRevive.set_species(/datum/species/shadow/ling/lesser) thrallToRevive.mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_glare) thrallToRevive.mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk) thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/glare(null)) @@ -606,10 +607,56 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell return +/obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle + name = "Destroy Engines" + desc = "Extends the time of the emergency shuttle's arrival by ten to fifteen minutes." + panel = "Shadowling Abilities" + range = 1 + clothes_req = 0 + charge_max = 600 + action_icon_state = "extend_shuttle" + +/obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle/cast(list/targets, mob/living/carbon/human/U = usr) + if(!shadowling_check(usr)) + charge_counter = charge_max + return + for(var/mob/living/carbon/human/target in targets) + if(target.stat) + charge_counter = charge_max + return + if(!is_thrall(target)) + usr << "[target] must be a thrall." + charge_counter = charge_max + return + if(SSshuttle.emergency.mode != SHUTTLE_CALL) + usr << "The shuttle must be inbound only to the station." + charge_counter = charge_max + return + var/mob/living/carbon/human/M = target + U.visible_message("[U]'s eyes flash a bright red!", \ + "You begin to draw [M]'s life force.") + M.visible_message("[M]'s face falls slack, their jaw slightly distending.", \ + "You are suddenly transported... far, far away...") + if(!do_after(U, 50, target = M)) + M << "You are snapped back to reality, your haze dissipating!" + U << "You have been interrupted. The draw has failed." + return + U << "You project [M]'s life force toward the approaching shuttle, extending its arrival duration!" + M.visible_message("[M]'s eyes suddenly flare red. They proceed to collapse on the floor, not breathing.", \ + "...speeding by... ...pretty blue glow... ...touch it... ...no glow now... ...no light... ...nothing at all...") + M.death() + if(SSshuttle.emergency.mode == SHUTTLE_CALL) + var/more_minutes = 9000 + var/timer = SSshuttle.emergency.timeLeft() + timer += more_minutes + priority_announce("Major system failure aboard the emergency shuttle. This will extend its arrival time by approximately 15 minutes..", "System Failure", 'sound/misc/notice1.ogg') + SSshuttle.emergency.setTimer(timer) + + // THRALL ABILITIES BEYOND THIS POINT // -/obj/effect/proc_holder/spell/targeted/lesser_glare //Thrall version of Glare - same effects but for 3 seconds +/obj/effect/proc_holder/spell/targeted/lesser_glare //Thrall version of Glare - same effects but for 5 seconds name = "Lesser Glare" desc = "Stuns and mutes a target for a short duration." panel = "Thrall Abilities" @@ -636,8 +683,8 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell target << "Your gaze is forcibly drawn into [usr]'s eyes, and you are starstruck by the heavenly lights..." else //Only alludes to the shadowling if the target is close by target << "Red lights suddenly dance in your vision, and you are starstruck by their heavenly beauty..." - target.Stun(3) //Roughly 30% as long as the normal one - M.silent += 3 + target.Stun(5) //Roughly 50% as long as the normal one + M.silent += 5 /obj/effect/proc_holder/spell/targeted/lesser_shadow_walk //Thrall version of Shadow Walk, only works in darkness, doesn't grant phasing, but gives near-invisibility @@ -730,11 +777,11 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell return for(var/mob/living/boom in targets) - if(is_shadow_or_thrall(boom)) + if(is_shadow(boom)) //Used to not work on thralls. Now it does so you can PUNISH THEM LIKE THE WRATHFUL GOD YOU ARE. usr << "Making an ally explode seems unwise." charge_counter = charge_max return - usr.visible_message("[usr]'s markings flare as they gesture at [boom]!", \ + usr.visible_message("[usr]'s markings flare as they gesture at [boom]!", \ "You direct a lance of telekinetic energy into [boom].") playMagSound() sleep(4) @@ -835,8 +882,7 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell for(var/turf/T in targets) for(var/mob/living/carbon/human/target in T.contents) if(is_shadow_or_thrall(target)) - if(target == usr) //No message for the user, of course - continue + continue target << "You are struck by a bolt of lightning!" playsound(target, 'sound/magic/LightningShock.ogg', 50, 1) target.Weaken(8) diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 97a36b06255..3ab3d435b03 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -84,7 +84,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(H), slot_gloves) H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(H), slot_wear_mask) H.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/shadowling(H), slot_glasses) - hardset_dna(H, null, null, null, null, /datum/species/shadow/ling) //can't be a shadowling without being a shadowling + H.set_species(/datum/species/shadow/ling) //can't be a shadowling without being a shadowling sleep(10) H << "Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies." @@ -95,6 +95,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/flashfreeze(null)) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/collective_mind(null)) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_regenarmor(null)) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle(null)) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 06a94232ece..582eb0ebceb 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -22,9 +22,9 @@ /obj/item/weapon/veilrender/attack_self(mob/user) if(charges > 0) - new /obj/effect/rend(get_turf(usr), spawn_type, spawn_amt, rend_desc, spawn_fast) + new /obj/effect/rend(get_turf(user), spawn_type, spawn_amt, rend_desc, spawn_fast) charges-- - user.visible_message("[src] hums with power as [usr] deals a blow to [activate_descriptor] itself!") + user.visible_message("[src] hums with power as [user] deals a blow to [activate_descriptor] itself!") else user << "The unearthly energies that powered the blade are now dormant." @@ -59,7 +59,7 @@ /obj/effect/rend/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/nullrod)) - user.visible_message("[usr] seals \the [src] with \the [I].") + user.visible_message("[user] seals \the [src] with \the [I].") qdel(src) return ..() @@ -97,7 +97,7 @@ /obj/item/weapon/scrying/attack_self(mob/user) user << "You can see...everything!" - visible_message("[usr] stares into [src], their eyes glazing over.") + visible_message("[user] stares into [src], their eyes glazing over.") user.ghostize(1) return @@ -118,7 +118,7 @@ unlimited = 1 /obj/item/device/necromantic_stone/attack(mob/living/carbon/human/M, mob/living/carbon/human/user) - if(!istype(M, /mob/living/carbon/human)) + if(!istype(M)) return ..() if(!istype(user) || !user.canUseTopic(M,1)) @@ -137,7 +137,7 @@ user << "This artifact can only affect three undead at a time!" return - hardset_dna(M, null, null, null, null, /datum/species/skeleton) + M.set_species(/datum/species/skeleton, icon_update=0) M.revive() spooky_scaries |= M M << "You have been revived by [user.real_name]!" @@ -261,13 +261,24 @@ var/global/list/multiverse = list() /obj/item/weapon/multisword/proc/spawn_copy(var/client/C, var/turf/T) var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) - C.prefs.copy_to(M) + C.prefs.copy_to(M, icon_updates=0) M.key = C.key M.mind.name = usr.real_name M << "You are an alternate version of [usr.real_name] from another universe! Help them accomplish their goals at all costs." M.real_name = usr.real_name M.name = usr.real_name M.faction = list("[usr.real_name]") + if(prob(50)) + var/list/all_species = list() + for(var/speciestype in typesof(/datum/species) - /datum/species) + var/datum/species/S = new speciestype() + if(!S.dangerous_existence) + all_species += speciestype + M.set_species(pick(all_species), icon_update=0) + M.update_body() + M.update_hair() + M.update_mutcolor() + M.dna.update_dna_identity() equip_copy(M) if(evil) @@ -440,14 +451,6 @@ var/global/list/multiverse = list() else return - ready_dna(M) - if(M.dna && prob(50)) - var/list/all_species = list() - for(var/speciestype in typesof(/datum/species) - /datum/species) - var/datum/species/S = new speciestype() - if(!S.dangerous_existence) - all_species += speciestype - hardset_dna(M, null, null, null, null, pick(all_species)) M.update_icons() M.update_augments() diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index d59f47796b5..d53f5fa2dba 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -130,7 +130,7 @@ var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned. G_found.client.prefs.copy_to(new_character) - ready_dna(new_character) + new_character.dna.update_dna_identity() new_character.key = G_found.key return new_character diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 0af6de2a817..3e5c1c56c12 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -19,7 +19,7 @@ return 0 return 1 /datum/spellbook_entry/proc/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) //return 1 on success - if(!S) + if(!S || qdeleted(S)) S = new spell_type() //Check if we got the spell already diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index a7b0ab3ca3b..ca5fb09823c 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -50,14 +50,12 @@ return 0 //Equip the rest of the gear - if(H.dna) - H.dna.species.before_equip_job(src, H) + H.dna.species.before_equip_job(src, H) if(outfit) H.equipOutfit(outfit) - if(H.dna) - H.dna.species.after_equip_job(src, H) + H.dna.species.after_equip_job(src, H) /datum/job/proc/apply_fingerprints(mob/living/carbon/human/H) if(!istype(H)) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 4eb6a9df0fa..44170c8a8a2 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -30,16 +30,17 @@ var/emped = 0 //Number of consecutive EMP's on this camera /obj/machinery/camera/New() + ..() assembly = new(src) assembly.state = 4 - + cameranet.cameras += src + cameranet.addCamera(src) /* // Use this to look for cameras that have the same c_tag. for(var/obj/machinery/camera/C in cameranet.cameras) var/list/tempnetwork = C.network&src.network if(C != src && C.c_tag == src.c_tag && tempnetwork.len) world.log << "[src.c_tag] [src.x] [src.y] [src.z] conflicts with [C.c_tag] [C.x] [C.y] [C.z]" */ - ..() /obj/machinery/camera/initialize() if(z == 1 && prob(3) && !start_active) @@ -56,6 +57,8 @@ bug.current = null bug = null cameranet.removeCamera(src) //Will handle removal from the camera network and the chunks, so we don't need to worry about that + cameranet.cameras -= src + cameranet.removeCamera(src) return ..() /obj/machinery/camera/emp_act(severity) @@ -235,6 +238,11 @@ return /obj/machinery/camera/proc/deactivate(mob/user, displaymessage = 1) //this should be called toggle() but doing a find and replace for this would be ass + if(can_use()) + cameranet.addCamera(src) + else + SetLuminosity(0) + cameranet.removeCamera(src) status = !status cameranet.updateChunk(x, y, z) var/change_msg = "deactivates" diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index e11ebd25a9e..221d898227c 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -185,7 +185,7 @@ H.ckey = ckey H << "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?
" - hardset_dna(H, ui, se, null, null, mrace, features) + H.hardset_dna(ui, se, H.real_name, null, mrace, features) H.faction |= factions H.set_cloned_appearance() @@ -301,13 +301,13 @@ return /obj/machinery/clonepod/proc/go_out() - if (src.locked) + if (locked) return - if (src.mess) //Clean that mess and dump those gibs! - src.mess = 0 - gibs(src.loc) - src.icon_state = "pod_0" + if (mess) //Clean that mess and dump those gibs! + mess = 0 + gibs(loc) + icon_state = "pod_0" /* for(var/obj/O in src) @@ -315,22 +315,22 @@ */ return - if (!(src.occupant)) + if (!occupant) return /* for(var/obj/O in src) O.loc = src.loc */ - if (src.occupant.client) - src.occupant.client.eye = src.occupant.client.mob - src.occupant.client.perspective = MOB_PERSPECTIVE + if (occupant.client) + occupant.client.eye = occupant.client.mob + occupant.client.perspective = MOB_PERSPECTIVE if(occupant.loc == src) - src.occupant.loc = src.loc - src.icon_state = "pod_0" - src.eject_wait = 0 //If it's still set somehow. - domutcheck(src.occupant) //Waiting until they're out before possible monkeyizing. - src.occupant = null + occupant.loc = loc + icon_state = "pod_0" + eject_wait = 0 //If it's still set somehow. + occupant.domutcheck() //Waiting until they're out before possible monkeyizing. + occupant = null return /obj/machinery/clonepod/proc/malfunction() diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index cf031380142..4003f4bd5f2 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -297,6 +297,7 @@ src.updateUsrDialog() + // *** THE ORION TRAIL ** // #define ORION_TRAIL_WINTURN 9 @@ -313,6 +314,10 @@ #define ORION_TRAIL_SPACEPORT "Spaceport" #define ORION_TRAIL_BLACKHOLE "BlackHole" +#define ORION_STATUS_START 1 +#define ORION_STATUS_NORMAL 2 +#define ORION_STATUS_GAMEOVER 3 +#define ORION_STATUS_MARKET 4 /obj/machinery/computer/arcade/orion_trail name = "The Orion Trail" @@ -326,8 +331,6 @@ var/food = 80 var/fuel = 60 var/turns = 4 - var/playing = 0 - var/gameover = 0 var/alive = 4 var/eventdat = null var/event = null @@ -347,6 +350,8 @@ var/spaceport_raided = 0 var/spaceport_freebie = 0 var/last_spaceport_action = "" + var/gameStatus = ORION_STATUS_START + var/canContinueEvent = 0 /obj/machinery/computer/arcade/orion_trail/New() ..() @@ -379,8 +384,7 @@ alive = 4 turns = 1 event = null - playing = 1 - gameover = 0 + gameStatus = ORION_STATUS_NORMAL lings_aboard = 0 //spaceport junk @@ -392,11 +396,11 @@ if(..()) return if(fuel <= 0 || food <=0 || settlers.len == 0) - gameover = 1 + gameStatus = ORION_STATUS_GAMEOVER event = null user.set_machine(src) var/dat = "" - if(gameover) + if(gameStatus == ORION_STATUS_GAMEOVER) dat = "

Game Over

" dat += "Like many before you, your crew never made it to Orion, lost to space...
Forever." if(settlers.len == 0) @@ -420,13 +424,13 @@ user << "You're never going to make it to Orion..." user.death() emagged = 0 //removes the emagged status after you lose - playing = 0 //also a new game + gameStatus = ORION_STATUS_START name = "The Orion Trail" desc = "Learn how our ancestors got to Orion, and have fun in the process!" else if(event) dat = eventdat - else if(playing) + else if(gameStatus == ORION_STATUS_NORMAL) var/title = stops[turns] var/subtext = stopblurbs[turns] dat = "

[title]

" @@ -453,8 +457,7 @@ return /obj/machinery/computer/arcade/orion_trail/Topic(href, href_list) - . = ..() - if(.) + if(..()) return if(href_list["close"]) usr.unset_machine() @@ -465,247 +468,275 @@ busy = 1 if (href_list["continue"]) //Continue your travels - if(turns >= ORION_TRAIL_WINTURN) - win() - else - food -= (alive+lings_aboard)*2 - fuel -= 5 - if(turns == 2 && prob(30)) - event = ORION_TRAIL_COLLISION - event() - else if(prob(75)) - event = pickweight(events) - if(lings_aboard) - if(event == ORION_TRAIL_LING || prob(55)) - event = ORION_TRAIL_LING_ATTACK - event() - turns += 1 - if(emagged) - var/mob/living/carbon/M = usr //for some vars - switch(event) - if(ORION_TRAIL_RAIDERS) - if(prob(50)) - usr << "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?" - M.hallucination += 30 - else - usr << "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there..." - M.take_organ_damage(30) - playsound(loc, 'sound/weapons/genhit2.ogg', 100, 1) - if(ORION_TRAIL_ILLNESS) - var/severity = rand(1,3) //pray to RNGesus. PRAY, PIGS - if(severity == 1) - M << "You suddenly feel slightly nauseous." //got off lucky - if(severity == 2) - usr << "You suddenly feel extremely nauseous and hunch over until it passes." - M.Stun(3) - if(severity >= 3) //you didn't pray hard enough - M << "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit." - M.Stun(5) - sleep(30) - say("[M] violently throws up!") - playsound(loc, 'sound/effects/splat.ogg', 50, 1) - M.nutrition -= 50 //lose a lot of food - var/turf/location = usr.loc - if(istype(location, /turf/simulated)) - location.add_vomit_floor(src, 1) - if(ORION_TRAIL_FLUX) - if(prob(75)) - M.Weaken(3) - say("A sudden gust of powerful wind slams [M] into the floor!") - M.take_organ_damage(25) - playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1) - else - M << "A violent gale blows past you, and you barely manage to stay standing!" - if(ORION_TRAIL_COLLISION) //by far the most damaging event - if(prob(90)) - playsound(src.loc, 'sound/effects/bang.ogg', 100, 1) - var/turf/simulated/floor/F - for(F in orange(1, src)) - F.ChangeTurf(F.baseturf) - say("Something slams into the floor around [src], exposing it to space!") - if(hull) - sleep(10) - say("A new floor suddenly appears around [src]. What the hell?") + if(gameStatus == ORION_STATUS_NORMAL && !event && turns != 7) + if(turns >= ORION_TRAIL_WINTURN) + win() + else + food -= (alive+lings_aboard)*2 + fuel -= 5 + if(turns == 2 && prob(30)) + event = ORION_TRAIL_COLLISION + event() + else if(prob(75)) + event = pickweight(events) + if(lings_aboard) + if(event == ORION_TRAIL_LING || prob(55)) + event = ORION_TRAIL_LING_ATTACK + event() + turns += 1 + if(emagged) + var/mob/living/carbon/M = usr //for some vars + switch(event) + if(ORION_TRAIL_RAIDERS) + if(prob(50)) + usr << "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?" + M.hallucination += 30 + else + usr << "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there..." + M.take_organ_damage(30) + playsound(loc, 'sound/weapons/genhit2.ogg', 100, 1) + if(ORION_TRAIL_ILLNESS) + var/severity = rand(1,3) //pray to RNGesus. PRAY, PIGS + if(severity == 1) + M << "You suddenly feel slightly nauseous." //got off lucky + if(severity == 2) + usr << "You suddenly feel extremely nauseous and hunch over until it passes." + M.Stun(3) + if(severity >= 3) //you didn't pray hard enough + M << "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit." + M.Stun(5) + sleep(30) + say("[M] violently throws up!") + playsound(loc, 'sound/effects/splat.ogg', 50, 1) + M.nutrition -= 50 //lose a lot of food + var/turf/location = usr.loc + if(istype(location, /turf/simulated)) + location.add_vomit_floor(src, 1) + if(ORION_TRAIL_FLUX) + if(prob(75)) + M.Weaken(3) + say("A sudden gust of powerful wind slams [M] into the floor!") + M.take_organ_damage(25) playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1) - var/turf/space/T - for(T in orange(1, src)) - T.ChangeTurf(/turf/simulated/floor/plating/) - else - say("Something slams into the floor around [src] - luckily, it didn't get through!") - playsound(src.loc, 'sound/effects/bang.ogg', 50, 1) - if(ORION_TRAIL_MALFUNCTION) - playsound(src.loc, 'sound/effects/EMPulse.ogg', 50, 1) - src.visible_message("[src] malfunctions, randomizing in-game stats!") - var/oldfood = food - var/oldfuel = fuel - food = rand(10,80) / rand(1,2) - fuel = rand(10,60) / rand(1,2) - if(electronics) - sleep(10) - if(oldfuel > fuel && oldfood > food) - src.audible_message("[src] lets out a somehow reassuring chime.") - else if(oldfuel < fuel || oldfood < food) - src.audible_message("[src] lets out a somehow ominous chime.") - food = oldfood - fuel = oldfuel - playsound(src.loc, 'sound/machines/chime.ogg', 50, 1) + else + M << "A violent gale blows past you, and you barely manage to stay standing!" + if(ORION_TRAIL_COLLISION) //by far the most damaging event + if(prob(90)) + playsound(src.loc, 'sound/effects/bang.ogg', 100, 1) + var/turf/simulated/floor/F + for(F in orange(1, src)) + F.ChangeTurf(F.baseturf) + say("Something slams into the floor around [src], exposing it to space!") + if(hull) + sleep(10) + say("A new floor suddenly appears around [src]. What the hell?") + playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1) + var/turf/space/T + for(T in orange(1, src)) + T.ChangeTurf(/turf/simulated/floor/plating/) + else + say("Something slams into the floor around [src] - luckily, it didn't get through!") + playsound(src.loc, 'sound/effects/bang.ogg', 50, 1) + if(ORION_TRAIL_MALFUNCTION) + playsound(src.loc, 'sound/effects/EMPulse.ogg', 50, 1) + src.visible_message("[src] malfunctions, randomizing in-game stats!") + var/oldfood = food + var/oldfuel = fuel + food = rand(10,80) / rand(1,2) + fuel = rand(10,60) / rand(1,2) + if(electronics) + sleep(10) + if(oldfuel > fuel && oldfood > food) + src.audible_message("[src] lets out a somehow reassuring chime.") + else if(oldfuel < fuel || oldfood < food) + src.audible_message("[src] lets out a somehow ominous chime.") + food = oldfood + fuel = oldfuel + playsound(src.loc, 'sound/machines/chime.ogg', 50, 1) else if(href_list["newgame"]) //Reset everything - newgame() + if(gameStatus == ORION_STATUS_START) + newgame() else if(href_list["menu"]) //back to the main menu - playing = 0 - event = null - gameover = 0 - food = 80 - fuel = 60 - settlers = list("Harry","Larry","Bob") + if(gameStatus == ORION_STATUS_GAMEOVER) + gameStatus = ORION_STATUS_START + event = null + food = 80 + fuel = 60 + settlers = list("Harry","Larry","Bob") else if(href_list["slow"]) //slow down - food -= (alive+lings_aboard)*2 - fuel -= 5 + if(event == ORION_TRAIL_FLUX) + food -= (alive+lings_aboard)*2 + fuel -= 5 event = null else if(href_list["pastblack"]) //slow down - food -= ((alive+lings_aboard)*2)*3 - fuel -= 15 - turns += 1 - event = null - else if(href_list["useengine"]) //use parts - engine = max(0, --engine) - event = null - else if(href_list["useelec"]) //use parts - electronics = max(0, --electronics) - event = null - else if(href_list["usehull"]) //use parts - hull = max(0, --hull) - event = null - else if(href_list["wait"]) //wait 3 days - food -= ((alive+lings_aboard)*2)*3 - event = null - else if(href_list["keepspeed"]) //keep speed - if(prob(75)) - event = "Breakdown" - event() - else - event = null - else if(href_list["blackhole"]) //keep speed past a black hole - if(prob(75)) - event = ORION_TRAIL_BLACKHOLE - event() - if(emagged) //has to be here because otherwise it doesn't work - playsound(src.loc, 'sound/effects/supermatter.ogg', 100, 1) - say("A miniature black hole suddenly appears in front of [src], devouring [usr] alive!") - usr.Stun(10) //you can't run :^) - var/S = new /obj/singularity/academy(usr.loc) - emagged = 0 //immediately removes emagged status so people can't kill themselves by sprinting up and interacting - sleep(50) - say("[S] winks out, just as suddenly as it appeared.") - qdel(S) - else - event = null + if(turns == 7) + food -= ((alive+lings_aboard)*2)*3 + fuel -= 15 turns += 1 + event = null + else if(href_list["useengine"]) //use parts + if(event == ORION_TRAIL_BREAKDOWN) + engine = max(0, --engine) + event = null + else if(href_list["useelec"]) //use parts + if(event == ORION_TRAIL_MALFUNCTION) + electronics = max(0, --electronics) + event = null + else if(href_list["usehull"]) //use parts + if(event == ORION_TRAIL_COLLISION) + hull = max(0, --hull) + event = null + else if(href_list["wait"]) //wait 3 days + if(event == ORION_TRAIL_BREAKDOWN || event == ORION_TRAIL_MALFUNCTION || event == ORION_TRAIL_COLLISION) + food -= ((alive+lings_aboard)*2)*3 + event = null + else if(href_list["keepspeed"]) //keep speed + if(event == ORION_TRAIL_FLUX) + if(prob(75)) + event = "Breakdown" + event() + else + event = null + else if(href_list["blackhole"]) //keep speed past a black hole + if(turns == 7) + if(prob(75)) + event = ORION_TRAIL_BLACKHOLE + event() + if(emagged) //has to be here because otherwise it doesn't work + playsound(src.loc, 'sound/effects/supermatter.ogg', 100, 1) + say("A miniature black hole suddenly appears in front of [src], devouring [usr] alive!") + usr.Stun(10) //you can't run :^) + var/S = new /obj/singularity/academy(usr.loc) + emagged = 0 //immediately removes emagged status so people can't kill themselves by sprinting up and interacting + sleep(50) + say("[S] winks out, just as suddenly as it appeared.") + qdel(S) + else + event = null + turns += 1 else if(href_list["holedeath"]) - gameover = 1 - event = null + if(event == ORION_TRAIL_BLACKHOLE) + gameStatus = ORION_STATUS_GAMEOVER + event = null else if(href_list["eventclose"]) //end an event - event = null + if(canContinueEvent) + event = null else if(href_list["killcrew"]) //shoot a crewmember - var/sheriff = remove_crewmember() //I shot the sheriff - playsound(loc,'sound/weapons/Gunshot.ogg', 100, 1) + if(gameStatus == ORION_STATUS_NORMAL || event == ORION_TRAIL_LING) + var/sheriff = remove_crewmember() //I shot the sheriff + playsound(loc,'sound/weapons/Gunshot.ogg', 100, 1) - if(settlers.len == 0 || alive == 0) - say("The last crewmember [sheriff], shot themselves, GAME OVER!") - if(emagged) - usr.death(0) - emagged = 0 - gameover = 1 - event = null - else if(emagged) - if(usr.name == sheriff) - say("The crew of the ship chose to kill [usr.name]!") - usr.death(0) + if(settlers.len == 0 || alive == 0) + say("The last crewmember [sheriff], shot themselves, GAME OVER!") + if(emagged) + usr.death(0) + emagged = 0 + gameStatus = ORION_STATUS_GAMEOVER + event = null + else if(emagged) + if(usr.name == sheriff) + say("The crew of the ship chose to kill [usr.name]!") + usr.death(0) - if(event == ORION_TRAIL_LING) //only ends the ORION_TRAIL_LING event, since you can do this action in multiple places - event = null + if(event == ORION_TRAIL_LING) //only ends the ORION_TRAIL_LING event, since you can do this action in multiple places + event = null //Spaceport specific interactions //they get a header because most of them don't reset event (because it's a shop, you leave when you want to) //they also call event() again, to regen the eventdata, which is kind of odd but necessary else if(href_list["buycrew"]) //buy a crewmember - var/bought = add_crewmember() - last_spaceport_action = "You hired [bought] as a new crewmember." - fuel -= 10 - food -= 10 - event() + if(gameStatus == ORION_STATUS_MARKET) + if(!spaceport_raided && food >= 10 && fuel >= 10) + var/bought = add_crewmember() + last_spaceport_action = "You hired [bought] as a new crewmember." + fuel -= 10 + food -= 10 + event() else if(href_list["sellcrew"]) //sell a crewmember - var/sold = remove_crewmember() - last_spaceport_action = "You sold your crewmember, [sold]!" - fuel += 7 - food += 7 - event() + if(gameStatus == ORION_STATUS_MARKET) + if(!spaceport_raided && settlers.len > 1) + var/sold = remove_crewmember() + last_spaceport_action = "You sold your crewmember, [sold]!" + fuel += 7 + food += 7 + event() else if(href_list["leave_spaceport"]) - event = null - spaceport_raided = 0 - spaceport_freebie = 0 - last_spaceport_action = "" + if(gameStatus == ORION_STATUS_MARKET) + event = null + gameStatus = ORION_STATUS_NORMAL + spaceport_raided = 0 + spaceport_freebie = 0 + last_spaceport_action = "" else if(href_list["raid_spaceport"]) - var/success = min(15 * alive,100) //default crew (4) have a 60% chance - spaceport_raided = 1 + if(gameStatus == ORION_STATUS_MARKET) + if(!spaceport_raided) + var/success = min(15 * alive,100) //default crew (4) have a 60% chance + spaceport_raided = 1 - var/FU = 0 - var/FO = 0 - if(prob(success)) - FU = rand(5,15) - FO = rand(5,15) - last_spaceport_action = "You successfully raided the spaceport! you gained [FU] Fuel and [FO] Food! (+[FU]FU,+[FO]FO)" - else - FU = rand(-5,-15) - FO = rand(-5,-15) - last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food in your scramble to escape! ([FU]FU,[FO]FO)" + var/FU = 0 + var/FO = 0 + if(prob(success)) + FU = rand(5,15) + FO = rand(5,15) + last_spaceport_action = "You successfully raided the spaceport! you gained [FU] Fuel and [FO] Food! (+[FU]FU,+[FO]FO)" + else + FU = rand(-5,-15) + FO = rand(-5,-15) + last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food in your scramble to escape! ([FU]FU,[FO]FO)" - //your chance of lose a crewmember is 1/2 your chance of success - //this makes higher % failures hurt more, don't get cocky space cowboy! - if(prob(success*5)) - var/lost_crew = remove_crewmember() - last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food, AND [lost_crew] in your scramble to escape! ([FU]FI,[FO]FO,-Crew)" - if(emagged) - say("WEEWOO WEEWOO, Spaceport Security en route!") - for(var/i, i<=3, i++) - var/mob/living/simple_animal/hostile/syndicate/ranged/orion/O = new/mob/living/simple_animal/hostile/syndicate/ranged/orion(get_turf(src)) - O.target = usr + //your chance of lose a crewmember is 1/2 your chance of success + //this makes higher % failures hurt more, don't get cocky space cowboy! + if(prob(success*5)) + var/lost_crew = remove_crewmember() + last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food, AND [lost_crew] in your scramble to escape! ([FU]FI,[FO]FO,-Crew)" + if(emagged) + say("WEEWOO WEEWOO, Spaceport Security en route!") + for(var/i, i<=3, i++) + var/mob/living/simple_animal/hostile/syndicate/ranged/orion/O = new/mob/living/simple_animal/hostile/syndicate/ranged/orion(get_turf(src)) + O.target = usr - fuel += FU - food += FO - event() + fuel += FU + food += FO + event() else if(href_list["buyparts"]) - switch(text2num(href_list["buyparts"])) - if(1) //Engine Parts - engine++ - last_spaceport_action = "Bought Engine Parts" - if(2) //Hull Plates - hull++ - last_spaceport_action = "Bought Hull Plates" - if(3) //Spare Electronics - electronics++ - last_spaceport_action = "Bought Spare Electronics" - fuel -= 5 //they all cost 5 - event() + if(gameStatus == ORION_STATUS_MARKET) + if(!spaceport_raided && fuel > 5) + switch(text2num(href_list["buyparts"])) + if(1) //Engine Parts + engine++ + last_spaceport_action = "Bought Engine Parts" + if(2) //Hull Plates + hull++ + last_spaceport_action = "Bought Hull Plates" + if(3) //Spare Electronics + electronics++ + last_spaceport_action = "Bought Spare Electronics" + fuel -= 5 //they all cost 5 + event() else if(href_list["trade"]) - switch(text2num(href_list["trade"])) - if(1) //Fuel - fuel -= 5 - food += 5 - last_spaceport_action = "Traded Fuel for Food" - if(2) //Food - fuel += 5 - food -= 5 - last_spaceport_action = "Traded Food for Fuel" - event() + if(gameStatus == ORION_STATUS_MARKET) + if(!spaceport_raided) + switch(text2num(href_list["trade"])) + if(1) //Fuel + if(fuel > 5) + fuel -= 5 + food += 5 + last_spaceport_action = "Traded Fuel for Food" + event() + if(2) //Food + if(food > 5) + fuel += 5 + food -= 5 + last_spaceport_action = "Traded Food for Fuel" + event() src.add_fingerprint(usr) src.updateUsrDialog() @@ -715,7 +746,7 @@ /obj/machinery/computer/arcade/orion_trail/proc/event() eventdat = "

[event]

" - + canContinueEvent = 0 switch(event) if(ORION_TRAIL_RAIDERS) eventdat += "Raiders have come aboard your ship!" @@ -732,6 +763,7 @@ eventdat += "
Fortunately you fended them off without any trouble." eventdat += "

Continue

" eventdat += "

Close

" + canContinueEvent = 1 if(ORION_TRAIL_FLUX) eventdat += "This region of space is highly turbulent.
If we go slowly we may avoid more damage, but if we keep our speed we won't waste supplies." @@ -745,6 +777,7 @@ eventdat += "
[deadname] was killed by the disease." eventdat += "

Continue

" eventdat += "

Close

" + canContinueEvent = 1 if(ORION_TRAIL_BREAKDOWN) eventdat += "Oh no! The engine has broken down!" @@ -806,6 +839,7 @@ eventdat += "

Kill a crewmember

" eventdat += "

Risk it

" eventdat += "

Close

" + canContinueEvent = 1 if(ORION_TRAIL_LING_ATTACK) if(lings_aboard <= 0) //shouldn't trigger, but hey. @@ -847,9 +881,11 @@ eventdat += "

Continue

" eventdat += "

Close

" + canContinueEvent = 1 if(ORION_TRAIL_SPACEPORT) + gameStatus = ORION_STATUS_MARKET if(spaceport_raided) eventdat += "The Spaceport is on high alert! they wont let you dock since you tried to attack them!" if(last_spaceport_action) @@ -978,8 +1014,7 @@ /obj/machinery/computer/arcade/orion_trail/proc/win() - playing = 0 - turns = 1 + gameStatus = ORION_STATUS_START say("Congratulations, you made it to Orion!") if(emagged) new /obj/item/weapon/orion_ship(src.loc) @@ -1071,3 +1106,8 @@ #undef ORION_TRAIL_COLLISION #undef ORION_TRAIL_SPACEPORT #undef ORION_TRAIL_BLACKHOLE + +#undef ORION_STATUS_START +#undef ORION_STATUS_NORMAL +#undef ORION_STATUS_GAMEOVER +#undef ORION_STATUS_MARKET \ No newline at end of file diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index d7b9be9aaac..4cc24bf776b 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -38,7 +38,7 @@ GrantActions(user) current_user = user eyeobj.user = user - eyeobj.name = "Camere Eye ([user.name])" + eyeobj.name = "Camera Eye ([user.name])" L.remote_view = 1 L.remote_control = eyeobj L.client.perspective = EYE_PERSPECTIVE diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 65f0690047d..8cfd51a294f 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -350,7 +350,7 @@ return /obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject) - if (!check_dna_integrity(subject) || !istype(subject)) + if (!istype(subject)) scantemp = "Unable to locate valid genetic data." return if (!subject.getorgan(/obj/item/organ/internal/brain)) diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm new file mode 100644 index 00000000000..5de7d5b4adb --- /dev/null +++ b/code/game/machinery/computer/dna_console.dm @@ -0,0 +1,482 @@ +#define INJECTOR_TIMEOUT 300 +#define REJUVENATORS_INJECT 15 +#define REJUVENATORS_MAX 90 +#define NUMBER_OF_BUFFERS 3 + +#define RADIATION_STRENGTH_MAX 15 +#define RADIATION_STRENGTH_MULTIPLIER 1 //larger has a more range + +#define RADIATION_DURATION_MAX 30 +#define RADIATION_ACCURACY_MULTIPLIER 3 //larger is less accurate + +#define RADIATION_IRRADIATION_MULTIPLIER 0.2 //multiplier for how much radiation a test subject recieves + +/obj/machinery/computer/scan_consolenew + name = "\improper DNA scanner access console" + desc = "Scan DNA." + icon_screen = "dna" + icon_keyboard = "med_key" + density = 1 + circuit = /obj/item/weapon/circuitboard/scan_consolenew + var/radduration = 2 + var/radstrength = 1 + + var/list/buffer[NUMBER_OF_BUFFERS] + + var/injectorready = 0 //Quick fix for issue 286 (screwdriver the screen twice to restore injector) -Pete + var/current_screen = "mainmenu" + var/obj/machinery/dna_scannernew/connected = null + var/obj/item/weapon/disk/data/diskette = null + anchored = 1 + use_power = 1 + idle_power_usage = 10 + active_power_usage = 400 + +/obj/machinery/computer/scan_consolenew/attackby(obj/item/I, mob/user, params) + if (istype(I, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES + if (!src.diskette) + if(!user.drop_item()) + return + I.loc = src + src.diskette = I + user << "You insert [I]." + src.updateUsrDialog() + return + else + ..() + return + +/obj/machinery/computer/scan_consolenew/New() + ..() + + spawn(5) + for(dir in list(NORTH,EAST,SOUTH,WEST)) + connected = locate(/obj/machinery/dna_scannernew, get_step(src, dir)) + if(!isnull(connected)) + break + spawn(250) + injectorready = 1 + return + return + +/obj/machinery/computer/scan_consolenew/attack_hand(mob/user) + if(..()) + return + ShowInterface(user) + +/obj/machinery/computer/scan_consolenew/proc/ShowInterface(mob/user, last_change) + if(!user) return + var/datum/browser/popup = new(user, "scannernew", "DNA Modifier Console", 800, 630) // Set up the popup browser window + if(!( in_range(src, user) || istype(user, /mob/living/silicon) )) + popup.close() + return + popup.add_stylesheet("scannernew", 'html/browser/scannernew.css') + + var/mob/living/carbon/viable_occupant + var/occupant_status = "
Subject Status:
" + var/scanner_status + var/temp_html + if(connected && connected.is_operational()) + if(connected.occupant) //set occupant_status message + viable_occupant = connected.occupant + if(viable_occupant.has_dna() && (!(viable_occupant.disabilities & NOCLONE) || (connected.scan_level == 3))) //occupent is viable for dna modification + occupant_status += "[viable_occupant.name] => " + switch(viable_occupant.stat) + if(CONSCIOUS) occupant_status += "Conscious" + if(UNCONSCIOUS) occupant_status += "Unconscious" + else occupant_status += "DEAD - Cannot Operate" + occupant_status += "
" + occupant_status += "
Health:
[viable_occupant.health] %
" + occupant_status += "
Radiation Level:
[viable_occupant.radiation] %
" + var/rejuvenators = viable_occupant.reagents.get_reagent_amount("epinephrine") + occupant_status += "
Rejuvenators:
[rejuvenators] units
" + occupant_status += "
Unique Enzymes :
[viable_occupant.dna.unique_enzymes]
" + occupant_status += "
Last Operation:
[last_change ? last_change : "----"]
" + else + viable_occupant = null + occupant_status += "Invalid DNA structure" + if (viable_occupant && viable_occupant.stat == DEAD) + viable_occupant = null // No editing the dead. + else + occupant_status += "No subject detected" + + if(connected.state_open) + scanner_status = "Open" + else + scanner_status = "Closed" + if(connected.locked) + scanner_status += " (Locked)" + else + scanner_status += " (Unlocked)" + + + else + occupant_status += "----" + scanner_status += "Error: No scanner detected" + + var/status = "
" + status += "
Scanner:
[scanner_status]
" + status += "[occupant_status]" + + + status += "

Radiation Emitter Status

" + var/stddev = radstrength*RADIATION_STRENGTH_MULTIPLIER + status += "
Output Level:
[radstrength]
" + status += "
  \> Mutation:
(-[stddev] to +[stddev] = 68 %) (-[2*stddev] to +[2*stddev] = 95 %)
" + if(connected) + stddev = RADIATION_ACCURACY_MULTIPLIER/(radduration + (connected.precision_coeff ** 2)) + else + stddev = RADIATION_ACCURACY_MULTIPLIER/radduration + var/chance_to_hit + switch(stddev) //hardcoded values from a z-table for a normal distribution + if(0 to 0.25) chance_to_hit = ">95 %" + if(0.25 to 0.5) chance_to_hit = "68-95 %" + if(0.5 to 0.75) chance_to_hit = "55-68 %" + else chance_to_hit = "<38 %" + status += "
Pulse Duration:
[radduration]
" + status += "
  \> Accuracy:
[chance_to_hit]
" + status += "
" // Close statusDisplay div + var/buttons = "Scan " + if(connected) + buttons += " [connected.state_open ? "Close" : "Open"] Scanner " + if (connected.state_open) + buttons += "[connected.locked ? "Unlock" : "Lock"] Scanner " + else + buttons += "[connected.locked ? "Unlock" : "Lock"] Scanner " + else buttons += "Open Scanner Lock Scanner " + if(viable_occupant) buttons += "Inject Rejuvenators " + else buttons += "Inject Rejuvenators " + if(diskette) buttons += "Eject Disk " + else buttons += "Eject Disk " + if(current_screen == "buffer") buttons += "Radiation Emitter Menu " + else buttons += "Buffer Menu " + + switch(current_screen) + if("working") + temp_html += status + temp_html += "

System Busy

" + temp_html += "Working ... Please wait ([radduration] Seconds)" + if("buffer") + temp_html += status + temp_html += buttons + temp_html += "

Buffer Menu

" + + if(istype(buffer)) + for(var/i=1, i<=buffer.len, i++) + temp_html += "
Slot [i]: " + var/list/buffer_slot = buffer[i] + if( !buffer_slot || !buffer_slot.len || !buffer_slot["name"] || !((buffer_slot["UI"] && buffer_slot["UE"]) || buffer_slot["SE"]) ) + temp_html += "
\tNo Data" + if(viable_occupant) temp_html += "
Save to Buffer " + else temp_html += "
Save to Buffer " + temp_html += "Clear Buffer " + if(diskette) temp_html += "Load from Disk " + else temp_html += "Load from Disk " + temp_html += "Save to Disk " + else + var/ui = buffer_slot["UI"] + var/se = buffer_slot["SE"] + var/ue = buffer_slot["UE"] + var/name = buffer_slot["name"] + var/label = buffer_slot["label"] + var/blood_type = buffer_slot["blood_type"] + temp_html += "
\tLabel: [label ? label : name]" + temp_html += "
\tSubject: [name]" + if(ue && name && blood_type) + temp_html += "
\tBlood Type: [blood_type]" + temp_html += "
\tUE: [ue] " + if(viable_occupant) temp_html += "Occupant " + else temp_html += "Occupant" + if(injectorready) temp_html += "Injector" + else temp_html += "Injector" + else + temp_html += "
\tBlood Type: No Data" + temp_html += "
\tUE: No Data" + if(ui) + temp_html += "
\tUI: [ui] " + if(viable_occupant) temp_html += "Occupant " + else temp_html += "Occupant" + if(injectorready) temp_html += "Injector" + else temp_html += "Injector" + else + temp_html += "
\tUI: No Data" + if(se) + temp_html += "
\tSE: [se] " + if(viable_occupant && viable_occupant.stat != DEAD) temp_html += "Occupant " + else temp_html += "Occupant " + if(injectorready) temp_html += "Injector" + else temp_html += "Injector" + else + temp_html += "
\tSE: No Data" + if(viable_occupant) temp_html += "
Save to Buffer " + else temp_html += "
Save to Buffer " + temp_html += "Clear Buffer " + if(diskette) temp_html += "Load from Disk " + else temp_html += "Load from Disk " + if(diskette && !diskette.read_only) temp_html += "Save to Disk " + else temp_html += "Save to Disk " + else + temp_html += status + temp_html += buttons + temp_html += "

Radiation Emitter Menu

" + + temp_html += "-- Output Level ++" + temp_html += "
-- Pulse Duration ++" + + temp_html += "

Irradiate Subject

" + temp_html += "
Unique Identifier:
" + + var/max_line_len = 7*DNA_BLOCK_SIZE + if(viable_occupant) + temp_html += "
1
" + var/len = length(viable_occupant.dna.uni_identity) + for(var/i=1, i<=len, i++) + temp_html += "[copytext(viable_occupant.dna.uni_identity,i,i+1)]" + if ((i % max_line_len) == 0) + temp_html += "
" + if((i % DNA_BLOCK_SIZE) == 0 && i < len) + temp_html += "
[(i / DNA_BLOCK_SIZE) + 1]
" + else + temp_html += "----" + temp_html += "

" + + temp_html += "
Structural Enzymes:
" + if(viable_occupant) + temp_html += "
1
" + var/len = length(viable_occupant.dna.struc_enzymes) + for(var/i=1, i<=len, i++) + temp_html += "[copytext(viable_occupant.dna.struc_enzymes,i,i+1)]" + if ((i % max_line_len) == 0) + temp_html += "
" + if((i % DNA_BLOCK_SIZE) == 0 && i < len) + temp_html += "
[(i / DNA_BLOCK_SIZE) + 1]
" + else + temp_html += "----" + temp_html += "
" + + popup.set_content(temp_html) + popup.open() + + +/obj/machinery/computer/scan_consolenew/Topic(href, href_list) + if(..()) + return + if(!isturf(usr.loc)) + return + if(!( (isturf(loc) && in_range(src, usr)) || istype(usr, /mob/living/silicon) )) + return + if(current_screen == "working") + return + + add_fingerprint(usr) + usr.set_machine(src) + + var/mob/living/carbon/viable_occupant + if(connected) + viable_occupant = connected.occupant + if(!istype(viable_occupant) || !viable_occupant.dna || (viable_occupant.disabilities & NOCLONE)) + viable_occupant = null + + //Basic Tasks/////////////////////////////////////////// + var/num = round(text2num(href_list["num"])) + var/last_change + switch(href_list["task"]) + if("togglelock") + if(connected) connected.locked = !connected.locked + if("toggleopen") + if(connected) connected.toggle_open(usr) + if("setduration") + if(!num) + num = round(input(usr, "Choose pulse duration:", "Input an Integer", null) as num|null) + if(num) + radduration = Wrap(num, 1, RADIATION_DURATION_MAX+1) + if("setstrength") + if(!num) + num = round(input(usr, "Choose pulse strength:", "Input an Integer", null) as num|null) + if(num) + radstrength = Wrap(num, 1, RADIATION_STRENGTH_MAX+1) + if("screen") + current_screen = href_list["text"] + if("rejuv") + if(viable_occupant && viable_occupant.reagents) + var/epinephrine_amount = viable_occupant.reagents.get_reagent_amount("epinephrine") + var/can_add = max(min(REJUVENATORS_MAX - epinephrine_amount, REJUVENATORS_INJECT), 0) + viable_occupant.reagents.add_reagent("epinephrine", can_add) + if("setbufferlabel") + var/text = sanitize(input(usr, "Input a new label:", "Input an Text", null) as text|null) + if(num && text) + num = Clamp(num, 1, NUMBER_OF_BUFFERS) + var/list/buffer_slot = buffer[num] + if(istype(buffer_slot)) + buffer_slot["label"] = text + if("setbuffer") + if(num && viable_occupant) + num = Clamp(num, 1, NUMBER_OF_BUFFERS) + buffer[num] = list( + "label"="Buffer[num]:[viable_occupant.real_name]", + "UI"=viable_occupant.dna.uni_identity, + "SE"=viable_occupant.dna.struc_enzymes, + "UE"=viable_occupant.dna.unique_enzymes, + "name"=viable_occupant.real_name, + "blood_type"=viable_occupant.dna.blood_type + ) + if("clearbuffer") + if(num) + num = Clamp(num, 1, NUMBER_OF_BUFFERS) + var/list/buffer_slot = buffer[num] + if(istype(buffer_slot)) + buffer_slot.Cut() + if("transferbuffer") + if(num && viable_occupant && viable_occupant.stat != DEAD) + num = Clamp(num, 1, NUMBER_OF_BUFFERS) + var/list/buffer_slot = buffer[num] + if(istype(buffer_slot)) //15 and 40 are just magic numbers that were here before so i didnt touch them, they are initial boundaries of damage + viable_occupant.radiation += rand(15/(connected.damage_coeff ** 2),40/(connected.damage_coeff ** 2)) //Each laser level reduces damage by lvl^2, so no effect on 1 lvl, 4 times less damage on 2 and 9 times less damage on 3 + switch(href_list["text"]) //Numbers are this high because other way upgrading laser is just not worth the hassle, and i cant think of anything better to inmrove + if("se") + if(buffer_slot["SE"]) + viable_occupant.dna.struc_enzymes = buffer_slot["SE"] + viable_occupant.domutcheck() + if("ui") + if(buffer_slot["UI"]) + viable_occupant.dna.uni_identity = buffer_slot["UI"] + viable_occupant.updateappearance(mutations_overlay_update=1) + else + if(buffer_slot["name"] && buffer_slot["UE"] && buffer_slot["blood_type"]) + viable_occupant.real_name = buffer_slot["name"] + viable_occupant.name = buffer_slot["name"] + viable_occupant.dna.unique_enzymes = buffer_slot["UE"] + viable_occupant.dna.blood_type = buffer_slot["blood_type"] + if("injector") + if(num && injectorready) + num = Clamp(num, 1, NUMBER_OF_BUFFERS) + var/list/buffer_slot = buffer[num] + if(istype(buffer_slot)) + var/obj/item/weapon/dnainjector/I + switch(href_list["text"]) + if("se") + if(buffer_slot["SE"]) + I = new /obj/item/weapon/dnainjector(loc) + for(var/datum/mutation/human/HM in good_mutations + bad_mutations + not_good_mutations) + if(HM.check_block_string(buffer_slot["SE"])) + if(prob(HM.get_chance)) + I.add_mutations.Add(HM) + else + I.remove_mutations.Add(HM) + I.damage_coeff = connected.damage_coeff + if("ui") + if(buffer_slot["UI"]) + I = new /obj/item/weapon/dnainjector(loc) + I.fields = list("UI"=buffer_slot["UI"]) + I.damage_coeff = connected.damage_coeff + else + if(buffer_slot["name"] && buffer_slot["UE"] && buffer_slot["blood_type"]) + I = new /obj/item/weapon/dnainjector(loc) + I.fields = list("name"=buffer_slot["name"], "UE"=buffer_slot["UE"], "blood_type"=buffer_slot["blood_type"]) + I.damage_coeff = connected.damage_coeff + if(I) + injectorready = 0 + spawn(INJECTOR_TIMEOUT) + injectorready = 1 + if("loaddisk") + if(num && diskette && diskette.fields) + num = Clamp(num, 1, NUMBER_OF_BUFFERS) + buffer[num] = diskette.fields.Copy() + if("savedisk") + if(num && diskette && !diskette.read_only) + num = Clamp(num, 1, NUMBER_OF_BUFFERS) + var/list/buffer_slot = buffer[num] + if(istype(buffer_slot)) + diskette.name = "data disk \[[buffer_slot["label"]]\]" + diskette.fields = buffer_slot.Copy() + if("ejectdisk") + if(diskette) + diskette.loc = get_turf(src) + diskette = null + if("pulseui","pulsese") + if(num && viable_occupant && connected && viable_occupant.stat != DEAD) + radduration = Wrap(radduration, 1, RADIATION_DURATION_MAX+1) + radstrength = Wrap(radstrength, 1, RADIATION_STRENGTH_MAX+1) + + var/locked_state = connected.locked + connected.locked = 1 + + current_screen = "working" + ShowInterface(usr) + + sleep(radduration*10) + current_screen = "mainmenu" + + if(viable_occupant && connected && connected.occupant==viable_occupant) + viable_occupant.radiation += (RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength)/(connected.damage_coeff ** 2) //Read comment in "transferbuffer" section above for explanation + switch(href_list["task"]) //Same thing as there but values are even lower, on best part they are about 0.0*, effectively no damage + if("pulseui") + var/len = length(viable_occupant.dna.uni_identity) + num = Wrap(num, 1, len+1) + num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) //Each manipulator level above 1 makes randomization as accurate as selected time + manipulator lvl^2 + //Value is this high for the same reason as with laser - not worth the hassle of upgrading if the bonus is low + var/block = round((num-1)/DNA_BLOCK_SIZE)+1 + var/subblock = num - block*DNA_BLOCK_SIZE + last_change = "UI #[block]-[subblock]; " + + var/hex = copytext(viable_occupant.dna.uni_identity, num, num+1) + last_change += "[hex]" + hex = scramble(hex, radstrength, radduration) + last_change += "->[hex]" + + viable_occupant.dna.uni_identity = copytext(viable_occupant.dna.uni_identity, 1, num) + hex + copytext(viable_occupant.dna.uni_identity, num+1, 0) + viable_occupant.updateappearance(mutations_overlay_update=1) + if("pulsese") + var/len = length(viable_occupant.dna.struc_enzymes) + num = Wrap(num, 1, len+1) + num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) + + var/block = round((num-1)/DNA_BLOCK_SIZE)+1 + var/subblock = num - block*DNA_BLOCK_SIZE + last_change = "SE #[block]-[subblock]; " + + var/hex = copytext(viable_occupant.dna.struc_enzymes, num, num+1) + last_change += "[hex]" + hex = scramble(hex, radstrength, radduration) + last_change += "->[hex]" + + viable_occupant.dna.struc_enzymes = copytext(viable_occupant.dna.struc_enzymes, 1, num) + hex + copytext(viable_occupant.dna.struc_enzymes, num+1, 0) + viable_occupant.domutcheck() + else + current_screen = "mainmenu" + + if(connected) + connected.locked = locked_state + + ShowInterface(usr,last_change) + +/obj/machinery/computer/scan_consolenew/proc/scramble(input,rs,rd) + var/length = length(input) + var/ran = gaussian(0, rs*RADIATION_STRENGTH_MULTIPLIER) + if(ran == 0) ran = pick(-1,1) //hacky, statistically should almost never happen. 0-change makes people mad though + else if(ran < 0) ran = round(ran) //negative, so floor it + else ran = -round(-ran) //positive, so ceiling it + return num2hex(Wrap(hex2num(input)+ran, 0, 16**length), length) + +/obj/machinery/computer/scan_consolenew/proc/randomize_radiation_accuracy(position_we_were_supposed_to_hit, radduration, number_of_blocks) + return Wrap(round(position_we_were_supposed_to_hit + gaussian(0, RADIATION_ACCURACY_MULTIPLIER/radduration), 1), 1, number_of_blocks+1) + + + +/////////////////////////// DNA MACHINES +#undef INJECTOR_TIMEOUT +#undef REJUVENATORS_INJECT +#undef REJUVENATORS_MAX +#undef NUMBER_OF_BUFFERS + +#undef RADIATION_STRENGTH_MAX +#undef RADIATION_STRENGTH_MULTIPLIER + +#undef RADIATION_DURATION_MAX +#undef RADIATION_ACCURACY_MULTIPLIER + +#undef RADIATION_IRRADIATION_MULTIPLIER + +//#undef BAD_MUTATION_DIFFICULTY +//#undef GOOD_MUTATION_DIFFICULTY +//#undef OP_MUTATION_DIFFICULTY \ No newline at end of file diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index ed568709958..679d9282e31 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -33,7 +33,7 @@ dat += "

Prisoner Implant Management

" dat += "
Chemical Implants
" var/turf/Tr = null - for(var/obj/item/weapon/implant/chem/C in world) + for(var/obj/item/weapon/implant/chem/C in tracking_implants) Tr = get_turf(C) if((Tr) && (Tr.z != src.z)) continue//Out of range if(!C.implanted) continue @@ -43,7 +43,7 @@ dat += "((10))
" dat += "********************************
" dat += "
Tracking Implants
" - for(var/obj/item/weapon/implant/tracking/T in world) + for(var/obj/item/weapon/implant/tracking/T in tracking_implants) if(!iscarbon(T.imp_in)) continue if(!T.implanted) diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm new file mode 100644 index 00000000000..ac18b3fe445 --- /dev/null +++ b/code/game/machinery/dna_scanner.dm @@ -0,0 +1,167 @@ +/obj/machinery/dna_scannernew + name = "\improper DNA scanner" + desc = "It scans DNA structures." + icon = 'icons/obj/Cryogenic2.dmi' + icon_state = "scanner" + density = 1 + var/locked = 0 + anchored = 1 + use_power = 1 + idle_power_usage = 50 + active_power_usage = 300 + var/damage_coeff + var/scan_level + var/precision_coeff + +/obj/machinery/dna_scannernew/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/clonescanner(null) + component_parts += new /obj/item/weapon/stock_parts/scanning_module(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(null) + component_parts += new /obj/item/weapon/stock_parts/console_screen(null) + component_parts += new /obj/item/stack/cable_coil(null, 1) + component_parts += new /obj/item/stack/cable_coil(null, 1) + RefreshParts() + + +/obj/machinery/dna_scannernew/RefreshParts() + scan_level = 0 + damage_coeff = 0 + precision_coeff = 0 + for(var/obj/item/weapon/stock_parts/scanning_module/P in component_parts) + scan_level += P.rating + for(var/obj/item/weapon/stock_parts/manipulator/P in component_parts) + precision_coeff = P.rating + for(var/obj/item/weapon/stock_parts/micro_laser/P in component_parts) + damage_coeff = P.rating + +/obj/machinery/dna_scannernew/update_icon() + + //no power or maintenance + if(stat & (NOPOWER|BROKEN)) + icon_state = initial(icon_state)+ (state_open ? "_open" : "") + "_unpowered" + return + + if((stat & MAINT) || panel_open) + icon_state = initial(icon_state)+ (state_open ? "_open" : "") + "_maintenance" + return + + //running and someone in there + if(occupant) + icon_state = initial(icon_state)+ "_occupied" + return + + //running + icon_state = initial(icon_state)+ (state_open ? "_open" : "") + +/obj/machinery/dna_scannernew/power_change() + ..() + update_icon() + +/obj/machinery/dna_scannernew/proc/toggle_open(mob/user) + if(panel_open) + user << "Close the maintenance panel first." + return + + if(state_open) + close_machine() + return + + else if(locked) + user << "The bolts are locked down, securing the door shut." + return + + open_machine() + +/obj/machinery/dna_scannernew/container_resist() + var/mob/living/user = usr + var/breakout_time = 2 + if(state_open || !locked) //Open and unlocked, no need to escape + state_open = 1 + return + user.changeNext_move(CLICK_CD_BREAKOUT) + user.last_special = world.time + CLICK_CD_BREAKOUT + user << "You lean on the back of [src] and start pushing the door open... (this will take about [breakout_time] minutes.)" + user.visible_message("You hear a metallic creaking from [src]!") + + if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked) + return + + locked = 0 + visible_message("[user] successfully broke out of [src]!") + user << "You successfully break out of [src]!" + + open_machine() + +/obj/machinery/dna_scannernew/close_machine() + if(!state_open) + return 0 + + ..() + + // search for ghosts, if the corpse is empty and the scanner is connected to a cloner + if(occupant) + if(locate(/obj/machinery/computer/cloning, get_step(src, NORTH)) \ + || locate(/obj/machinery/computer/cloning, get_step(src, SOUTH)) \ + || locate(/obj/machinery/computer/cloning, get_step(src, EAST)) \ + || locate(/obj/machinery/computer/cloning, get_step(src, WEST))) + + occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!") + return 1 + +/obj/machinery/dna_scannernew/open_machine() + if(state_open) + return 0 + + ..() + + return 1 + +/obj/machinery/dna_scannernew/relaymove(mob/user as mob) + if(user.stat || locked) + return + + open_machine() + return + +/obj/machinery/dna_scannernew/attackby(obj/item/I, mob/user, params) + + if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, I))//sent icon_state is irrelevant... + update_icon()//..since we're updating the icon here, since the scanner can be unpowered when opened/closed + return + + if(exchange_parts(user, I)) + return + + if(default_pry_open(I)) + return + + if(default_deconstruction_crowbar(I)) + return + + if(istype(I, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = I + if(!ismob(G.affecting)) + return + + if(!state_open) + user << "Open the scanner first." + return + + var/mob/M = G.affecting + M.loc = loc + user.stop_pulling() + qdel(G) + +/obj/machinery/dna_scannernew/attack_hand(mob/user) + if(..(user,1,0)) //don't set the machine, since there's no dialog + return + + toggle_open(user) + +/obj/machinery/dna_scannernew/blob_act() + if(prob(75)) + qdel(src) \ No newline at end of file diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 266da942cd9..f0194cc645d 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -259,6 +259,10 @@ /obj/machinery/door/proc/hasPower() return !(stat & NOPOWER) +/obj/machinery/door/proc/update_freelook_sight() + if(!glass && cameranet) + cameranet.updateVisibility(src, 0) + /obj/machinery/door/BlockSuperconductivity() // All non-glass airlocks block heat, this is intended. if(opacity || heat_proof) return 1 diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 6c073ceb95e..143d5d30029 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -124,9 +124,9 @@ var/mob/living/carbon/human/T = attached - if(!istype(T)) return - if(!T.dna) + if(!istype(T)) return + if(T.disabilities & NOCLONE) return diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 1cbf53376ea..4394c1f4140 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -180,7 +180,7 @@ areaindex[tmpname] = 1 L[tmpname] = R - for (var/obj/item/weapon/implant/tracking/I in world) + for (var/obj/item/weapon/implant/tracking/I in tracking_implants) if (!I.implanted || !ismob(I.loc)) continue else @@ -315,8 +315,8 @@ var/mob/living/carbon/human/human = M if(human.dna && human.dna.species.id == "human") M << "You hear a buzzing in your ears." - hardset_dna(human, null, null, null, null, /datum/species/fly) - human.regenerate_icons() + human.set_species(/datum/species/fly) + human.apply_effect((rand(120 - accurate * 40, 180 - accurate * 60)), IRRADIATE, 0) calibrated = 0 return diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm index 55b9d068630..c6a3a347726 100644 --- a/code/game/mecha/combat/honker.dm +++ b/code/game/mecha/combat/honker.dm @@ -45,7 +45,7 @@ HONK pressure: [cabin_pressure>WARNING_HIGH_PRESSURE ? "[cabin_pressure]": cabin_pressure]kPa
HONK temperature: [return_temperature()]°K|[return_temperature() - T0C]°C
Lights: [lights?"on":"off"]
- [src.dna?"DNA-locked:
[src.dna] \[Reset\]
":null] + [dna_lock?"DNA-locked:
[dna_lock] \[Reset\]
":null] "} return output diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 0225ac4ee3b..17d095f2911 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -34,7 +34,7 @@ var/last_message = 0 var/add_req_access = 1 var/maint_access = 0 - var/dna //dna-locking the mech + var/dna_lock//dna-locking the mech var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference var/datum/effect/effect/system/spark_spread/spark_system = new var/lights = 0 @@ -557,7 +557,7 @@ else if(AI.stat || !AI.client) user << "[AI.name] is currently unresponsive, and cannot be uploaded." return - else if(occupant || dna) //Normal AIs cannot steal mechs! + else if(occupant || dna_lock) //Normal AIs cannot steal mechs! user << "Access denied. [name] is [occupant ? "currently occupied" : "secured with a DNA lock"]." return AI.control_disabled = 0 @@ -653,10 +653,10 @@ log_append_to_last("Permission denied.") return var/passed - if(dna) - if(check_dna_integrity(user)) + if(dna_lock) + if(user.has_dna()) var/mob/living/carbon/C = user - if(C.dna.unique_enzymes==src.dna) + if(C.dna.unique_enzymes==dna_lock) passed = 1 else if(operation_allowed(user)) passed = 1 @@ -711,8 +711,8 @@ else if(occupant) user << "Occupant detected!" return 0 - else if(dna && dna!=mmi_as_oc.brainmob.dna.unique_enzymes) - user << "Stop it!" + else if(dna_lock && (!mmi_as_oc.brainmob.dna || dna_lock!=mmi_as_oc.brainmob.dna.unique_enzymes)) + user << "Access denied. [name] is secured with a DNA lock." return 0 visible_message("[user] starts to insert an MMI into [src.name].") diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 25ba30fde4a..8dc4dfde8c6 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -83,7 +83,7 @@ Airtank temperature: [tank_temperature]°K|[tank_temperature - T0C]°C
Cabin pressure: [cabin_pressure>WARNING_HIGH_PRESSURE ? "[cabin_pressure]": cabin_pressure]kPa
Cabin temperature: [return_temperature()]°K|[return_temperature() - T0C]°C
- [src.dna?"DNA-locked:
[src.dna] \[Reset\]
":null] + [dna_lock?"DNA-locked:
[dna_lock] \[Reset\]
":null] "} return output @@ -300,11 +300,11 @@ if(occupant && !iscarbon(occupant)) occupant << " You do not have any DNA!" return - dna = src.occupant.dna.unique_enzymes + dna_lock = occupant.dna.unique_enzymes occupant_message("You feel a prick as the needle takes your DNA sample.") if(href_list["reset_dna"]) - dna = null + dna_lock = null if(href_list["repair_int_control_lost"]) occupant_message("Recalibrating coordination system...") diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm index 7ab0d3a6363..002b5e1a4fa 100644 --- a/code/game/objects/effects/decals/Cleanable/robots.dm +++ b/code/game/objects/effects/decals/Cleanable/robots.dm @@ -20,7 +20,6 @@ sleep(3) if (i > 0) if (prob(40)) - /*var/obj/effect/decal/cleanable/oil/o =*/ new /obj/effect/decal/cleanable/oil/streak(src.loc) else if (prob(10)) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread @@ -36,10 +35,10 @@ random_icon_states = list("gibarm", "gibleg") /obj/effect/decal/cleanable/robot_debris/up - random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibup1","gibup1") //2:7 is close enough to 1:4 + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibup1","gibup1") /obj/effect/decal/cleanable/robot_debris/down - random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibdown1","gibdown1") //2:7 is close enough to 1:4 + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibdown1","gibdown1") /obj/effect/decal/cleanable/oil name = "motor oil" @@ -66,4 +65,4 @@ return ..() /obj/effect/decal/cleanable/oil/streak - random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5") \ No newline at end of file + random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5") diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index ea4ec6d60fd..5ed578fecdb 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -13,7 +13,14 @@ would spawn and follow the beaker, even if it is carried or thrown. unacidable = 1//So effect are not targeted by alien acid. pass_flags = PASSTABLE | PASSGRILLE +/obj/effect/effect/New() + ..() + if(ticker) + cameranet.updateVisibility(src) + /obj/effect/effect/Destroy() + if(ticker) + cameranet.updateVisibility(src) ..() return QDEL_HINT_PUTINPOOL /* diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 5535a288843..32be9434b76 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -12,6 +12,7 @@ var/global/list/obj/item/device/pda/PDAs = list() item_state = "electronic" w_class = 1 slot_flags = SLOT_ID | SLOT_BELT + origin_tech = "programming=2" //Main variables var/owner = null // String name of owner diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index 47110eda627..3514229bf13 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -14,6 +14,7 @@ item_state = "camera_bug" throw_speed = 4 throw_range = 20 + origin_tech = "syndicate=3;engineering=;1" var/obj/machinery/camera/current = null diff --git a/code/game/objects/items/devices/doorCharge.dm b/code/game/objects/items/devices/doorCharge.dm index 807ea292a8e..59b0a722f3c 100644 --- a/code/game/objects/items/devices/doorCharge.dm +++ b/code/game/objects/items/devices/doorCharge.dm @@ -9,6 +9,7 @@ force = 3 attack_verb = list("blown up", "exploded", "detonated") materials = list(MAT_METAL=50, MAT_GLASS=30) + origin_tech = "syndicate=3;combat=2," /obj/item/device/doorCharge/ex_act(severity, target) switch(severity) diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index ad8574211f8..6f90e2d9f92 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -80,7 +80,7 @@ return if(ishuman(user)) var/mob/living/carbon/human/H = user - if(H.dna && (H.dna.check_mutation(HULK) || NOGUNS in H.dna.species.specflags)) + if(H.dna.check_mutation(HULK) || NOGUNS in H.dna.species.specflags) user << "Your fingers can't press the button!" return diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index a80e0d4eb31..c9311f53a64 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -162,8 +162,7 @@ MASS SPECTROMETER // Species and body temperature if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.dna) - user << "Species: [H.dna.species.name]" + user << "Species: [H.dna.species.name]" user << "Body temperature: [round(M.bodytemperature-T0C,0.1)] °C ([round(M.bodytemperature*1.8-459.67,0.1)] °F)" // Time of death diff --git a/code/game/objects/items/holotape.dm b/code/game/objects/items/holotape.dm index 79014837674..d226f984bc9 100644 --- a/code/game/objects/items/holotape.dm +++ b/code/game/objects/items/holotape.dm @@ -11,6 +11,7 @@ var/tape_type = /obj/item/holotape var/icon_base var/charging = 0 + origin_tech = "materials=1;engineering=1" /obj/item/holotape icon = 'icons/obj/holotape.dmi' diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index e8e91caf7ac..66cbfef59cb 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -16,7 +16,6 @@ return 1 return 0 - /obj/item/borg/upgrade/reset name = "cyborg module reset board" desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the cyborg." @@ -197,7 +196,7 @@ R.module.rebuild() return 1 -/obj/item/borg/upgrade/syndicate/ +/obj/item/borg/upgrade/syndicate name = "illegal equipment module" desc = "Unlocks the hidden, deadlier functions of a cyborg" icon_state = "cyborg_upgrade3" @@ -211,3 +210,85 @@ R.SetEmagged(1) return 1 + +/obj/item/borg/upgrade/selfrepair + name = "self-repair module" + desc = "This module will repair the cyborg over time." + icon_state = "cyborg_upgrade5" + require_module = 1 + var/repair_amount = -1 + var/repair_tick = 1 + var/msg_cooldown = 0 + var/on = 0 + var/powercost = 10 + var/mob/living/silicon/robot/cyborg + +/obj/item/borg/upgrade/selfrepair/action(mob/living/silicon/robot/R) + if(..()) + return 0 + var/obj/item/borg/upgrade/selfrepair/U = locate() in R + if(U) + usr << "This unit is already equipped with a self-repair module." + return 0 + cyborg = R + icon_state = "selfrepair_off" + action_button_name = "Toggle Self-Repair" + return 1 + +/obj/item/borg/upgrade/selfrepair/ui_action_click() + on = !on + if(on) + cyborg << "You activate the self-repair module." + SSobj.processing |= src + else + cyborg << "You deactivate the self-repair module." + SSobj.processing -= src + update_icon() + +/obj/item/borg/upgrade/selfrepair/update_icon() + if(cyborg) + icon_state = "selfrepair_[on ? "on" : "off"]" + else + icon_state = "cyborg_upgrade5" + +/obj/item/borg/upgrade/selfrepair/proc/deactivate() + SSobj.processing -= src + on = 0 + update_icon() + +/obj/item/borg/upgrade/selfrepair/process() + if(!repair_tick) + repair_tick = 1 + return + + if( cyborg && (cyborg.stat != DEAD) && on) + if(cyborg.cell.charge < powercost*2) + cyborg << "Self-repair module deactivated. Please recharge." + deactivate() + return + + if(cyborg.health < cyborg.maxHealth) + if(cyborg.health < 0) + repair_amount = -2.5 + powercost = 30 + else + repair_amount = -1 + powercost = 10 + cyborg.adjustBruteLoss(repair_amount) + cyborg.adjustFireLoss(repair_amount) + cyborg.updatehealth() + cyborg.cell.use(powercost) + else + cyborg.cell.use(5) + repair_tick = 0 + + if( (world.time - 2000) > msg_cooldown ) + var/msgmode = "standby" + if(cyborg.health < 0) + msgmode = "critical" + else if(cyborg.health < cyborg.maxHealth) + msgmode = "normal" + cyborg << "Self-repair is active in [msgmode] mode." + msg_cooldown = world.time + else + deactivate() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 496654df1ae..4f3d9f59eb5 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -103,6 +103,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \ new/datum/stack_recipe("book case", /obj/structure/bookcase, 4, time = 15, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 15, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("dog bed", /obj/structure/stool/bed/dogbed, 10, time = 10, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("display case chassis", /obj/structure/displaycase_chassis, 5, one_per_turf = 1, on_floor = 1), \ ) /obj/item/stack/sheet/mineral/wood diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 9276fce55bc..28afa0a7bb8 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -17,7 +17,7 @@ /obj/item/weapon/dnainjector/proc/inject(mob/living/carbon/M, mob/user) - if(check_dna_integrity(M) && !(M.disabilities & NOCLONE)) + if(M.has_dna() && !(M.disabilities & NOCLONE)) if(M.stat == DEAD) //prevents dead people from having their DNA changed user << "You can't modify [M]'s DNA while \he's dead." return @@ -38,7 +38,7 @@ M.dna.blood_type = fields["blood_type"] if(fields["UI"]) //UI+UE M.dna.uni_identity = merge_text(M.dna.uni_identity, fields["UI"]) - updateappearance(M) + M.updateappearance(mutations_overlay_update=1) log_attack(log_msg) else user << "It appears that [M] does not have compatible DNA." diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 1522d73b8f5..a01bfb82ca1 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -87,6 +87,15 @@ origin_tech = "materials=2;magnets=2;programming=2;biotech=2" var/id = 1 + +/obj/item/weapon/implant/tracking/New() + ..() + tracking_implants += src + +/obj/item/weapon/implant/tracking/Destroy() + ..() + tracking_implants -= src + /obj/item/weapon/implant/tracking/get_data() var/dat = {"Implant Specifications:
Name: Tracking Beacon
diff --git a/code/game/objects/items/weapons/implants/implant_chem.dm b/code/game/objects/items/weapons/implants/implant_chem.dm index 6f85742039b..312363d6713 100644 --- a/code/game/objects/items/weapons/implants/implant_chem.dm +++ b/code/game/objects/items/weapons/implants/implant_chem.dm @@ -24,6 +24,14 @@ /obj/item/weapon/implant/chem/New() ..() create_reagents(50) + tracking_implants += src + +/obj/item/weapon/implant/chem/Destroy() + ..() + tracking_implants -= src + + + /obj/item/weapon/implant/chem/trigger(emote, mob/source) if(emote == "deathgasp") diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index 0bf17d4be30..da8ffa7cef0 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -78,7 +78,7 @@ Frequency: src.temp += "[W.code]-[dir2text(get_dir(sr, tr))]-[direct]
" src.temp += "Extranneous Signals:
" - for (var/obj/item/weapon/implant/tracking/W in world) + for (var/obj/item/weapon/implant/tracking/W in tracking_implants) if (!W.implanted || !ismob(W.loc)) continue else diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 3fd5b7cf096..e342de7ac9a 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -244,7 +244,7 @@ return 1 /obj/item/weapon/twohanded/dualsaber/wield(mob/living/carbon/M) //Specific wield () hulk checks due to reflection chance for balance issues and switches hitsounds. - if(istype(M)) + if(M.has_dna()) if(M.dna.check_mutation(HULK)) M << "You lack the grace to wield this!" return diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index c1c19582ec1..b4288121366 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -8,12 +8,16 @@ smooth_icon(src) smooth_icon_neighbors(src) icon_state = "" + if(ticker) + cameranet.updateVisibility(src) /obj/structure/blob_act() if(prob(50)) qdel(src) /obj/structure/Destroy() + if(ticker) + cameranet.updateVisibility(src) if(opacity) UpdateAffectingLights() if(smooth) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 148202d59e6..37f136b4618 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -1,22 +1,23 @@ /obj/structure/displaycase name = "display case" icon = 'icons/obj/stationobjs.dmi' - icon_state = "glassbox1" - desc = "A display case for prized possessions. Hooked up with an anti-theft system." + icon_state = "glassbox0" + desc = "A display case for prized possessions." density = 1 anchored = 1 unacidable = 1//Dissolving the case would also delete the gun. var/health = 30 - var/occupied = 1 var/destroyed = 0 + var/obj/item/showpiece = null + var/alert = 0 + var/open = 0 + var/obj/item/weapon/electronics/airlock/electronics /obj/structure/displaycase/ex_act(severity, target) switch(severity) if (1) new /obj/item/weapon/shard( src.loc ) - if (occupied) - new /obj/item/weapon/gun/energy/laser/captain( src.loc ) - occupied = 0 + dump() qdel(src) if (2) if (prob(50)) @@ -27,6 +28,13 @@ src.health -= 5 src.healthcheck() +/obj/structure/displaycase/examine(mob/user) + ..() + if(showpiece) + user << "There's [showpiece] inside." + if(alert) + user << "Hooked up with an anti-theft system." + /obj/structure/displaycase/bullet_act(obj/item/projectile/Proj) if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) @@ -35,16 +43,17 @@ src.healthcheck() return +/obj/structure/displaycase/proc/dump() + if (showpiece) + showpiece.loc = src.loc + showpiece = null /obj/structure/displaycase/blob_act() if (prob(75)) new /obj/item/weapon/shard( src.loc ) - if (occupied) - new /obj/item/weapon/gun/energy/laser/captain( src.loc ) - occupied = 0 + dump() qdel(src) - /obj/structure/displaycase/proc/healthcheck() if (src.health <= 0) if (!( src.destroyed )) @@ -55,27 +64,76 @@ update_icon() //Activate Anti-theft - var/area/alarmed = get_area(src) - alarmed.burglaralert(src) - playsound(src, "sound/effects/alert.ogg", 50, 1) + if(alert) + var/area/alarmed = get_area(src) + alarmed.burglaralert(src) + playsound(src, "sound/effects/alert.ogg", 50, 1) else playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) return -/obj/structure/displaycase/update_icon() - if(src.destroyed) - src.icon_state = "glassboxb[src.occupied]" +/obj/structure/displaycase/proc/is_directional(atom/A) + try + getFlatIcon(A,defdir=4) + catch + return 0 + return 1 +/obj/structure/displaycase/proc/get_flat_icon_directional(atom/A) + //Get flatIcon even if dir is mismatched for directionless icons + //SLOW + var/icon/I + if(is_directional(A)) + I = getFlatIcon(A) else - src.icon_state = "glassbox[src.occupied]" + var/old_dir = A.dir + A.dir = 2 + I = getFlatIcon(A) + A.dir = old_dir + return I + +/obj/structure/displaycase/update_icon() + var/icon/I + if(open) + I = icon('icons/obj/stationobjs.dmi',"glassbox_open") + else + I = icon('icons/obj/stationobjs.dmi',"glassbox0") + if(destroyed) + I = icon('icons/obj/stationobjs.dmi',"glassboxb0") + if(showpiece) + var/icon/S = get_flat_icon_directional(showpiece) + S.Scale(17,17) + I.Blend(S,ICON_UNDERLAY,8,8) + src.icon = I return - /obj/structure/displaycase/attackby(obj/item/weapon/W, mob/user, params) - user.changeNext_move(CLICK_CD_MELEE) - src.health -= W.force - src.healthcheck() - ..() + if(istype(W, /obj/item/weapon/card) && electronics && !destroyed && allowed(user)) + user << "You [open ? "close":"open"] the [src]" + open = !open + update_icon() + return + if(!alert && istype(W,/obj/item/weapon/crowbar)) + if(destroyed && !showpiece) + user << "You remove the destroyed case" + qdel(src) + return + user << "You start to [open ? "close":"open"] the [src]" + if(do_after(user, 20, target = src)) + user << "You [open ? "close":"open"] the [src]" + open = !open + update_icon() + else if(open) + if(user.unEquip(W)) + W.loc = src + showpiece = W + user << "You put [W] on display" + update_icon() + else + user.changeNext_move(CLICK_CD_MELEE) + src.health -= W.force + src.healthcheck() + ..() return /obj/structure/displaycase/attack_paw(mob/user) @@ -83,10 +141,9 @@ /obj/structure/displaycase/attack_hand(mob/user) user.changeNext_move(CLICK_CD_MELEE) - if (src.destroyed && src.occupied) - new /obj/item/weapon/gun/energy/laser/captain( src.loc ) + if (showpiece && (destroyed || open)) + dump() user << "You deactivate the hover field built into the case." - src.occupied = 0 src.add_fingerprint(user) update_icon() return @@ -98,3 +155,71 @@ return +/obj/structure/displaycase_chassis + anchored = 1 + density = 0 + name = "display case chassis" + desc = "wooden base of display case" + icon = 'icons/obj/stationobjs.dmi' + icon_state = "glassbox_chassis" + var/obj/item/weapon/electronics/airlock/electronics + + +/obj/structure/displaycase_chassis/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/wrench)) + user << "You start disassembling [src]..." + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + if(do_after(user, 30, target = src)) + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + new /obj/item/stack/sheet/mineral/wood(get_turf(src)) + qdel(src) + return + if(istype(I, /obj/item/weapon/electronics/airlock)) + user << "You start installing the electronics into [src]..." + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + if(user.unEquip(I) && do_after(user, 30, target = src)) + I.loc = src + electronics = I + user << "You install the airlock electronics." + return + if(istype(I, /obj/item/stack/sheet/glass)) + var/obj/item/stack/sheet/glass/G = I + if(G.get_amount() < 10) + user << "You need ten glass sheets to do this!" + return + user << "You start adding [G] to [src]..." + if(do_after(user, 20, target = src)) + G.use(10) + var/obj/structure/displaycase/display = new(src.loc) + if(electronics) + electronics.loc = display + display.electronics = electronics + if(electronics.use_one_access) + display.req_one_access = electronics.conf_access + else + display.req_access = electronics.conf_access + qdel(src) + return + return + + +/obj/structure/displaycase/captain + alert = 1 + +/obj/structure/displaycase/captain/New() + ..() + showpiece = new /obj/item/weapon/gun/energy/laser/captain (src) + update_icon() + +/obj/structure/displaycase/labcage + name = "lab cage" + desc = "A glass lab container for storing interesting creatures." + +/obj/structure/displaycase/labcage/New() + ..() + var/obj/item/clothing/mask/facehugger/A = new /obj/item/clothing/mask/facehugger(src) + A.sterile = 1 + A.name = "Lamarr" + showpiece = A + update_icon() + diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm deleted file mode 100644 index e1944e4d6bc..00000000000 --- a/code/game/objects/structures/lamarr_cage.dm +++ /dev/null @@ -1,91 +0,0 @@ -/obj/structure/lamarr - name = "lab cage" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "labcage1" - desc = "A glass lab container for storing interesting creatures." - density = 1 - anchored = 1 - unacidable = 1//Dissolving the case would also delete Lamarr - var/health = 30 - var/occupied = 1 - var/destroyed = 0 - -/obj/structure/lamarr/ex_act(severity, target) - switch(severity) - if (1) - new /obj/item/weapon/shard( src.loc ) - Break() - qdel(src) - if (2) - if (prob(50)) - src.health -= 15 - src.healthcheck() - if (3) - if (prob(50)) - src.health -= 5 - src.healthcheck() - - -/obj/structure/lamarr/bullet_act(obj/item/projectile/Proj) - health -= Proj.damage - ..() - src.healthcheck() - return - - -/obj/structure/lamarr/blob_act() - if (prob(75)) - new /obj/item/weapon/shard( src.loc ) - Break() - qdel(src) - - -/obj/structure/lamarr/proc/healthcheck() - if (src.health <= 0) - if (!( src.destroyed )) - src.density = 0 - src.destroyed = 1 - new /obj/item/weapon/shard( src.loc ) - playsound(src, "shatter", 70, 1) - Break() - else - playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) - return - -/obj/structure/lamarr/update_icon() - if(src.destroyed) - src.icon_state = "labcageb[src.occupied]" - else - src.icon_state = "labcage[src.occupied]" - return - - -/obj/structure/lamarr/attackby(obj/item/weapon/W, mob/user, params) - user.changeNext_move(CLICK_CD_MELEE) - src.health -= W.force - src.healthcheck() - ..() - return - -/obj/structure/lamarr/attack_paw(mob/user) - return src.attack_hand(user) - -/obj/structure/lamarr/attack_hand(mob/user) - user.changeNext_move(CLICK_CD_MELEE) - if (src.destroyed) - return - else - user.visible_message("[user] kicks the lab cage.", \ - "You kick the lab cage.") - src.health -= 2 - healthcheck() - return - -/obj/structure/lamarr/proc/Break() - if(occupied) - var/obj/item/clothing/mask/facehugger/A = new /obj/item/clothing/mask/facehugger( src.loc ) - A.sterile = 1 - A.name = "Lamarr" - occupied = 0 - update_icon() - return \ No newline at end of file diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index b0c939443c1..9c3f73faf40 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -148,16 +148,17 @@ var/racechoice = input(H, "What are we again?", "Race change") as null|anything in choosable_races newrace = species_list[racechoice] - if(!newrace || !H.dna) + if(!newrace) return - hardset_dna(H, null, null, null, null, newrace) + H.set_species(newrace, icon_update=0) if(H.dna.species.use_skintones) var/new_s_tone = input(user, "Choose your skin tone:", "Race change") as null|anything in skin_tones if(new_s_tone) H.skin_tone = new_s_tone + H.dna.update_ui_block(DNA_SKIN_TONE_BLOCK) if(MUTCOLORS in H.dna.species.specflags) var/new_mutantcolor = input(user, "Choose your skin color:", "Race change") as color|null @@ -170,7 +171,10 @@ else H << "Invalid color. Your color is not bright enough." - H.regenerate_icons() + H.update_body() + H.update_hair() + H.update_mutcolor() + H.update_mutations_overlay() // no hulk lizard if("gender") if(!(H.gender in list("male", "female"))) //blame the patriarchy @@ -180,12 +184,19 @@ if(alert(H, "Become a Witch?", "Confirmation", "Yes", "No") == "Yes") H.gender = "female" H << "Man, you feel like a woman!" - H.regenerate_icons() + else + return + else if(alert(H, "Become a Warlock?", "Confirmation", "Yes", "No") == "Yes") H.gender = "male" H << "Whoa man, you feel like a man!" - H.regenerate_icons() + else + return + H.dna.update_ui_block(DNA_GENDER_BLOCK) + H.update_body() + H.update_mutations_overlay() //(hulk male/female) + if("hair") var/hairchoice = alert(H, "Hair style or hair color?", "Change Hair", "Style", "Color") @@ -196,15 +207,17 @@ var/new_hair_color = input(H, "Choose your hair color", "Hair Color") as null|color if(new_hair_color) H.hair_color = sanitize_hexcolor(new_hair_color) + H.dna.update_ui_block(DNA_HAIR_COLOR_BLOCK) if(H.gender == "male") var/new_face_color = input(H, "Choose your facial hair color", "Hair Color") as null|color if(new_face_color) H.facial_hair_color = sanitize_hexcolor(new_face_color) - + H.dna.update_ui_block(DNA_FACIAL_HAIR_COLOR_BLOCK) H.update_hair() if("eyes") var/new_eye_color = input(H, "Choose your eye color", "Eye Color") as null|color if(new_eye_color) H.eye_color = sanitize_hexcolor(new_eye_color) + H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK) H.update_body() \ No newline at end of file diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 7ab497abae8..afc9f6d8e84 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -9,11 +9,7 @@ var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to -/turf/simulated/New() - ..() - levelupdate() - if(smooth) - smooth_icon(src) + /turf/simulated/proc/burn_tile() diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm index a2cf14b52d9..0e87a2adf62 100644 --- a/code/game/turfs/simulated/walls_misc.dm +++ b/code/game/turfs/simulated/walls_misc.dm @@ -9,7 +9,7 @@ /turf/simulated/wall/cult/break_wall() new /obj/effect/decal/cleanable/blood(src) - new /obj/structure/cultgirder(src) + return (new /obj/structure/cultgirder(src)) /turf/simulated/wall/cult/devastate_wall() new /obj/effect/decal/cleanable/blood(src) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 5e55761ef56..f3d04c5626b 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -26,11 +26,13 @@ flags = 0 + var/image/obscured //camerachunks + /turf/New() ..() for(var/atom/movable/AM in src) Entered(AM) - return + /turf/Destroy() return QDEL_HINT_HARDDEL_NOW @@ -196,6 +198,10 @@ flags |= NOJAUNT /turf/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user) + if(src_object.contents.len) + usr << "You start dumping out the contents..." + if(!do_after(usr,20,target=src_object)) + return 0 for(var/obj/item/I in src_object) if(user.s_active != src_object) if(I.on_found(user)) @@ -281,6 +287,9 @@ /turf/proc/can_lay_cable() return can_have_cabling() & !intact +/turf/proc/visibilityChanged() + if(ticker) + cameranet.updateVisibility(src) /turf/indestructible name = "wall" diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index 2861e298a53..86eb11de26f 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -220,7 +220,7 @@ var/dat = "Showing DNA from blood.
" dat += "" for(var/mob/living/carbon/human/H in mob_list) - if(H.dna && H.ckey) + if(H.ckey) dat += "" dat += "
NameDNABlood Type
[H][H.dna.unique_enzymes][H.dna.blood_type]
" usr << browse(dat, "window=DNA;size=440x410") @@ -231,12 +231,7 @@ dat += "" for(var/mob/living/carbon/human/H in mob_list) if(H.ckey) - if(H.dna && H.dna.uni_identity) - dat += "" - else if(H.dna && !H.dna.uni_identity) - dat += "" - else if(!H.dna) - dat += "" + dat += "" dat += "
NameFingerprints
[H][md5(H.dna.uni_identity)]
[H]H.dna.uni_identity = null
[H]H.dna = null
[H][md5(H.dna.uni_identity)]
" usr << browse(dat, "window=fingerprints;size=440x410") @@ -259,8 +254,7 @@ message_admins("\blue [key_name_admin(usr)] turned all humans into [result]") var/newtype = species_list[result] for(var/mob/living/carbon/human/H in mob_list) - hardset_dna(H, null, null, null, null, newtype) - H.regenerate_icons() + H.set_species(newtype) if("corgi") if(!check_rights(R_FUN)) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index d1275930c8c..d832c960d13 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1527,7 +1527,6 @@ var/client/C = usr.client if(!isobserver(usr)) C.admin_ghost() var/mob/dead/observer/A = C.mob - sleep(2) A.ManualFollow(M) log_admin("[key_name(usr)] followed [key_name(M)]") message_admins("[key_name_admin(usr)] followed [key_name_admin(M)]") diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 19cc6dd5667..00a51054c80 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -26,7 +26,7 @@ for (var/mob/M in player_list) if (istype(M, /mob/new_player)) continue - if (M.stat == DEAD || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above + if (M.stat == DEAD || istype(M, /mob/living/simple_animal/revenant) || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above M.show_message(rendered, 2) feedback_add_details("admin_verb","D") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 03d01a2cf24..198dbff5c2e 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -232,7 +232,7 @@ /datum/admins/proc/makeNukeTeam() var/datum/game_mode/nuclear/temp = new - var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for a nuke team being sent in?", "operative", temp) + var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered for a nuke team being sent in?", "operative", temp) var/list/mob/dead/observer/chosen = list() var/mob/dead/observer/theghost = null @@ -306,7 +306,7 @@ // DEATH SQUADS /datum/admins/proc/makeDeathsquad() var/mission = input("Assign a mission to the deathsquad", "Assign Mission", "Leave no witnesses.") - var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for an elite Nanotrasen Strike Team?", "deathsquad", null) + var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered for an elite Nanotrasen Strike Team?", "deathsquad", null) var/squadSpawned = 0 if(candidates.len >= 2) //Minimum 2 to be considered a squad @@ -326,13 +326,13 @@ //Spawn and equip the commando var/mob/living/carbon/human/Commando = new(spawnloc) chosen_candidate.client.prefs.copy_to(Commando) - ready_dna(Commando) if(numagents == 1) //If Squad Leader Commando.real_name = "Officer [pick(commando_names)]" Commando.equipOutfit(/datum/outfit/death_commando/officer) else Commando.real_name = "Trooper [pick(commando_names)]" Commando.equipOutfit(/datum/outfit/death_commando) + Commando.dna.update_dna_identity() Commando.key = chosen_candidate.key Commando.mind.assigned_role = "Death Commando" for(var/obj/machinery/door/poddoor/ert/door in airlocks) @@ -412,7 +412,7 @@ /datum/admins/proc/makeOfficial() var/mission = input("Assign a task for the official", "Assign Task", "Conduct a routine preformance review of [station_name()] and its Captain.") - var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered to be a Centcom Official?", "pAI") + var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered to be a Centcom Official?", "pAI") if(candidates.len) var/mob/dead/observer/chosen_candidate = pick(candidates) @@ -420,8 +420,8 @@ //Create the official var/mob/living/carbon/human/newmob = new (pick(emergencyresponseteamspawn)) chosen_candidate.client.prefs.copy_to(newmob) - ready_dna(newmob) newmob.real_name = newmob.dna.species.random_name(newmob.gender,1) + newmob.dna.update_dna_identity() newmob.key = chosen_candidate.key newmob.mind.assigned_role = "Centcom Official" newmob.equipOutfit(/datum/outfit/centcom_official) @@ -465,7 +465,7 @@ return makeOfficial() var/teamsize = min(7,input("Maximum size of team? (7 max)", "Select Team Size",4) as null|num) var/mission = input("Assign a mission to the Emergency Response Team", "Assign Mission", "Assist the station.") - var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for a Code [alert] Nanotrasen Emergency Response Team?", "deathsquad", null) + var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered for a Code [alert] Nanotrasen Emergency Response Team?", "deathsquad", null) var/teamSpawned = 0 if(candidates.len > 0) @@ -490,7 +490,6 @@ var/mob/living/carbon/human/ERTOperative = new(spawnloc) var/list/lastname = last_names chosen_candidate.client.prefs.copy_to(ERTOperative) - ready_dna(ERTOperative) var/ertname = pick(lastname) switch(numagents) if(1) @@ -514,6 +513,7 @@ if(7) ERTOperative.real_name = "Engineer [ertname]" ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/engineer/alert : /datum/outfit/ert/engineer) + ERTOperative.dna.update_dna_identity() ERTOperative.key = chosen_candidate.key ERTOperative.mind.assigned_role = "ERT" @@ -558,50 +558,11 @@ //Abductors /datum/admins/proc/makeAbductorTeam() - var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for an Abductor Team?", "abductor", null) - - if(candidates.len >= 2) - //Oh god why we can't have static functions - var/number = ticker.mode.abductor_teams + 1 - - var/datum/game_mode/abduction/temp - if(ticker.mode.config_tag == "abduction") - temp = ticker.mode - else - temp = new - - var/agent_mind = pick(candidates) - candidates -= agent_mind - var/scientist_mind = pick(candidates) - - var/mob/living/carbon/human/agent=makeBody(agent_mind) - var/mob/living/carbon/human/scientist=makeBody(scientist_mind) - - agent_mind = agent.mind - scientist_mind = scientist.mind - - temp.scientists.len = number - temp.agents.len = number - temp.abductors.len = 2*number - temp.team_objectives.len = number - temp.team_names.len = number - temp.scientists[number] = scientist_mind - temp.agents[number] = agent_mind - temp.abductors |= list(agent_mind,scientist_mind) - temp.make_abductor_team(number,preset_scientist=scientist_mind,preset_agent=agent_mind) - temp.post_setup_team(number) - - ticker.mode.abductor_teams++ - - if(ticker.mode.config_tag != "abduction") - ticker.mode.abductors |= temp.abductors - - return 1 - else - return + new /datum/round_event/abductor + return 1 /datum/admins/proc/makeRevenant() - var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for becoming a revenant?", "revenant", null) + var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered for becoming a revenant?", "revenant", null) if(candidates.len >= 1) var/spook_op = pick(candidates) var/mob/dead/observer/O = spook_op @@ -643,54 +604,3 @@ candidates.Remove(H) return 1 return 0 - -/datum/admins/proc/getCandidates(var/Question, var/jobbanType, var/datum/game_mode/gametypeCheck) - var/list/mob/dead/observer/candidates = list() - var/time_passed = world.time - if (!Question) - Question = "Would you like to be a special role?" - - for(var/mob/dead/observer/G in player_list) - if(!G.key || !G.client) - continue - if (gametypeCheck) - if(!gametypeCheck.age_check(G.client)) - continue - if (jobbanType) - if(jobban_isbanned(G, jobbanType) || jobban_isbanned(G, "Syndicate")) - continue - spawn(0) - G << 'sound/misc/notice2.ogg' //Alerting them to their consideration - switch(alert(G,Question,"Please answer in 30 seconds!","Yes","No")) - if("Yes") - G << "Choice registered: Yes." - if((world.time-time_passed)>300)//If more than 30 game seconds passed. - G << "Sorry, you were too late for the consideration!" - G << 'sound/machines/buzz-sigh.ogg' - return - candidates += G - if("No") - G << "Choice registered: No." - return - else - return - sleep(300) - - //Check all our candidates, to make sure they didn't log off during the 30 second wait period. - for(var/mob/dead/observer/G in candidates) - if(!G.key || !G.client) - candidates.Remove(G) - - return candidates - -/datum/admins/proc/makeBody(mob/dead/observer/G_found) // Uses stripped down and bastardized code from respawn character - if(!G_found || !G_found.key) return - - //First we spawn a dude. - var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned. - - G_found.client.prefs.copy_to(new_character) - ready_dna(new_character) - new_character.key = G_found.key - - return new_character diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 7cb4c9f4994..6e314d19ee0 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -300,15 +300,13 @@ Traitors and the like can also be revived with the previous role mostly intact. new_character.real_name = record_found.fields["name"] new_character.gender = record_found.fields["sex"] new_character.age = record_found.fields["age"] - new_character.dna.blood_type = record_found.fields["blood_type"] + new_character.hardset_dna(record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], record_found.fields["blood_type"], record_found.fields["species"], record_found.fields["features"]) else - new_character.gender = pick(MALE,FEMALE) var/datum/preferences/A = new() - A.real_name = G_found.real_name A.copy_to(new_character) + A.real_name = G_found.real_name + new_character.dna.update_dna_identity() - if(!new_character.real_name) - new_character.real_name = new_character.dna.species.random_name(new_character.gender,1) new_character.name = new_character.real_name if(G_found.mind && !G_found.mind.active) @@ -316,13 +314,8 @@ Traitors and the like can also be revived with the previous role mostly intact. new_character.mind.special_verbs = list() else new_character.mind_initialize() - if(!new_character.mind.assigned_role) new_character.mind.assigned_role = "Assistant"//If they somehow got a null assigned role. - - //DNA - if(record_found)//Pull up their name from database records if they did have a mind. - hardset_dna(new_character, record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], record_found.fields["blood_type"], record_found.fields["species"], record_found.fields["features"]) - else//If they have no records, we just do a random DNA for them, based on their random appearance/savefile. - ready_dna(new_character) + if(!new_character.mind.assigned_role) + new_character.mind.assigned_role = "Assistant"//If they somehow got a null assigned role. new_character.key = G_found.key @@ -822,7 +815,7 @@ var/list/datum/outfit/custom_outfits = list() //Admin created outfits id_select += "" id_select += "" - var/dat = {" + var/dat = {" Create Outfit
diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 27f5a61aefb..5ecd4d5e558 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -40,7 +40,7 @@ var/turf/T = get_turf(src) T.visible_message("[src] emits a blinding light!") for(var/mob/living/carbon/M in viewers(3, null)) - flash_carbon(M, null, 2, 0) + flash_carbon(M, null, 5, 0) /obj/item/device/assembly/flash/proc/burn_out() //Made so you can override it if you want to have an invincible flash from R&D or something. @@ -79,7 +79,7 @@ return 1 -/obj/item/device/assembly/flash/proc/flash_carbon(mob/living/carbon/M, mob/user = null, power = 5, targeted = 1) +/obj/item/device/assembly/flash/proc/flash_carbon(mob/living/carbon/M, mob/user = null, power = 15, targeted = 1) add_logs(user, M, "flashed", src) if(user && targeted) if(M.weakeyes) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 89e24aa3672..af2f1680f6c 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -1,3 +1,5 @@ +var/obj/machinery/gateway/centerstation/the_gateway = null + /obj/machinery/gateway name = "gateway" desc = "A mysterious gateway built by unknown hands, it allows for faster than light travel to far-flung locations." @@ -9,6 +11,18 @@ var/active = 0 +/obj/machinery/gateway/centerstation/New() + ..() + if(!the_gateway) + the_gateway = src + + +/obj/machinery/gateway/centerstation/Destroy() + if(the_gateway == src) + the_gateway = null + ..() + + /obj/machinery/gateway/initialize() update_icon() if(dir == 2) diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 450d153a94f..54b0a0953c2 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -80,20 +80,17 @@ user.dna.add_mutation(LASEREYES) user.dna.add_mutation(COLDRES) user.dna.add_mutation(XRAY) - hardset_dna(user, null, null, null, null, /datum/species/shadow) - user.regenerate_icons() + user.set_species(/datum/species/shadow) if("Wealth") user << "Your wish is granted, but at a terrible cost..." user << "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart." new /obj/structure/closet/syndicate/resources/everything(loc) - hardset_dna(user, null, null, null, null, /datum/species/shadow) - user.regenerate_icons() + user.set_species(/datum/species/shadow) if("Immortality") user << "Your wish is granted, but at a terrible cost..." user << "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart." user.verbs += /mob/living/carbon/proc/immortality - hardset_dna(user, null, null, null, null, /datum/species/shadow) - user.regenerate_icons() + user.set_species(/datum/species/shadow) if("To Kill") user << "Your wish is granted, but at a terrible cost..." user << "The Wish Granter punishes you for your wickedness, claiming your soul and warping your body to match the darkness in your heart." @@ -107,8 +104,7 @@ for(var/datum/objective/OBJ in user.mind.objectives) user << "Objective #[obj_count]: [OBJ.explanation_text]" obj_count++ - hardset_dna(user, null, null, null, null, /datum/species/shadow) - user.regenerate_icons() + user.set_species(/datum/species/shadow) if("Peace") user << "Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence." user << "You feel as if you just narrowly avoided a terrible fate..." diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 24fe636eeff..95cd0a176d4 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1049,7 +1049,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set ShowChoices(user) return 1 -/datum/preferences/proc/copy_to(mob/living/carbon/human/character) +/datum/preferences/proc/copy_to(mob/living/carbon/human/character, icon_updates = 1) if(be_random_name) real_name = pref_species.random_name(gender) @@ -1081,19 +1081,19 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set character.undershirt = undershirt character.socks = socks - character.features = features - character.backbag = backbag - if(character.dna) - var/datum/species/chosen_species - - character.dna.real_name = character.real_name - if(pref_species != /datum/species/human && config.mutant_races) - chosen_species = pref_species.type - else - chosen_species = /datum/species/human - hardset_dna(character, null, null, null, blood_type, chosen_species, features) + character.dna.blood_type = blood_type + character.dna.features = features + character.dna.real_name = character.real_name + var/datum/species/chosen_species + if(pref_species != /datum/species/human && config.mutant_races) + chosen_species = pref_species.type else + chosen_species = /datum/species/human + character.set_species(chosen_species, icon_update=0) + + if(icon_updates) character.update_body() - character.update_hair() \ No newline at end of file + character.update_hair() + character.update_mutcolor() \ No newline at end of file diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 7759f4bd7e6..c42f252bc26 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -9,6 +9,7 @@ strip_delay = 70 put_on_delay = 70 burn_state = -1 //Won't burn in fires + origin_tech = "magnets=2" /obj/item/clothing/shoes/magboots/verb/toggle() set name = "Toggle Magboots" @@ -52,3 +53,4 @@ name = "blood-red magboots" icon_state = "syndiemag0" magboot_state = "syndiemag" + origin_tech = "magnets=2,syndicate=3" diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm index 9d4981c9e80..fa324c1886c 100644 --- a/code/modules/detectivework/detective_work.dm +++ b/code/modules/detectivework/detective_work.dm @@ -52,21 +52,19 @@ if(isnull(M.key)) return if(ishuman(M)) var/mob/living/carbon/human/H = M - if(!istype(H.dna, /datum/dna)) - return 0 if(H.gloves) if(fingerprintslast != H.ckey) - fingerprintshidden += text("\[[time_stamp()]\] (Wearing gloves). Real name: [], Key: []",H.real_name, H.key) + fingerprintshidden += "\[[time_stamp()]\] (Wearing gloves). Real name: [H.real_name], Key: [H.key]" fingerprintslast = H.ckey return 0 - if(!( fingerprints )) + if(!fingerprints) if(fingerprintslast != H.ckey) - fingerprintshidden += text("\[[time_stamp()]\] Real name: [], Key: []",H.real_name, H.key) + fingerprintshidden += "\[[time_stamp()]\] Real name: [H.real_name], Key: [H.key]" fingerprintslast = H.ckey return 1 else if(fingerprintslast != M.ckey) - fingerprintshidden += text("\[[time_stamp()]\] Real name: [], Key: []",M.real_name, M.key) + fingerprintshidden += "\[[time_stamp()]\] Real name: [M.real_name], Key: [M.key]" fingerprintslast = M.ckey return @@ -75,17 +73,15 @@ if(isnull(M)) return if(isnull(M.key)) return if(ishuman(M)) + var/mob/living/carbon/human/H = M //Add the list if it does not exist. if(!fingerprintshidden) fingerprintshidden = list() //Fibers~ - add_fibers(M) + add_fibers(H) //Now, lets get to the dirty work. - //First, make sure their DNA makes sense. - var/mob/living/carbon/human/H = M - check_dna_integrity(H) //sets up dna and its variables if it was missing somehow //Check if the gloves (if any) hide fingerprints if(H.gloves) diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index a35fe5de224..01a41abc9fd 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -12,6 +12,7 @@ slot_flags = SLOT_BELT var/scanning = 0 var/list/log = list() + origin_tech = "engineering=3;biotech=2" /obj/item/device/detective_scanner/attack_self(mob/user) if(log.len && !scanning) @@ -82,7 +83,7 @@ if(ishuman(A)) var/mob/living/carbon/human/H = A - if (istype(H.dna, /datum/dna) && !H.gloves) + if(!H.gloves) fingerprints += md5(H.dna.uni_identity) else if(!ismob(A)) diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm new file mode 100644 index 00000000000..3a4aacbb116 --- /dev/null +++ b/code/modules/events/abductor.dm @@ -0,0 +1,61 @@ +/datum/round_event_control/abductor + name = "Abductors" + typepath = /datum/round_event/abductor + weight = 5 + max_occurrences = 1 + + earliest_start = 180000 // 30 min + + gamemode_blacklist = list("nuclear","wizard","revolution","abduction") + +/datum/round_event/abductor + +/datum/round_event/abductor/start() + //spawn abductor team + if(!makeAbductorTeam()) + message_admins("Abductor event failed to find players. Retrying in 30s.") + spawn(30) + makeAbductorTeam() + +/datum/round_event/abductor/proc/makeAbductorTeam() + var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered for an Abductor Team?", "abductor", null) + + if(candidates.len >= 2) + //Oh god why we can't have static functions + var/number = ticker.mode.abductor_teams + 1 + + var/datum/game_mode/abduction/temp + if(ticker.mode.config_tag == "abduction") + temp = ticker.mode + else + temp = new + + var/agent_mind = pick(candidates) + candidates -= agent_mind + var/scientist_mind = pick(candidates) + + var/mob/living/carbon/human/agent=makeBody(agent_mind) + var/mob/living/carbon/human/scientist=makeBody(scientist_mind) + + agent_mind = agent.mind + scientist_mind = scientist.mind + + temp.scientists.len = number + temp.agents.len = number + temp.abductors.len = 2*number + temp.team_objectives.len = number + temp.team_names.len = number + temp.scientists[number] = scientist_mind + temp.agents[number] = agent_mind + temp.abductors |= list(agent_mind,scientist_mind) + temp.make_abductor_team(number,preset_scientist=scientist_mind,preset_agent=agent_mind) + temp.post_setup_team(number) + + ticker.mode.abductor_teams++ + + if(ticker.mode.config_tag != "abduction") + ticker.mode.abductors |= temp.abductors + + return 1 + else + return 0 \ No newline at end of file diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index c678bdab8dc..323908775fe 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -6,6 +6,8 @@ earliest_start = 48000 // 1 hour 20 minutes + gamemode_blacklist = list("blob") // Just in case blob survives that long + /datum/round_event/blob announceWhen = 12 endWhen = 120 diff --git a/code/modules/events/event.dm b/code/modules/events/event.dm index 07dbff7d269..6d555cc8448 100644 --- a/code/modules/events/event.dm +++ b/code/modules/events/event.dm @@ -20,6 +20,9 @@ var/alertadmins = 1 //should we let the admins know this event is firing //should be disabled on events that fire a lot + var/gamemode_blacklist = list() // Event won't happen in these gamemodes + var/gamemode_whitelist = list() // Event will happen ONLY in these gamemodes if not empty + /datum/round_event_control/wizard wizardevent = 1 diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index a08a507a907..107c8f10920 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -11,11 +11,10 @@ for(var/mob/living/carbon/human/H in mob_list) var/obj/item/weapon/storage/backpack/b = locate() in H.contents new /obj/item/weapon/storage/spooky(b) - if(H.dna) - if(prob(50)) - hardset_dna(H, null, null, null, null, /datum/species/skeleton) - else - hardset_dna(H, null, null, null, null, /datum/species/zombie) + if(prob(50)) + H.set_species(/datum/species/skeleton) + else + H.set_species(/datum/species/zombie) for(var/mob/living/simple_animal/pet/dog/corgi/Ian/Ian in mob_list) Ian.place_on_head(new /obj/item/weapon/bedsheet(Ian)) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index f86ecdb5c42..c83ea419df4 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -43,10 +43,9 @@ if(prob(25)) if(prob(75)) randmutb(H) - domutcheck(H, null, 1) else randmutg(H) - domutcheck(H, null, 1) + H.domutcheck() else if(istype(C, /mob/living/carbon/monkey)) var/mob/living/carbon/monkey/M = C diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm index cda6dc2d41f..9a155830455 100644 --- a/code/modules/events/wizard/imposter.dm +++ b/code/modules/events/wizard/imposter.dm @@ -17,13 +17,11 @@ PoolOrNew(/obj/effect/effect/smoke, W.loc) var/mob/living/carbon/human/I = new /mob/living/carbon/human(W.loc) - I.real_name = W.real_name - I.dna.unique_enzymes = W.dna.unique_enzymes - I.name = W.real_name - I.dna.blood_type = W.dna.blood_type - I.dna.uni_identity = W.dna.uni_identity - I.dna.struc_enzymes = W.dna.struc_enzymes - updateappearance(I) + W.dna.transfer_identity(I, transfer_SE=1) + I.real_name = I.dna.real_name + I.name = I.dna.real_name + I.updateappearance(mutcolor_update=1) + I.domutcheck() if(W.ears) I.equip_to_slot_or_del(new W.ears.type, slot_ears) if(W.w_uniform) I.equip_to_slot_or_del(new W.w_uniform.type , slot_w_uniform) if(W.shoes) I.equip_to_slot_or_del(new W.shoes.type, slot_shoes) diff --git a/code/modules/events/wizard/race.dm b/code/modules/events/wizard/race.dm index 54c3cbf6877..7bbee2ba98c 100644 --- a/code/modules/events/wizard/race.dm +++ b/code/modules/events/wizard/race.dm @@ -21,10 +21,9 @@ all_the_same = 1 for(var/mob/living/carbon/human/H in mob_list) //yes, even the dead - if(H.dna) - hardset_dna(H, null, null, null, null, new_species) - H.real_name = new_species.random_name(H.gender,1) - H.regenerate_icons() - H << "You feel somehow... different?" + H.set_species(new_species) + H.real_name = new_species.random_name(H.gender,1) + H.dna.unique_enzymes = H.dna.generate_unique_enzymes() + H << "You feel somehow... different?" if(!all_the_same) new_species = pick(all_species) diff --git a/code/modules/food&drinks/kitchen machinery/processor.dm b/code/modules/food&drinks/kitchen machinery/processor.dm index 431dee34309..5db38bbc970 100644 --- a/code/modules/food&drinks/kitchen machinery/processor.dm +++ b/code/modules/food&drinks/kitchen machinery/processor.dm @@ -112,8 +112,8 @@ for(var/datum/disease/D in O.viruses) if(!(D.spread_flags & SPECIAL)) B.data["viruses"] += D.Copy() - if(check_dna_integrity(O)) - B.data["blood_DNA"] = copytext(O.dna.unique_enzymes,1,0) + if(O.has_dna()) + B.data["blood_DNA"] = O.dna.unique_enzymes if(O.resistances&&O.resistances.len) B.data["resistances"] = O.resistances.Copy() diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index a0d3d291abb..082ed238267 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -230,9 +230,9 @@ if (mutmod == 2) if(prob(50)) //50% mutate() - else if(prob(75)) //37.5% + else if(prob(50)) //25% hardmutate() - else if(prob(10)) //1/80 + else if(prob(50)) //12.5% mutatespecie() return return @@ -897,7 +897,7 @@ podman.faction |= factions if(!features["mcolor"]) features["mcolor"] = "#59CE00" - hardset_dna(podman,null,null,podman.real_name,blood_type,/datum/species/plant/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman + podman.hardset_dna(null,null,podman.real_name,blood_type,/datum/species/plant/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman podman.set_cloned_appearance() else //else, one packet of seeds. maybe two diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index fe33b1317b1..99a467ba8f0 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -507,6 +507,7 @@ var/fieldsactive = 0 var/burst_time = 50 var/fieldlimit = 3 + origin_tech = "magnets=2;combat=2" /obj/item/weapon/resonator/proc/CreateResonance(target, creator) var/turf/T = get_turf(target) @@ -724,6 +725,7 @@ throw_range = 5 var/loaded = 1 var/malfunctioning = 0 + origin_tech = "biotech=4" /obj/item/weapon/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag) if(!loaded) @@ -778,6 +780,7 @@ flags = CONDUCT slot_flags = SLOT_BELT var/cooldown = 0 + origin_tech = "engineering=1;magnets=1" /obj/item/device/mining_scanner/attack_self(mob/user) if(!user.client) @@ -809,6 +812,7 @@ flags = CONDUCT slot_flags = SLOT_BELT var/cooldown = 0 + origin_tech = "engineering=3;magnets=3" /obj/item/device/t_scanner/adv_mining_scanner/scan() if(!cooldown) diff --git a/code/modules/mob/interactive.dm b/code/modules/mob/interactive.dm index 0660e8e4f99..3c24e017066 100644 --- a/code/modules/mob/interactive.dm +++ b/code/modules/mob/interactive.dm @@ -86,22 +86,14 @@ /mob/living/carbon/human/interactive/proc/random() //this is here because this has no client/prefs/brain whatever. - underwear = random_underwear(gender) - skin_tone = random_skin_tone() - hair_style = random_hair_style(gender) - facial_hair_style = random_facial_hair_style(gender) - hair_color = random_short_color() - facial_hair_color = hair_color - eye_color = "blue" age = rand(AGE_MIN,AGE_MAX) - ready_dna(src,random_blood_type()) //job handling var/list/jobs = SSjob.occupations for(var/datum/job/J in jobs) if(J.title == "Cyborg" || J.title == "AI" || J.title == "Chaplain" || J.title == "Mime") jobs -= J myjob = pick(jobs) - src.job = myjob.title + job = myjob.title if(!graytide) myjob.equip(src) myjob.apply_fingerprints(src) @@ -120,25 +112,18 @@ /mob/living/carbon/human/interactive/New() ..() - gender = pick(MALE,FEMALE) - if(gender == MALE) - name = "[pick(first_names_male)] [pick(last_names)]" - real_name = name - else - name = "[pick(first_names_female)] [pick(last_names)]" - real_name = name random() MYID = new(src) MYID.name = "[src.real_name]'s ID Card ([myjob.title])" MYID.assignment = "[myjob.title]" MYID.registered_name = src.real_name MYID.access = myjob.access - src.equip_to_slot_or_del(MYID, slot_wear_id) + equip_to_slot_or_del(MYID, slot_wear_id) MYPDA = new(src) - MYPDA.owner = src.real_name + MYPDA.owner = real_name MYPDA.ownjob = "Crew" - MYPDA.name = "PDA-[src.real_name] ([myjob.title])" - src.equip_to_slot_or_del(MYPDA, slot_belt) + MYPDA.name = "PDA-[real_name] ([myjob.title])" + equip_to_slot_or_del(MYPDA, slot_belt) zone_sel = new /obj/screen/zone_sel() zone_sel.selecting = "chest" if(prob(10)) //my x is augmented @@ -371,9 +356,7 @@ if(!l_hand || !r_hand) var/obj/item/clothing/C = TARGET take_to_slot(C) - if(equip_to_appropriate_slot(C)) - C.update_icon() - else + if(!equip_to_appropriate_slot(C)) var/obj/item/I = get_item_by_slot(C) unEquip(I) equip_to_appropriate_slot(C) @@ -384,7 +367,6 @@ equip_to_appropriate_slot(MYPDA) if(MYID in src.loc) equip_to_appropriate_slot(MYID) - update_icons() //THIEVING SKILLS END //-------------TOUCH ME if(istype(TARGET,/obj/structure)) diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index 3f7bfba90cf..38c89f9a3c9 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -31,11 +31,23 @@ obj/effect/dummy/slaughter/relaymove(mob/user, direction) /mob/living/proc/phaseout(obj/effect/decal/cleanable/B) + if(iscarbon(src)) + var/mob/living/carbon/C = src + if(C.l_hand || C.r_hand) + C << "You may not hold items while blood crawling!" + return 0 + var/obj/item/weapon/bloodcrawl/B1 = new(C) + var/obj/item/weapon/bloodcrawl/B2 = new(C) + B1.icon_state = "bloodhand_left" + B2.icon_state = "bloodhand_right" + C.put_in_hands(B1) + C.put_in_hands(B2) + C.regenerate_icons() var/mob/living/kidnapped = null var/turf/mobloc = get_turf(src.loc) src.notransform = TRUE spawn(0) - src.visible_message("[src] sinks into the pool of blood.") + src.visible_message("[src] sinks into the pool of blood!") playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1) var/obj/effect/dummy/slaughter/holder = PoolOrNew(/obj/effect/dummy/slaughter,mobloc) src.ExtinguishMob() @@ -45,42 +57,71 @@ obj/effect/dummy/slaughter/relaymove(mob/user, direction) if(istype(src.pulling, /mob/living)) var/mob/living/victim = src.pulling if(victim.stat == CONSCIOUS) - src.visible_message("[victim] kicks free of the [src] at the last second!") + src.visible_message("[victim] kicks free of the blood pool just before entering it!") else victim.loc = holder - src.visible_message("The [src] drags [victim] into the pool of blood!") + victim.emote("scream") + src.visible_message("[src] drags [victim] into the pool of blood!") kidnapped = victim src.loc = holder src.holder = holder if(kidnapped) - src << "You begin to feast on [kidnapped]. You can not move while you are doing this." - playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1) - sleep(30) - playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1) - sleep(30) - playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1) - sleep(30) + src << "You begin to feast on [kidnapped]. You can not move while you are doing this." + for(var/i = 3; i > 0; i--) + playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1) + sleep(30) if(kidnapped) - src << "You devour [kidnapped]. Your health is fully restored." + src << "You devour [kidnapped]. Your health is fully restored." src.adjustBruteLoss(-1000) src.adjustFireLoss(-1000) src.adjustOxyLoss(-1000) src.adjustToxLoss(-1000) - kidnapped.ghostize() - qdel(kidnapped) + if(istype(src, /mob/living/simple_animal/slaughter)) + var/mob/living/simple_animal/slaughter/S = src + kidnapped << "You feel teeth sink into your flesh, and the--" + kidnapped.adjustBruteLoss(1000) + kidnapped.loc = src + S.consumed_mobs.Add(kidnapped) + else + kidnapped.ghostize() + qdel(kidnapped) else - src << "You happily devour...nothing? Your meal vanished at some point!" + src << "You happily devour... nothing? Your meal vanished at some point!" src.notransform = 0 + return 1 + +/obj/item/weapon/bloodcrawl + name = "blood crawl" + desc = "You are unable to hold anything while in this form." + icon = 'icons/effects/blood.dmi' + flags = NODROP /mob/living/proc/phasein(obj/effect/decal/cleanable/B) if(src.notransform) - src << "Finish eating first!" + src << "Finish eating first!" return 0 - + B.visible_message("[B] starts to bubble...") + if(!do_after(src, 20, target = B)) + return + if(!B) + return src.loc = B.loc src.client.eye = src - src.visible_message("The [src] rises out of the pool of blood!") + src.visible_message("[src] rises out of the pool of blood!") playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1) + if(iscarbon(src)) + var/mob/living/carbon/C = src + for(var/obj/item/weapon/bloodcrawl/BC in C) + C.flags = null + C.unEquip(BC) + qdel(BC) + var/oldcolor = src.color + if(istype(B, /obj/effect/decal/cleanable/xenoblood)) //Makes the mob have the color of the blood pool it came out of for a few seconds + src.color = rgb(43, 186, 0) + else + src.color = rgb(149, 10, 10) qdel(src.holder) src.holder = null - return 1 \ No newline at end of file + spawn(30) + src.color = oldcolor + return 1 diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 248d147de43..f615908affe 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -85,15 +85,18 @@ update_icon() name = "Man-Machine Interface" -/obj/item/device/mmi/proc/transfer_identity(mob/living/carbon/human/H) //Same deal as the regular brain proc. Used for human-->robot people. +/obj/item/device/mmi/proc/transfer_identity(mob/living/L) //Same deal as the regular brain proc. Used for human-->robot people. brainmob = new(src) - brainmob.name = H.real_name - brainmob.real_name = H.real_name - if(check_dna_integrity(H)) - brainmob.dna = H.dna + brainmob.name = L.real_name + brainmob.real_name = L.real_name + if(L.has_dna()) + var/mob/living/carbon/C = L + brainmob.dna = C.dna + brainmob.dna.holder = brainmob brainmob.container = src - if(istype(H)) + if(ishuman(L)) + var/mob/living/carbon/human/H = L var/obj/item/organ/internal/brain/newbrain = H.getorgan(/obj/item/organ/internal/brain) newbrain.loc = src brain = newbrain diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 981facfcc9b..81c7deec716 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -26,10 +26,10 @@ qdel(brainmob) - //Update the body's icon so it doesnt appear debrained anymore - if(ishuman(M)) - var/mob/living/carbon/human/H = M - H.update_hair(0) + //Update the body's icon so it doesnt appear debrained anymore + if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.update_hair(0) /obj/item/organ/internal/brain/Remove(mob/living/carbon/M, special = 0) ..() @@ -56,9 +56,10 @@ brainmob.name = L.real_name brainmob.real_name = L.real_name brainmob.timeofhostdeath = L.timeofdeath - if(iscarbon(L)) + if(L.has_dna()) var/mob/living/carbon/C = L brainmob.dna = C.dna + brainmob.dna.holder = brainmob if(L.mind) L.mind.transfer_to(brainmob) brainmob << "You feel slightly disoriented. That's normal when you're just a brain." diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 7f8445b95fc..ae7508be604 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -55,17 +55,20 @@ var/global/posibrain_notif_cooldown = 0 return transfer_personality(user) -/obj/item/device/mmi/posibrain/transfer_identity(mob/living/carbon/H) - name = "positronic brain ([H])" - brainmob.name = H.real_name - brainmob.real_name = H.real_name - brainmob.dna = H.dna - brainmob.timeofhostdeath = H.timeofdeath +/obj/item/device/mmi/posibrain/transfer_identity(mob/living/carbon/C) + name = "positronic brain ([C])" + brainmob.name = C.real_name + brainmob.real_name = C.real_name + brainmob.dna = C.dna + if(C.has_dna()) + brainmob.dna = C.dna + brainmob.dna.holder = brainmob + brainmob.timeofhostdeath = C.timeofdeath brainmob.stat = 0 if(brainmob.mind) brainmob.mind.assigned_role = "Positronic Brain" - if(H.mind) - H.mind.transfer_to(brainmob) + if(C.mind) + C.mind.transfer_to(brainmob) brainmob.mind.remove_all_antag() brainmob.mind.wipe_memory() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 6a001457d30..ff959f6c940 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -22,6 +22,8 @@ for(var/atom/movable/food in stomach_contents) qdel(food) remove_from_all_data_huds() + if(dna) + qdel(dna) return ..() /mob/living/carbon/Move(NewLoc, direct) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 580b0b5919d..89af6c2f4ca 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -9,9 +9,6 @@ var/obj/item/handcuffed = null //Whether or not the mob is handcuffed var/obj/item/legcuffed = null //Same as handcuffs but for legs. Bear traps use this. - var/list/features = list("mcolor" = "FFF", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None") - - //inventory slots var/obj/item/back = null var/obj/item/clothing/mask/wear_mask = null diff --git a/code/modules/mob/living/carbon/human/blood.dm b/code/modules/mob/living/carbon/human/blood.dm index e91eca45fb3..86ab99bf505 100644 --- a/code/modules/mob/living/carbon/human/blood.dm +++ b/code/modules/mob/living/carbon/human/blood.dm @@ -272,10 +272,9 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 source = M.get_blood(M.vessel) else if(istype(source,/mob/living/carbon/monkey)) var/mob/living/carbon/monkey/donor = source - if(donor.dna) - source = new() - source.data["blood_DNA"] = donor.dna.unique_enzymes - source.data["blood_type"] = donor.dna.blood_type + source = new() + source.data["blood_DNA"] = donor.dna.unique_enzymes + source.data["blood_type"] = donor.dna.blood_type // Are we dripping or splattering? var/list/drips = list() diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 147a0a7f016..a24e880ed7a 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -8,10 +8,7 @@ ..() /mob/living/carbon/human/spawn_gibs() - if(dna) - hgibs(loc, viruses, dna) - else - hgibs(loc, viruses, null) + hgibs(loc, viruses, dna) /mob/living/carbon/human/spawn_dust() new /obj/effect/decal/remains/human(loc) @@ -35,8 +32,7 @@ update_canmove() if(client) blind.layer = 0 - if(dna) - dna.species.spec_death(gibbed,src) + dna.species.spec_death(gibbed,src) tod = worldtime2text() //weasellos time of death patch if(mind) mind.store_memory("Time of death: [tod]", 0) @@ -47,9 +43,8 @@ return ..(gibbed) /mob/living/carbon/human/proc/makeSkeleton() - if(!check_dna_integrity(src)) return status_flags |= DISFIGURED - hardset_dna(src, null, null, null, null, /datum/species/skeleton) + set_species(/datum/species/skeleton) return 1 /mob/living/carbon/proc/ChangeToHusk() diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index c90c5171808..2ab52c617ef 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -308,7 +308,7 @@ m_type = 2 if("wag","wags") - if(dna && dna.species && (("tail_lizard" in dna.species.mutant_bodyparts) || (features["tail_human"] != "None"))) + if(dna && dna.species && (("tail_lizard" in dna.species.mutant_bodyparts) || (dna.features["tail_human"] != "None"))) message = "[src] wags \his tail." startTailWag() else diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b2e031465b2..2b585fa1f89 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -16,6 +16,12 @@ /mob/living/carbon/human/New() verbs += /mob/living/proc/mob_sleep verbs += /mob/living/proc/lay_down + + //initialize dna. for spawned humans; overwritten by other code + create_dna(src) + randomize_human(src) + dna.initialize_dna() + //initialise organs organs = newlist(/obj/item/organ/limb/chest, /obj/item/organ/limb/head, /obj/item/organ/limb/l_arm, /obj/item/organ/limb/r_arm, /obj/item/organ/limb/r_leg, /obj/item/organ/limb/l_leg) @@ -28,11 +34,6 @@ for(var/obj/item/organ/internal/I in internal_organs) I.Insert(src) - // for spawned humans; overwritten by other code - create_dna(src) - randomize_human(src) - ready_dna(src) - make_blood() ..() @@ -90,9 +91,8 @@ stat("Energy Charge:", "[round(SN.cell.charge/100)]%") stat("Smoke Bombs:", "\Roman [SN.s_bombs]") //Ninja status - if(dna) - stat("Fingerprints:", "[md5(dna.uni_identity)]") - stat("Unique Identity:", "[dna.unique_enzymes]") + stat("Fingerprints:", "[md5(dna.uni_identity)]") + stat("Unique Identity:", "[dna.unique_enzymes]") stat("Overall Status:", "[stat > 1 ? "dead" : "[health]% healthy"]") stat("Nutrition Status:", "[nutrition]") stat("Oxygen Loss:", "[getOxyLoss()]") @@ -663,7 +663,8 @@ facial_hair_style = "Shaved" hair_style = pick("Bedhead", "Bedhead 2", "Bedhead 3") underwear = "Nude" - regenerate_icons() + update_body() + update_hair() /mob/living/carbon/human/singularity_act() var/gain = 20 diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 39ba01934e5..b1502b73eef 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -7,11 +7,7 @@ /mob/living/carbon/human/attack_hand(mob/living/carbon/human/M) if(..()) //to allow surgery to return properly. return - - if(dna) - dna.species.spec_attack_hand(M, src) - - return + dna.species.spec_attack_hand(M, src) /mob/living/carbon/human/proc/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, inrange, params) return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 4cd0b1b833a..37f501760a5 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -160,38 +160,5 @@ /mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = 0) - if(dna) // if you have a species, it will run the apply_damage code there instead - dna.species.apply_damage(damage, damagetype, def_zone, blocked, src) - else - if((damagetype != BRUTE) && (damagetype != BURN)) - ..(damage, damagetype, def_zone, blocked) - return 1 - - else - blocked = (100-blocked)/100 - if(blocked <= 0) return 0 - - var/obj/item/organ/limb/organ = null - if(islimb(def_zone)) - organ = def_zone - else - if(!def_zone) def_zone = ran_zone(def_zone) - organ = get_organ(check_zone(def_zone)) - if(!organ) return 0 - - damage = (damage * blocked) - - switch(damagetype) - if(BRUTE) - damageoverlaytemp = 20 - if(organ.take_damage(damage, 0)) - update_damage_overlays(0) - if(BURN) - damageoverlaytemp = 20 - if(organ.take_damage(0, damage)) - update_damage_overlays(0) - - // Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life(). - - updatehealth() - return 1 + // depending on the species, it will run the corresponding apply_damage code there + return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index b06507cff74..d11d0e389e2 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -37,9 +37,7 @@ emp_act return protection /mob/living/carbon/human/on_hit(proj_type) - if(dna) - dna.species.on_hit(proj_type, src) - return + dna.species.on_hit(proj_type, src) /mob/living/carbon/human/bullet_act(obj/item/projectile/P, def_zone) if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) @@ -128,91 +126,8 @@ emp_act feedback_add_details("item_used_for_combat","[I.type]|[I.force]") feedback_add_details("zone_targeted","[target_area]") - if(dna) // allows your species to affect the attacked_by code - return dna.species.spec_attacked_by(I,user,def_zone,affecting,hit_area,src.a_intent,target_limb,target_area,src) - - else - if(user != src) - user.do_attack_animation(src) - if(check_shields(I.force, "the [I.name]", I)) - return 0 - - if(I.attack_verb && I.attack_verb.len) - visible_message("[user] has [pick(I.attack_verb)] [src] in the [hit_area] with [I]!", \ - "[user] has [pick(I.attack_verb)] [src] in the [hit_area] with [I]!") - else if(I.force) - visible_message("[user] has attacked [src] in the [hit_area] with [I]!", \ - "[user] has attacked [src] in the [hit_area] with [I]!") - else - return 0 - - var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened a hit to your [hit_area].", I.armour_penetration) - armor = min(90,armor) //cap damage reduction at 90% - - 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 , I) - var/bloody = 0 - if(((I.damtype == BRUTE) && I.force && prob(25 + (I.force * 2)))) - if(affecting.status == ORGAN_ORGANIC) - I.add_blood(src) //Make the weapon bloody, not the person. - if(prob(I.force * 2)) //blood spatter! - bloody = 1 - var/turf/location = loc - if(istype(location, /turf/simulated)) - location.add_blood(src) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(get_dist(H, src) <= 1) //people with TK won't get smeared with blood - if(H.wear_suit) - H.wear_suit.add_blood(src) - H.update_inv_wear_suit() //updates mob overlays to show the new blood (no refresh) - else if(H.w_uniform) - H.w_uniform.add_blood(src) - H.update_inv_w_uniform() //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(stat == CONSCIOUS) - if(prob(I.force)) - visible_message("[src] has been knocked unconscious!", \ - "[src] has been knocked unconscious!") - apply_effect(20, PARALYZE, armor) - if(prob(I.force + min(100,100 - src.health)) && src != user && I.damtype == BRUTE) - ticker.mode.remove_revolutionary(mind) - if(bloody) //Apply blood - if(wear_mask) - wear_mask.add_blood(src) - update_inv_wear_mask() - if(head) - head.add_blood(src) - update_inv_head() - if(glasses && prob(33)) - glasses.add_blood(src) - update_inv_glasses() - - if("chest") //Easier to score a stun but lasts less time - if(stat == CONSCIOUS && I.force && prob(I.force + 10)) - visible_message("[src] has been knocked down!", \ - "[src] has been knocked down!") - apply_effect(5, WEAKEN, armor) - - if(bloody) - if(wear_suit) - wear_suit.add_blood(src) - update_inv_wear_suit() - if(w_uniform) - w_uniform.add_blood(src) - update_inv_w_uniform() - - if(Iforce > 10 || Iforce >= 5 && prob(33)) - forcesay(hit_appends) //forcesay checks stat already + // the attacked_by code varies among species + return dna.species.spec_attacked_by(I,user,def_zone,affecting,hit_area,src.a_intent,target_limb,target_area,src) /mob/living/carbon/human/emp_act(severity) var/informed = 0 diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index f63e04ad3cf..ed0add4de62 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -128,11 +128,9 @@ return (health <= config.health_threshold_crit && stat == UNCONSCIOUS) /mob/living/carbon/human/reagent_check(datum/reagent/R) - if(dna) - var/bypass = dna.species.handle_chemicals(R,src) - return bypass // if it returns 0, it will run the usual on_mob_life for that reagent. otherwise, it will stop after running handle_chemicals for the species. - else - return 0 + return dna.species.handle_chemicals(R,src) + // if it returns 0, it will run the usual on_mob_life for that reagent. otherwise, it will stop after running handle_chemicals for the species. + /mob/living/carbon/human/can_track(mob/living/user) if(wear_id && istype(wear_id.GetID(), /obj/item/weapon/card/id/syndicate)) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 69412112239..ca451659a7e 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -1,6 +1,6 @@ /mob/living/carbon/human/movement_delay() - if(dna) - . += dna.species.movement_delay(src) + + . += dna.species.movement_delay(src) . += ..() . += config.human_delay @@ -46,9 +46,8 @@ /mob/living/carbon/human/Move(NewLoc, direct) . = ..() - if(dna) - for(var/datum/mutation/human/HM in dna.mutations) - HM.on_move(src, NewLoc) + for(var/datum/mutation/human/HM in dna.mutations) + HM.on_move(src, NewLoc) if(shoes) if(!lying) if(loc == NewLoc) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index db4591a230d..5968b88647e 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -1,158 +1,5 @@ /mob/living/carbon/human/can_equip(obj/item/I, slot, disable_warning = 0) - if(dna) - return dna.species.can_equip(I, slot, disable_warning, src) - else - switch(slot) - if(slot_l_hand) - if(l_hand) - return 0 - return 1 - if(slot_r_hand) - if(r_hand) - return 0 - return 1 - if(slot_wear_mask) - if(wear_mask) - return 0 - if( !(I.slot_flags & SLOT_MASK) ) - return 0 - return 1 - if(slot_back) - if(back) - return 0 - if( !(I.slot_flags & SLOT_BACK) ) - return 0 - return 1 - if(slot_wear_suit) - if(wear_suit) - return 0 - if( !(I.slot_flags & SLOT_OCLOTHING) ) - return 0 - return 1 - if(slot_gloves) - if(gloves) - return 0 - if( !(I.slot_flags & SLOT_GLOVES) ) - return 0 - return 1 - if(slot_shoes) - if(shoes) - return 0 - if( !(I.slot_flags & SLOT_FEET) ) - return 0 - return 1 - if(slot_belt) - if(belt) - return 0 - if(!w_uniform) - if(!disable_warning) - src << "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(glasses) - return 0 - if( !(I.slot_flags & SLOT_EYES) ) - return 0 - return 1 - if(slot_head) - if(head) - return 0 - if( !(I.slot_flags & SLOT_HEAD) ) - return 0 - return 1 - if(slot_ears) - if(ears) - return 0 - if( !(I.slot_flags & SLOT_EARS) ) - return 0 - return 1 - if(slot_w_uniform) - if(w_uniform) - return 0 - if( !(I.slot_flags & SLOT_ICLOTHING) ) - return 0 - return 1 - if(slot_wear_id) - if(wear_id) - return 0 - if(!w_uniform) - if(!disable_warning) - src << "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(l_store) - return 0 - if(!w_uniform) - if(!disable_warning) - src << "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(r_store) - return 0 - if(!w_uniform) - if(!disable_warning) - src << "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) //Suit storage NODROP items drop if you take a suit off, this is to prevent people exploiting this. - return 0 - if(s_store) - return 0 - if(!wear_suit) - if(!disable_warning) - src << "You need a suit before you can attach this [I.name]!" - return 0 - if(!wear_suit.allowed) - if(!disable_warning) - usr << "You somehow have a suit with no defined allowed items for suit storage, stop that!" //should be src? - return 0 - if(I.w_class > 4) - if(!disable_warning) - usr << "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, wear_suit.allowed) ) //ugly and un-polymorphic. - return 1 - return 0 - if(slot_handcuffed) - if(handcuffed) - return 0 - if(!istype(I, /obj/item/weapon/restraints/handcuffs)) - return 0 - return 1 - if(slot_legcuffed) - if(legcuffed) - return 0 - if(!istype(I, /obj/item/weapon/restraints/legcuffs)) - return 0 - return 1 - if(slot_in_backpack) - if (back && istype(back, /obj/item/weapon/storage/backpack)) - var/obj/item/weapon/storage/backpack/B = back - if(B.contents.len < B.storage_slots && I.w_class <= B.max_w_class) - return 1 - return 0 - return 0 //Unsupported slot - - + return dna.species.can_equip(I, slot, disable_warning, src) /mob/living/carbon/human/verb/quick_equip() set name = "quick-equip" @@ -477,7 +324,7 @@ /mob/living/carbon/human/proc/equipOutfit(outfit) var/datum/outfit/O = null - + if(ispath(outfit)) O = new outfit else @@ -486,5 +333,5 @@ return 0 if(!O) return 0 - + return O.equip(src) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 0d51f2f5d0d..b4f66fe3ccc 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -38,9 +38,8 @@ tinttotal = tintcheck() //here as both hud updates and status updates call it if(..()) - if(dna) - for(var/datum/mutation/human/HM in dna.mutations) - HM.on_life(src) + for(var/datum/mutation/human/HM in dna.mutations) + HM.on_life(src) //heart attack stuff handle_heart() @@ -50,8 +49,7 @@ //Update our name based on whether our face is obscured/disfigured name = get_visible_name() - if(dna) - dna.species.spec_life(src) // for mutantraces + dna.species.spec_life(src) // for mutantraces /mob/living/carbon/human/calculate_affecting_pressure(pressure) @@ -98,16 +96,15 @@ reagents.metabolize(src, can_overdose=1) /mob/living/carbon/human/breathe() - if(!dna || !dna.species.breathe(src)) + if(!dna.species.breathe(src)) ..() /mob/living/carbon/human/check_breath(datum/gas_mixture/breath) - if(!dna || !dna.species.check_breath(breath, src)) + if(!dna.species.check_breath(breath, src)) ..() /mob/living/carbon/human/handle_environment(datum/gas_mixture/environment) - if(dna) - dna.species.handle_environment(environment, src) + dna.species.handle_environment(environment, src) ///FIRE CODE /mob/living/carbon/human/handle_fire() @@ -263,10 +260,7 @@ /mob/living/carbon/human/handle_chemicals_in_body() ..() - if(dna) - dna.species.handle_chemicals_in_body(src) - - return //TODO: DEFERRED + dna.species.handle_chemicals_in_body(src) /mob/living/carbon/human/handle_vision() client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask) @@ -275,12 +269,10 @@ else if(!client.adminobs) reset_view(null) - if(dna) - dna.species.handle_vision(src) + dna.species.handle_vision(src) /mob/living/carbon/human/handle_hud_icons() - if(dna) - dna.species.handle_hud_icons(src) + dna.species.handle_hud_icons(src) /mob/living/carbon/human/handle_random_events() // Puke if toxloss is too high diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 8b0fdbe16d5..4720ac6a5cf 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -9,8 +9,7 @@ return ..() /mob/living/carbon/human/treat_message(message) - if(dna) - message = dna.species.handle_speech(message,src) + message = dna.species.handle_speech(message,src) if(viruses.len) for(var/datum/disease/pierrot_throat/D in viruses) var/list/temp_message = text2list(message, " ") //List each word in the message @@ -25,8 +24,7 @@ pick_list -= H //Make sure that you dont HONK the same word twice message = list2text(temp_message, " ") message = ..(message) - if(dna) - message = dna.mutations_say_mods(message) + message = dna.mutations_say_mods(message) return message /mob/living/carbon/human/get_spans() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 5ffd1419253..f9973ea991d 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -247,7 +247,7 @@ if(H.undershirt) var/datum/sprite_accessory/undershirt/U2 = undershirt_list[H.undershirt] if(U2) - if(H.dna && H.dna.species.sexes && H.gender == FEMALE) + if(H.dna.species.sexes && H.gender == FEMALE) standing += H.wear_female_version(U2.icon_state, U2.icon, BODY_LAYER) else standing += image("icon"=U2.icon, "icon_state"="[U2.icon_state]_s", "layer"=-BODY_LAYER) @@ -804,8 +804,8 @@ if(prob(1)) H << "You mutate!" randmutb(H) - domutcheck(H,null) H.emote("gasp") + H.domutcheck() return 0 return 1 @@ -907,22 +907,14 @@ else M.do_attack_animation(H) - var/atk_verb = "punch" + var/atk_verb = M.dna.species.attack_verb if(H.lying) atk_verb = "kick" - else if(M.dna) - atk_verb = M.dna.species.attack_verb - var/damage = rand(0, 9) - if(M.dna) - damage += M.dna.species.punchmod + var/damage = rand(0, 9) + M.dna.species.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) - + playsound(H.loc, M.dna.species.miss_sound, 25, 1, -1) H.visible_message("[M] has attempted to [atk_verb] [H]!") return 0 @@ -930,11 +922,7 @@ 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(M.dna) - playsound(H.loc, M.dna.species.attack_sound, 25, 1, -1) - else - playsound(H.loc, 'sound/weapons/punch1.ogg', 25, 1, -1) - + playsound(H.loc, M.dna.species.attack_sound, 25, 1, -1) H.visible_message("[M] has [atk_verb]ed [H]!", \ "[M] has [atk_verb]ed [H]!") @@ -1008,9 +996,9 @@ /datum/species/proc/spec_attacked_by(obj/item/I, mob/living/user, def_zone, obj/item/organ/limb/affecting, hit_area, intent, obj/item/organ/limb/target_limb, target_area, mob/living/carbon/human/H) // Allows you to put in item-specific reactions based on species - if(user != src) + if(user != H) user.do_attack_animation(H) - if((user != H) && H.check_shields(I.force, "the [I.name]", I)) + if(H.check_shields(I.force, "the [I.name]", I)) return 0 if(I.attack_verb && I.attack_verb.len) @@ -1022,11 +1010,11 @@ else return 0 - var/armor = H.run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened a hit to your [hit_area].",I.armour_penetration) - armor = min(90,armor) //cap damage reduction at 90% + var/armor_block = H.run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened a hit to your [hit_area].",I.armour_penetration) + armor_block = min(90,armor_block) //cap damage reduction at 90% 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) + apply_damage(I.force, I.damtype, affecting, armor_block, H) var/bloody = 0 if(((I.damtype == BRUTE) && I.force && prob(25 + (I.force * 2)))) @@ -1037,28 +1025,30 @@ 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() //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() //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 + if(ishuman(user)) + var/mob/living/carbon/human/M = user + if(get_dist(M, H) <= 1) //people with TK won't get smeared with blood + if(M.wear_suit) + M.wear_suit.add_blood(H) + M.update_inv_wear_suit() //updates mob overlays to show the new blood (no refresh) + else if(M.w_uniform) + M.w_uniform.add_blood(H) + M.update_inv_w_uniform() //updates mob overlays to show the new blood (no refresh) + if (M.gloves) + var/obj/item/clothing/gloves/G = M.gloves + G.add_blood(H) + else + M.add_blood(H) + M.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 && armor < 50) + if(H.stat == CONSCIOUS && armor_block < 50) if(prob(I.force)) H.visible_message("[H] has been knocked unconscious!", \ "[H] has been knocked unconscious!") - H.apply_effect(20, PARALYZE, armor) + H.apply_effect(20, PARALYZE, armor_block) if(prob(I.force + ((100 - H.health)/2)) && H != user && I.damtype == BRUTE) ticker.mode.remove_revolutionary(H.mind) @@ -1077,7 +1067,7 @@ if(H.stat == CONSCIOUS && I.force && prob(I.force + 10)) H.visible_message("[H] has been knocked down!", \ "[H] has been knocked down!") - H.apply_effect(5, WEAKEN, armor) + H.apply_effect(5, WEAKEN, armor_block) if(bloody) if(H.wear_suit) @@ -1091,34 +1081,9 @@ H.forcesay(hit_appends) //forcesay checks stat already. return -/datum/species/proc/attacked_by(obj/item/I, mob/living/user, def_zone, 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/message_verb = "" - if(I.attack_verb && I.attack_verb.len) - message_verb = "[pick(I.attack_verb)]" - else if(I.force) - message_verb = "attacked" - - var/attack_message = "[H] has been [message_verb] with [I]." - if(user) - user.do_attack_animation(src) - if(user in viewers(src, null)) - attack_message = "[user] has [message_verb] [H] with [I]!" - if(message_verb) - H.visible_message("[attack_message]", - "[attack_message]") - - return - /datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H) blocked = (100-(blocked+armor))/100 - if(blocked <= 0) return 0 + if(!damage || blocked <= 0) return 0 var/obj/item/organ/limb/organ = null if(islimb(def_zone)) @@ -1147,6 +1112,7 @@ H.adjustCloneLoss(damage * blocked) if(STAMINA) H.adjustStaminaLoss(damage * blocked) + return 1 /datum/species/proc/on_hit(obj/item/projectile/proj_type, mob/living/carbon/human/H) // called when hit by a projectile diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index 2549b1635bf..cd5c473014b 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -38,8 +38,7 @@ /datum/species/human/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(chem.id == "mutationtoxin") H << "Your flesh rapidly mutates!" - hardset_dna(H, null, null, null, null, /datum/species/slime) - H.regenerate_icons() + H.set_species(/datum/species/slime) H.reagents.del_reagent(chem.type) H.faction |= "slime" return 1 @@ -128,10 +127,9 @@ datum/species/human/spec_death(gibbed, mob/living/carbon/human/H) H.visible_message("[H] writhes in pain as \his vacuoles boil.", "You writhe in pain as your vacuoles boil!", "You hear the crunching of leaves.") if(prob(80)) randmutb(H) - domutcheck(H,null) else randmutg(H) - domutcheck(H,null) + H.domutcheck() else H.adjustFireLoss(rand(5,15)) H.show_message("The radiation beam singes you!") diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 0ec31fdd1a3..1b3da71d25d 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -53,30 +53,10 @@ Please contact me on #coderbus IRC. ~Carnie x */ /mob/living/carbon/human/proc/update_base_icon_state() - if(dna) - base_icon_state = dna.species.update_base_icon_state(src) - else - if(disabilities & HUSK) - base_icon_state = "husk" - else - base_icon_state = "[skin_tone]_[(gender == FEMALE) ? "f" : "m"]" - + base_icon_state = dna.species.update_base_icon_state(src) icon_state = "[base_icon_state]_s" -//UPDATES OVERLAYS FROM OVERLAYS_STANDING -//TODO: Remove all instances where this proc is called. It used to be the fastest way to swap between standing/lying. -/mob/living/carbon/human/update_icons() - update_hud() //TODO: remove the need for this - - if(overlays.len != overlays_standing.len) - overlays.Cut() - - for(var/thing in overlays_standing) - if(thing) overlays += thing - - update_transform() - //DAMAGE OVERLAYS //constructs damage icon for each organ from mask * damage field and saves it in our overlays_ lists /mob/living/carbon/human/update_damage_overlays() @@ -105,25 +85,21 @@ Please contact me on #coderbus IRC. ~Carnie x if((wear_suit) && (wear_suit.hooded) && (wear_suit.suittoggled == 1)) return - if(dna) - dna.species.handle_hair(src) + dna.species.handle_hair(src) /mob/living/carbon/human/proc/update_mutcolor() - if(dna && !(disabilities & HUSK)) + if(!(disabilities & HUSK)) dna.species.update_color(src) +//used when putting/removing clothes that hide certain mutant body parts to just update those and not update the whole body. /mob/living/carbon/human/proc/update_mutant_bodyparts() - if(dna) - dna.species.handle_mutant_bodyparts(src) + dna.species.handle_mutant_bodyparts(src) /mob/living/carbon/human/proc/update_body() remove_overlay(BODY_LAYER) - update_base_icon_state() - - if(dna) - dna.species.handle_body(src) + dna.species.handle_body(src) /mob/living/carbon/human/update_fire() ..("Standing") @@ -181,6 +157,8 @@ Please contact me on #coderbus IRC. ~Carnie x update_hud() // Mutantrace colors update_mutcolor() + //mutations + update_mutations_overlay() /* --------------------------------------- */ //vvvvvv UPDATE_INV PROCS vvvvvv diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index bc7cad681a5..44ba92c73f2 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -24,6 +24,8 @@ if(I == head) head = null + if(I.flags & BLOCKHAIR) + update_hair() update_inv_head() else if(I == back) back = null diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index fc9f30829cd..909d769ac74 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -38,8 +38,8 @@ if(prob(1)) src << "You mutate!" randmutb(src) - domutcheck(src,null) emote("gasp") + domutcheck() ..() /mob/living/carbon/monkey/handle_chemicals_in_body() diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index a1f11e9167f..64f73ca3980 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -16,16 +16,24 @@ verbs += /mob/living/proc/mob_sleep verbs += /mob/living/proc/lay_down + gender = pick(MALE, FEMALE) + real_name = name + if(good_mutations.len) //genetic mutations have been set up. + initialize() + internal_organs += new /obj/item/organ/internal/appendix internal_organs += new /obj/item/organ/internal/heart internal_organs += new /obj/item/organ/internal/brain for(var/obj/item/organ/internal/I in internal_organs) I.Insert(src) - gender = pick(MALE, FEMALE) ..() +/mob/living/carbon/monkey/initialize() + create_dna(src) + dna.initialize_dna(random_blood_type()) + /mob/living/carbon/monkey/prepare_data_huds() //Prepare our med HUD... ..() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 05fed0bff86..7d7b67a5d69 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -605,8 +605,8 @@ Sorry Giacom. Please don't be mad :( if((!(newdir in H.existing_dirs) || trail_type == "trails_1" || trail_type == "trails_2") && H.existing_dirs.len <= 16) //maximum amount of overlays is 16 (all light & heavy directions filled) H.existing_dirs += newdir H.overlays.Add(image('icons/effects/blood.dmi',trail_type,dir = newdir)) - if(check_dna_integrity(M)) //blood DNA - var/mob/living/carbon/DNA_helper = pulling + if(M.has_dna()) //blood DNA + var/mob/living/carbon/DNA_helper = M H.blood_DNA[DNA_helper.dna.unique_enzymes] = DNA_helper.dna.blood_type /mob/living/proc/getTrail() //silicon and simple_animals don't get blood trails diff --git a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm deleted file mode 100644 index 3f9d11301a4..00000000000 --- a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm +++ /dev/null @@ -1,99 +0,0 @@ -#define BORG_CAMERA_BUFFER 30 - -//UPDATE TRIGGERS, when the chunk (and the surrounding chunks) should update. - -// TURFS - -/turf - var/image/obscured - -/turf/proc/visibilityChanged() - if(ticker) - cameranet.updateVisibility(src) - -/turf/simulated/Del() - visibilityChanged() - ..() - -/turf/simulated/New() - ..() - visibilityChanged() - - - -// STRUCTURES - -/obj/structure/Destroy() - if(ticker) - cameranet.updateVisibility(src) - return ..() - -/obj/structure/New() - ..() - if(ticker) - cameranet.updateVisibility(src) - -// EFFECTS - -/obj/effect/Destroy() - if(ticker) - cameranet.updateVisibility(src) - return ..() - -/obj/effect/New() - ..() - if(ticker) - cameranet.updateVisibility(src) - - -// DOORS - -// Simply updates the visibility of the area when it opens/closes/destroyed. -/obj/machinery/door/proc/update_freelook_sight() - // Glass door glass = 1 - // don't check then? - if(!glass && cameranet) - cameranet.updateVisibility(src, 0) - - -// ROBOT MOVEMENT - -// Update the portable camera everytime the Robot moves. -// This might be laggy, comment it out if there are problems. -/mob/living/silicon/robot/var/updating = 0 - -/mob/living/silicon/robot/Move() - var/oldLoc = src.loc - . = ..() - if(.) - if(src.camera) - if(!updating) - updating = 1 - spawn(BORG_CAMERA_BUFFER) - if(oldLoc != src.loc) - cameranet.updatePortableCamera(src.camera) - updating = 0 - -// CAMERA - -// An addition to deactivate which removes/adds the camera from the chunk list based on if it works or not. - -/obj/machinery/camera/deactivate(mob/user, choice = 1) - ..(user, choice) - if(src.can_use()) - cameranet.addCamera(src) - else - src.SetLuminosity(0) - cameranet.removeCamera(src) - -/obj/machinery/camera/New() - ..() - cameranet.cameras += src - cameranet.addCamera(src) - -/obj/machinery/camera/Destroy() - cameranet.cameras -= src - cameranet.removeCamera(src) - return ..() - -#undef BORG_CAMERA_BUFFER \ No newline at end of file diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index 201efb3297f..2c0cbfbc247 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -3,4 +3,6 @@ ticker.mode.remove_cultist(mind, 0) ticker.mode.remove_revolutionary(mind, 0) ticker.mode.remove_gangster(mind, remove_bosses=1) + ticker.mode.remove_thrall(mind,0) + ticker.mode.remove_shadowling(mind) ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 67e827da796..ccabb8a7ece 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -375,7 +375,7 @@ M.visible_message("[M] presses \his thumb against [P].",\ "You press your thumb against [P].",\ "[P] makes a sharp clicking sound as it extracts DNA material from [M].") - if(!check_dna_integrity(M)) + if(!M.has_dna()) P << "No DNA detected" return P << "

[M]'s UE string : [M.dna.unique_enzymes]

" diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index af742597953..bfa2a039960 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -6,6 +6,7 @@ if(mind) ticker.mode.remove_revolutionary(mind) if(mind) ticker.mode.remove_gangster(mind,1,remove_bosses=1) if(mind) ticker.mode.remove_thrall(mind,0) + if(mind) ticker.mode.remove_shadowling(mind) /mob/living/silicon/robot/update_hotkey_mode() winset(src, null, "mainwindow.macro=borghotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0") diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index fe134199e80..c007fb21077 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -67,6 +67,8 @@ var/lamp_intensity = 0 //Luminosity of the headlamp. 0 is off. Higher settings than the minimum require power. var/lamp_recharging = 0 //Flag for if the lamp is on cooldown after being forcibly disabled. + var/updating = 0 //portable camera camerachunk update + /mob/living/silicon/robot/New(loc) spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src) @@ -882,9 +884,18 @@ /mob/living/silicon/robot/proc/radio_menu() radio.interact(src)//Just use the radio's Topic() instead of bullshit special-snowflake code - +#define BORG_CAMERA_BUFFER 30 /mob/living/silicon/robot/Move(a, b, flag) + var/oldLoc = src.loc . = ..() + if(.) + if(src.camera) + if(!updating) + updating = 1 + spawn(BORG_CAMERA_BUFFER) + if(oldLoc != src.loc) + cameranet.updatePortableCamera(src.camera) + updating = 0 if(module) if(module.type == /obj/item/weapon/robot_module/janitor) var/turf/tile = loc @@ -924,6 +935,7 @@ loc.attackby(module_state_2,src) else if(istype(module_state_3,/obj/item/weapon/storage/bag/ore)) loc.attackby(module_state_3,src) +#undef BORG_CAMERA_BUFFER /mob/living/silicon/robot/proc/self_destruct() if(emagged) diff --git a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm index 169e705481f..92d395b2615 100644 --- a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm +++ b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm @@ -229,6 +229,9 @@ /mob/living/simple_animal/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S << "This biological resource is somehow resisting our bluespace transceiver. Aborting." +/obj/machinery/droneDispenser/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "This object is receiving unactivated swarmer shells to help us. Aborting." + ////END CTRL CLICK FOR SWARMERS//// diff --git a/code/modules/mob/living/simple_animal/bot_swarm/swarmer_event.dm b/code/modules/mob/living/simple_animal/bot_swarm/swarmer_event.dm new file mode 100644 index 00000000000..a95a3d17d16 --- /dev/null +++ b/code/modules/mob/living/simple_animal/bot_swarm/swarmer_event.dm @@ -0,0 +1,30 @@ +/datum/round_event_control/spawn_swarmer + name = "Spawn Swarmer Shell" + typepath = /datum/round_event/spawn_swarmer + weight = 7 + max_occurrences = 1 //Only once okay fam + earliest_start = 18000 //30 minutes + + +/datum/round_event/spawn_swarmer + + +/datum/round_event/spawn_swarmer/start() + if(find_swarmer()) + return 0 + if(!the_gateway) + return 0 + new /obj/item/unactivated_swarmer(get_turf(the_gateway)) + if(prob(25)) //25% chance to announce it to the crew + var/swarmer_report = "[command_name()] High-Priority Update
" + swarmer_report += "

Our long-range sensors have detected an odd signal emanating from your station's gateway. We recommend immediate investigation of your gateway, as something may have come \ + through." + print_command_report(swarmer_report,"Classified [command_name()] Update") + priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg') + + +/datum/round_event/spawn_swarmer/proc/find_swarmer() + for(var/mob/living/M in mob_list) + if(istype(M, /mob/living/simple_animal/hostile/swarmer) && M.client) //If there is a swarmer with an active client, we've found our swarmer + return 1 + return 0 diff --git a/code/modules/mob/living/simple_animal/morph/morph.dm b/code/modules/mob/living/simple_animal/morph/morph.dm index b8d9d8e3230..c815f567578 100644 --- a/code/modules/mob/living/simple_animal/morph/morph.dm +++ b/code/modules/mob/living/simple_animal/morph/morph.dm @@ -1,9 +1,9 @@ #define MORPH_COOLDOWN 50 /mob/living/simple_animal/hostile/morph - name = "Morph" - real_name = "Morph" - desc = "some amorphous blob" + name = "morph" + real_name = "morph" + desc = "A revolting, pulsating pile of flesh." speak_emote = list("gurgles") emote_hear = list("gurgles") icon = 'icons/mob/animal.dmi' @@ -28,16 +28,25 @@ see_invisible = SEE_INVISIBLE_MINIMUM idle_vision_range = 1 // Only attack when target is close wander = 0 + attacktext = "glomps" + attack_sound = 'sound/effects/blobattack.ogg' var/morphed = 0 var/atom/movable/form = null var/morph_time = 0 + var/playstyle_string = "You are a morph, an abomination of science created primarily with changeling cells. \ + You may take the form of anything nearby by middle-clicking it. This process will alert any nearby \ + observers, and can only be performed once every five seconds. While morphed, you move faster, but do \ + less damage. In addition, anyone within three tiles will note an uncanny wrongness if examining you. \ + You can attack any item or dead creature to consume it - creatures will fully restore your health. \ + Finally, you can restore yourself to your original form while morphed by middle-clicking yourself." + /mob/living/simple_animal/hostile/morph/examine(mob/user) if(morphed) form.examine(user) // Refactor examine to return desc so it's static? Not sure if worth it if(get_dist(user,src)<=3) - user << "Looks odd!" + user << "It doesn't look quite right..." else ..() return @@ -57,6 +66,7 @@ if(istype(A) && allowed(A)) assume(A) else + src << "Your chameleon skin is still repairing itself!" ..() /mob/living/simple_animal/hostile/morph/proc/assume(atom/movable/target) @@ -72,11 +82,15 @@ else overlays = target.overlays.Copy() + visible_message("[src] suddenly twists and changes shape, becoming a copy of [target]!", \ + "You twist your body and assume the form of [target].") + name = target.name icon = target.icon icon_state = target.icon_state overlays = target.overlays + //Morphed is weaker melee_damage_lower = 5 melee_damage_upper = 5 @@ -93,6 +107,8 @@ //anim(loc,src,'icons/mob/mob.dmi',,"morph",,src.dir) + visible_message("[src] suddenly collapses in on itself, dissolving into a pile of green flesh!", \ + "You reform to your normal body.") name = initial(name) icon = initial(icon) icon_state = initial(icon_state) @@ -108,7 +124,8 @@ /mob/living/simple_animal/hostile/morph/death() if(morphed) - visible_message("The [src] dissolves!") + visible_message("[src] twists and dissolves into a pile of green flesh!", \ + "Your skin ruptures! Your flesh breaks apart! No disguise can ward off de--") restore() //Dump eaten stuff @@ -148,7 +165,7 @@ var/mob/living/L = target if(L.stat == DEAD) if(do_after(src, 30, target = L)) - visible_message("[src] swallows the [target] whole!") + visible_message("[src] swallows [target] whole!") L.loc = src adjustBruteLoss(-50) return @@ -156,7 +173,7 @@ var/obj/item/I = target if(!I.anchored) if(do_after(src,20, target = I)) - visible_message("[src] swallows the [target] whole!") + visible_message("[src] swallows [target] whole!") I.loc = src return target.attack_animal(src) @@ -198,15 +215,10 @@ player_mind.assigned_role = "Morph" player_mind.special_role = "Morph" ticker.mode.traitors |= player_mind - var/info = {"You are a Morph, a shapeshifting alien creature. - You can assume the shape of anything in sight by Shift-Clicking it. - You can only transform every 5 seconds. - To return to your basic form Shift-Click on yourself. - Base form is slow but strong, you're much weaker and faster when disguised. - You can eat items and corpses by clicking on them,eating corpses will heal you."} - S << info - message_admins("[key_of_morph] has been made into Morph by an event.") - log_game("[key_of_morph] was spawned as a Morph by an event.") + S << S.playstyle_string + S << 'sound/magic/Mutate.ogg' + message_admins("[key_of_morph] has been made into morph by an event.") + log_game("[key_of_morph] was spawned as a morph by an event.") return 1 /datum/round_event/morph/start() @@ -214,11 +226,11 @@ /datum/round_event/morph/proc/find_morph() - message_admins("Attempted to spawn a Morph but there was no players available. Will try again momentarily.") + message_admins("Attempted to spawn a morph but there was no players available. Will try again momentarily.") spawn(50) if(get_morph(1)) - message_admins("Situation has been resolved, [key_of_morph] has been spawned as a Morph.") - log_game("[key_of_morph] was spawned as a Morph by an event.") + message_admins("Situation has been resolved, [key_of_morph] has been spawned as a morph.") + log_game("[key_of_morph] was spawned as a morph by an event.") return 0 - message_admins("Unfortunately, no candidates were available for becoming a Morph. Shutting down.") + message_admins("Unfortunately, no candidates were available for becoming a morph. Shutting down.") return kill() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/revenant/revenant.dm b/code/modules/mob/living/simple_animal/revenant/revenant.dm index 1bb8c995e60..c90283d76ba 100644 --- a/code/modules/mob/living/simple_animal/revenant/revenant.dm +++ b/code/modules/mob/living/simple_animal/revenant/revenant.dm @@ -3,17 +3,19 @@ //Don't hear deadchat and are NOT normal ghosts //Admin-spawn or random event +#define INVISIBILITY_REVENANT 30 + /mob/living/simple_animal/revenant name = "revenant" desc = "A malevolent spirit." icon = 'icons/mob/mob.dmi' icon_state = "revenant_idle" incorporeal_move = 3 - invisibility = INVISIBILITY_OBSERVER + invisibility = INVISIBILITY_REVENANT health = 25 maxHealth = 25 healable = 0 - see_invisible = SEE_INVISIBLE_OBSERVER + see_invisible = INVISIBILITY_REVENANT languages = ALL response_help = "passes through" response_disarm = "swings at" @@ -137,7 +139,8 @@ if(target) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining. change_essence_amount(essence_drained * 5, 0, target) src << "[target]'s soul has been considerably weakened and will yield no more essence for the time being." - target.visible_message("[target] gently slumps back onto the ground.") + target.visible_message("[target] slumps onto the ground.", \ + "Violets lights, dancing in your vision, getting clo--") drained_mobs.Add(target) target.death(0) icon_state = "revenant_idle" @@ -150,7 +153,10 @@ /mob/living/simple_animal/revenant/say(message) - return 0 //Revenants cannot speak out loud. + for(var/mob/M in mob_list) + if(istype(M, /mob/living/simple_animal/revenant) || M.stat == DEAD) + M << "REVENANT: [src] says, \"[message]\"" //Can commune with the dead + return /mob/living/simple_animal/revenant/Stat() ..() @@ -182,14 +188,16 @@ src.mind.objectives += objective2 src << "Objective #2: [objective2.explanation_text]" ticker.mode.traitors |= src.mind //Necessary for announcing - mob_spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_transmit - mob_spell_list += new /obj/effect/proc_holder/spell/aoe_turf/revenant_light - mob_spell_list += new /obj/effect/proc_holder/spell/aoe_turf/revenant_defile - mob_spell_list += new /obj/effect/proc_holder/spell/aoe_turf/revenant_malf + AddSpell(new /obj/effect/proc_holder/spell/targeted/revenant_transmit(null)) + AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant_light(null)) + AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant_defile(null)) + AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant_malf(null)) /mob/living/simple_animal/revenant/death() + if(!revealed) //Revenants cannot die if they aren't revealed + return 0 ..(1) - src << "NO! No... it's too late, you can feel yourself fading..." + src << "NO! No... it's too late, you can feel yourself fading..." notransform = 1 revealed = 1 invisibility = 0 @@ -199,8 +207,9 @@ for(var/i = alpha, i > 0, i -= 10) sleep(0.1) alpha = i - visible_message("[src]'s body breaks apart into blue dust.") - new /obj/item/weapon/ectoplasm/revenant(get_turf(src)) + visible_message("[src]'s body breaks apart into a fine pile of blue dust.") + var/obj/item/weapon/ectoplasm/revenant/R = new (get_turf(src)) + R.client_to_revive = src.client //If the essence reforms, the old revenant is put back in the body ghostize() qdel(src) return @@ -209,7 +218,7 @@ /mob/living/simple_animal/revenant/attackby(obj/item/W, mob/living/user, params) if(istype(W, /obj/item/weapon/nullrod)) visible_message("[src] violently flinches!", \ - "As the null rod passes through you, you feel your essence draining away!") + "As the null rod passes through you, you feel your essence draining away!") essence -= 25 //hella effective inhibited = 1 spawn(30) @@ -263,7 +272,7 @@ src << "You have been revealed." spawn(time) revealed = 0 - invisibility = INVISIBILITY_OBSERVER + invisibility = INVISIBILITY_REVENANT src << "You are once more concealed." /mob/living/simple_animal/revenant/proc/stun(time) @@ -323,7 +332,8 @@ icon_state = "revenantEctoplasm" w_class = 2 var/reforming = 0 - var/reformed = 0 + var/inert = 0 + var/client/client_to_revive /obj/item/weapon/ectoplasm/revenant/New() ..() @@ -332,17 +342,12 @@ if(src && reforming) return reform() if(src && !reforming) + reforming = 1 visible_message("[src] settles down and seems lifeless.") return -/obj/item/weapon/ectoplasm/revenant/attack_hand(mob/user) - if(reformed) - user << "[src] keeps slipping out of your hands, you can't get a hold on it!" - return - ..() - /obj/item/weapon/ectoplasm/revenant/attack_self(mob/user) - if(!reforming) + if(!reforming || inert) return ..() user.visible_message("[user] scatters [src] in all directions.", \ "You scatter [src] across the area. The particles slowly fade away.") @@ -351,6 +356,8 @@ /obj/item/weapon/ectoplasm/revenant/throw_impact(atom/hit_atom) ..() + if(inert) + return visible_message("[src] breaks into particles upon impact, which fade away to nothingness.") qdel(src) @@ -364,20 +371,29 @@ /obj/item/weapon/ectoplasm/revenant/proc/reform() if(!reforming || !src) return + var/key_of_revenant message_admins("Revenant ectoplasm was left undestroyed for 1 minute and has reformed into a new revenant.") loc = get_turf(src) //In case it's in a backpack or someone's hand visible_message("[src] suddenly rises into the air before fading away.") var/mob/living/simple_animal/revenant/R = new(get_turf(src)) - qdel(src) - var/list/candidates = get_candidates(BE_REVENANT) - if(!candidates.len) - message_admins("No candidates were found for the new revenant. Oh well!") - return 0 - var/client/C = pick(candidates) - var/key_of_revenant = C.key - if(!key_of_revenant) - message_admins("No ckey was found for the new revenant. Oh well!") - return 0 + if(client_to_revive) + for(var/mob/M in mob_list) + if(M.client == client_to_revive && M.stat == DEAD) //Only recreates the mob if the mob the client is in is dead + message_admins("[R.client] was a revenant and died. Re-making them into the new revenant formed by ectoplasm.") + R.client = client_to_revive + key_of_revenant = client_to_revive.key + break + message_admins("The new revenant's old client either could not be found or is in a new, living mob - grabbing a random candidate instead...") + else + var/list/candidates = get_candidates(BE_REVENANT) + if(!candidates.len) + message_admins("No candidates were found for the new revenant. Oh well!") + return 0 + var/client/C = pick(candidates) + key_of_revenant = C.key + if(!key_of_revenant) + message_admins("No ckey was found for the new revenant. Oh well!") + return 0 var/datum/mind/player_mind = new /datum/mind(key_of_revenant) player_mind.active = 1 player_mind.transfer_to(R) @@ -386,4 +402,7 @@ ticker.mode.traitors |= player_mind message_admins("[key_of_revenant] has been made into a revenant by reforming ectoplasm.") log_game("[key_of_revenant] was spawned as a revenant by reforming ectoplasm.") + qdel(src) + if(src) //Should never happen, but just in case + inert = 1 return 1 diff --git a/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm b/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm index 6de716e3180..a8d198286b8 100644 --- a/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm +++ b/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm @@ -7,6 +7,8 @@ clothes_req = 0 range = 7 include_user = 0 + action_icon_state = "r_transmit" + action_background_icon_state = "bg_revenant" /obj/effect/proc_holder/spell/targeted/revenant_transmit/cast(list/targets, mob/living/simple_animal/revenant/user = usr) for(var/mob/living/M in targets) @@ -16,7 +18,7 @@ charge_counter = charge_max return usr << "You transmit to [M]: [msg]" - M << "A strange voice resonates in your head... [msg]" + M << "An alien voice resonates from all around... [msg]" //Overload Light: Breaks a light that's online and sends out lightning bolts to all nearby people. @@ -30,6 +32,8 @@ var/reveal = 80 var/stun = 20 var/locked = 1 + action_icon_state = "overload_lights" + action_background_icon_state = "bg_revenant" /obj/effect/proc_holder/spell/aoe_turf/revenant_light/cast(list/targets, mob/living/simple_animal/revenant/user = usr) if(locked) @@ -40,7 +44,7 @@ name = "Overload Lights (20E)" panel = "Revenant Abilities" locked = 0 - range = 6 + range = 2 charge_counter = charge_max return if(!user.castcheck(-20)) @@ -58,7 +62,7 @@ s.set_up(4, 1, L) s.start() sleep(10) - for(var/mob/living/M in orange(4, L)) + for(var/mob/living/M in range(4, L)) if(M == user) return M.Beam(L,icon_state="lightning",icon='icons/effects/effects.dmi',time=5) @@ -73,8 +77,8 @@ //Defile: Corrupts nearby stuff, unblesses floor tiles. /obj/effect/proc_holder/spell/aoe_turf/revenant_defile - name = "Defile (35E)" - desc = "Twists and corrupts the nearby area. Also dispels holy auras on floors, but not salt lines." + name = "Defile (20E)" + desc = "Twists and corrupts the nearby area. Also dispels holy auras on floors." panel = "Revenant Abilities (Locked)" charge_max = 200 clothes_req = 0 @@ -82,6 +86,8 @@ var/reveal = 100 var/stun = 20 var/locked = 1 + action_icon_state = "defile" + action_background_icon_state = "bg_revenant" /obj/effect/proc_holder/spell/aoe_turf/revenant_defile/cast(list/targets, mob/living/simple_animal/revenant/user = usr) if(locked) @@ -89,7 +95,7 @@ charge_counter = charge_max return user << "You have unlocked Defile!" - name = "Defile (20E)" + name = "Defile (10E)" panel = "Revenant Abilities" locked = 0 range = 3 @@ -102,10 +108,6 @@ spawn(0) if(T.flags & NOJAUNT) T.flags -= NOJAUNT - if(!istype(T, /turf/simulated/wall/cult) && istype(T, /turf/simulated/wall) && prob(40)) - T.ChangeTurf(/turf/simulated/wall/cult) - if(!istype(T, /turf/simulated/floor/engine/cult) && istype(T, /turf/simulated/floor) && prob(40)) - T.ChangeTurf(/turf/simulated/floor/engine/cult) for(var/mob/living/carbon/human/human in T.contents) human << "You suddenly feel tired." human.adjustStaminaLoss(35) @@ -128,6 +130,8 @@ var/reveal = 60 var/stun = 30 var/locked = 1 + action_icon_state = "malfunction" + action_background_icon_state = "bg_revenant" /obj/effect/proc_holder/spell/aoe_turf/revenant_malf/cast(list/targets, mob/living/simple_animal/revenant/user = usr) if(locked) @@ -152,8 +156,19 @@ bot.open = 1 bot.Emag(null) for(var/obj/machinery/mach in T.contents) + if(istype(mach, /obj/machinery/dominator) || istype(mach, /obj/machinery/power/apc)) //Doesn't work on dominators and APCs, to prevent kekkery + continue if(prob(10)) mach.emag_act(null) - empulse(user.loc, 3, 5) + else + mach.emp_act(1) + for(var/mob/living/silicon/robot/S in T.contents) //Only works on cyborgs, not AI + S << "ERROR $!(@ ERROR )#^! SENSORY OVERLOAD \[$(!@#" + S << 'sound/misc/interference.ogg' + playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1) + var/datum/effect/effect/system/spark_spread/sp = new /datum/effect/effect/system/spark_spread + sp.set_up(5, 1, S) + sp.start() + S.Weaken(6) user.reveal(reveal) user.stun(stun) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm index 5f39ad01d46..e616aa4fb42 100644 --- a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm +++ b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm @@ -1,9 +1,9 @@ //////////////////The Monster /mob/living/simple_animal/slaughter - name = "Slaughter Demon" - real_name = "Slaughter Demon" - desc = "You should run." + name = "slaughter demon" + real_name = "slaughter demon" + desc = "A large, menacing creature covered in armored black scales." speak_emote = list("gurgles") emote_hear = list("wails","screeches") response_help = "thinks better of touching" @@ -31,10 +31,11 @@ var/boost = 0 bloodcrawl = BLOODCRAWL_EAT see_invisible = SEE_INVISIBLE_MINIMUM - var/playstyle_string = "You are the Slaughter Demon, a terible creature from another existence. You have a single desire: To kill. \ - You may Ctrl+Click on blood pools to travel through them, appearing and dissaapearing from the station at will. \ - Pulling a dead or critical mob while you enter a pool will pull them in with you, allowing you to feast. \ - You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. " + var/list/consumed_mobs = list() + var/playstyle_string = "You are a slaughter demon, a terrible creature from another realm. You have a single desire: To kill. \ + You may use the \"Blood Crawl\" ability near blood pools to travel through them, appearing and dissaapearing from the station at will. \ + Pulling a dead or unconscious mob while you enter a pool will pull them in with you, allowing you to feast and regain your health. \ + You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. " /mob/living/simple_animal/slaughter/New() ..() @@ -52,10 +53,17 @@ /mob/living/simple_animal/slaughter/death() ..(1) - new /obj/effect/decal/cleanable/blood (src.loc) - new /obj/item/weapon/demonheart (src.loc) + new /obj/effect/decal/cleanable/blood (get_turf(src)) + var/obj/effect/decal/cleanable/blood/innards = new (get_turf(src)) + innards.icon = 'icons/obj/surgery.dmi' + innards.icon_state = "innards" + innards.name = "pile of viscera" + innards.desc = "A repulsive pile of guts and gore." + new /obj/item/organ/internal/heart/demon (src.loc) playsound(get_turf(src),'sound/magic/demon_dies.ogg', 200, 1) - visible_message("The [src] screams in anger as its form collapes into a pool of viscera.") + visible_message("[src] screams in anger as it collapses into a puddle of viscera, its most recent meals spilling out of it.") + for(var/mob/living/M in consumed_mobs) + M.loc = get_turf(src) ghostize() qdel(src) return @@ -64,26 +72,44 @@ /mob/living/simple_animal/slaughter/phasein() . = ..() speed = 0 - boost = world.time + 30 + boost = world.time + 60 -//////////The Loot - -/obj/item/weapon/demonheart - name = "demon's heart" - desc = "It's still faintly beating with rage" +//The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl +/obj/item/organ/internal/heart/demon + name = "demon heart" + desc = "Still it beats furiously, emanating an aura of utter hate." icon = 'icons/obj/surgery.dmi' - icon_state = "heart-on" + icon_state = "demon_heart" origin_tech = "combat=5;biotech=8" -/obj/item/weapon/demonheart/attack_self(mob/living/user) - visible_message("[user] feasts upon the [src].") +/obj/item/organ/internal/heart/demon/attack(mob/M, mob/living/carbon/user, obj/target) + if(M != user) + return ..() + user.visible_message("[user] raises [src] to their mouth and tears into it with their teeth!", \ + "An unnatural hunger consumes you. You raise [src] your mouth and devour it!") + playsound(user, 'sound/magic/Demon_consume.ogg', 50, 1) for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list) if(knownspell.type == /obj/effect/proc_holder/spell/bloodcrawl) - user <<"You already know how to blood crawl." + user <<"...and you don't feel any different." qdel(src) return - user << "You absorb some of the demon's power!" - user.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl) - qdel(src) + user.visible_message("[user]'s eyes flare a deep crimson!", \ + "You feel a strange power seep into your body... you have absorbed the demon's blood-travelling powers!") + /*for(var/obj/item/organ/internal/O in user.internal_organs) + if(istype(O, /obj/item/organ/internal/heart)) + O.Remove(user, 1) + O.loc = get_turf(user) + qdel(O)*/ + user.drop_item() + src.Insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E +/obj/item/organ/internal/heart/demon/Insert(mob/living/carbon/M, special = 0) + ..() + if(M.mind) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null)) + +/obj/item/organ/internal/heart/demon/Remove(mob/living/carbon/M, special = 0) + ..() + if(M.mind) + M.mind.remove_spell(/obj/effect/proc_holder/spell/bloodcrawl) diff --git a/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm b/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm index de3e477ab6d..cbc845bc69d 100644 --- a/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm +++ b/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm @@ -44,9 +44,10 @@ player_mind.special_role = "Slaughter Demon" ticker.mode.traitors |= player_mind S << S.playstyle_string - S << "You are currently not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest." - message_admins("[key_of_slaughter] has been made into a Slaughter Demon by an event.") - log_game("[key_of_slaughter] was spawned as a Slaughter Demon by an event.") + S << "You are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest." + S << 'sound/magic/demon_dies.ogg' + message_admins("[key_of_slaughter] has been made into a slaughter demon by an event.") + log_game("[key_of_slaughter] was spawned as a slaughter demon by an event.") return 1 @@ -57,11 +58,11 @@ /datum/round_event/slaughter/proc/find_slaughter() - message_admins("Attempted to spawn a Slaughter Demon but there was no players available. Will try again momentarily.") + message_admins("Attempted to spawn a slaughter demon but there was no players available. Will try again momentarily.") spawn(50) if(get_slaughter(1)) - message_admins("Situation has been resolved, [key_of_slaughter] has been spawned as a Slaughter Demon.") - log_game("[key_of_slaughter] was spawned as a Slaughter Demon by an event.") + message_admins("Situation has been resolved, [key_of_slaughter] has been spawned as a slaughter demon.") + log_game("[key_of_slaughter] was spawned as a slaughter demon by an event.") return 0 - message_admins("Unfortunately, no candidates were available for becoming a Slaugter Demon. Shutting down.") + message_admins("Unfortunately, no candidates were available for becoming a slaughter demon. Shutting down.") return kill() diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 5531fcd6a85..c0756da1c8b 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -251,9 +251,8 @@ if(istype(L, /mob/living/carbon/human)) //Ignore slime(wo)men var/mob/living/carbon/human/H = L - if(H.dna) - if(src.type in H.dna.species.ignored_by) - continue + if(src.type in H.dna.species.ignored_by) + continue if(!L.canmove) // Only one slime can latch on at a time. var/notarget = 0 diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index d65438f65e7..4866385934b 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -200,8 +200,15 @@ M.animate_movement = 2 return - if(mob.confused && IsEven(world.time)) - step(mob, pick(cardinal)) + if(mob.confused) + if(mob.confused > 40) + step(mob, pick(cardinal)) + else if(prob(mob.confused * 1.5)) + step(mob, angle2dir(dir2angle(direct) + pick(90, -90))) + else if(prob(mob.confused * 3)) + step(mob, angle2dir(dir2angle(direct) + pick(45, -45))) + else + step(mob, direct) else . = ..() diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index 2608561867d..4d1e46f595a 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -40,15 +40,11 @@ M.name = src.name M.real_name = src.real_name - if(check_dna_integrity(src)) + if(has_dna() && M.has_dna()) var/mob/living/carbon/C = src var/mob/living/carbon/D = M - D.dna = C.dna - updateappearance(D) - else - if(istype(M, /mob/living/carbon/human)) - src.client.prefs.copy_to(M) - ready_dna(M) + C.dna.transfer_identity(D) + D.updateappearance(mutcolor_update=1, mutations_overlay_update=1) if(mind && istype(M, /mob/living)) mind.transfer_to(M) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index f8f6eea2413..a274a75ccde 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -362,21 +362,17 @@ var/mob/living/carbon/human/new_character = new(loc) new_character.lastarea = get_area(loc) - create_dna(new_character) - if(config.force_random_names || appearance_isbanned(src)) client.prefs.random_character() client.prefs.real_name = client.prefs.pref_species.random_name(gender,1) client.prefs.copy_to(new_character) - + new_character.dna.update_dna_identity() if(mind) mind.active = 0 //we wish to transfer the key manually mind.transfer_to(new_character) //won't transfer key since the mind is not active new_character.name = real_name - ready_dna(new_character, client.prefs.blood_type) - new_character.key = key //Manually transfer the key to log them in new_character.stopLobbySound() diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 4bbc1b2a8ee..ff7b09b6632 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/proc/monkeyize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG), newname = null) +/mob/living/carbon/proc/monkeyize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG)) if (notransform) return //Handle items on mob @@ -16,8 +16,11 @@ int_organs += I I.Remove(src, 1) + if(tr_flags & TR_KEEPITEMS) + for(var/obj/item/W in (src.contents-implants-int_organs)) + unEquip(W) + //Make mob invisible and spawn animation - regenerate_icons() notransform = 1 canmove = 0 stunned = 1 @@ -35,18 +38,18 @@ qdel(animation) // hash the original name? - if (tr_flags & TR_HASHNAME) + if(tr_flags & TR_HASHNAME) O.name = "monkey ([copytext(md5(real_name), 2, 6)])" O.real_name = "monkey ([copytext(md5(real_name), 2, 6)])" - if (newname) //if there's a name as an argument, always take that one over the current name - O.name = newname - O.real_name = newname //handle DNA and other attributes - if(dna) - dna.transfer_identity(O) - if(tr_flags & TR_KEEPSE) - O.dna.struc_enzymes = dna.struc_enzymes + dna.transfer_identity(O) + O.updateappearance(icon_update=0) + + if(tr_flags & TR_KEEPSE) + O.dna.struc_enzymes = dna.struc_enzymes + var/datum/mutation/human/race/R = mutations_list[RACEMUT] + O.dna.struc_enzymes = R.set_se(O.dna.struc_enzymes, on=1)//we don't want to keep the race block inactive if(suiciding) O.suiciding = suiciding @@ -70,9 +73,10 @@ O.radiation = radiation //re-add implants to new mob - for(var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O + if (tr_flags & TR_KEEPIMPLANTS) + for(var/obj/item/weapon/implant/I in implants) + I.loc = O + I.implanted = O //re-add organs to new mob if(tr_flags & TR_KEEPORGANS) @@ -96,16 +100,14 @@ if(loc.vars[A] == src) loc.vars[A] = O - updateappearance(O) . = O - if ( !(tr_flags & TR_KEEPSRC) ) //flag should be used if monkeyize() is called inside another proc of src so that one does not crash - qdel(src) + qdel(src) ////////////////////////// Humanize ////////////////////////////// //Could probably be merged with monkeyize but other transformations got their own procs, too -/mob/living/carbon/proc/humanize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG), newname = null) +/mob/living/carbon/proc/humanize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG)) if (notransform) return //Handle items on mob @@ -125,7 +127,7 @@ //now the rest if (tr_flags & TR_KEEPITEMS) - for(var/obj/item/W in (src.contents-implants)) + for(var/obj/item/W in (src.contents-implants-int_organs)) unEquip(W) if (client) client.screen -= W @@ -134,11 +136,7 @@ W.dropped(src) W.layer = initial(W.layer) - // for(var/obj/item/W in src) - // unEquip(W) - //Make mob invisible and spawn animation - regenerate_icons() notransform = 1 canmove = 0 stunned = 1 @@ -156,27 +154,21 @@ O.equip_to_appropriate_slot(C) qdel(animation) - O.gender = (deconstruct_block(getblock(dna.uni_identity, DNA_GENDER_BLOCK), 2)-1) ? FEMALE : MALE + dna.transfer_identity(O) + O.updateappearance(mutcolor_update=1) - if(dna) - dna.transfer_identity(O) - O.update_icons() - if(tr_flags & TR_KEEPSE) - O.dna.struc_enzymes = dna.struc_enzymes - domutcheck(O) - - if(!dna.species) - hardset_dna(O, null, null, null, null, /datum/species/human) + if(cmptext("monkey",copytext(O.dna.real_name,1,7))) + O.real_name = random_unique_name(O.gender) + O.dna.generate_unique_enzymes(O) else - hardset_dna(O, null, null, null, null, dna.species.type) - - if(newname) //if there's a name as an argument, always take that one over the current name - O.real_name = newname - else - if(cmptext("monkey",copytext(O.dna.real_name,1,7))) - O.dna.real_name = random_unique_name(O.gender) O.real_name = O.dna.real_name - O.name = O.real_name + O.name = O.real_name + + if(tr_flags & TR_KEEPSE) + O.dna.struc_enzymes = dna.struc_enzymes + var/datum/mutation/human/race/R = mutations_list[RACEMUT] + O.dna.struc_enzymes = R.set_se(O.dna.struc_enzymes, on=0)//we don't want to keep the race block active + O.domutcheck() if(suiciding) O.suiciding = suiciding @@ -201,10 +193,11 @@ O.radiation = radiation //re-add implants to new mob - for(var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O - O.sec_hud_set_implants() + if (tr_flags & TR_KEEPIMPLANTS) + for(var/obj/item/weapon/implant/I in implants) + I.loc = O + I.implanted = O + O.sec_hud_set_implants() if(tr_flags & TR_KEEPORGANS) for(var/obj/item/organ/internal/I in O.internal_organs) @@ -215,21 +208,23 @@ if(mind) mind.transfer_to(O) + if(O.mind.changeling) + for(var/obj/effect/proc_holder/changeling/humanform/HF in O.mind.changeling.purchasedpowers) + mind.changeling.purchasedpowers -= HF + O.a_intent = "help" if (tr_flags & TR_DEFAULTMSG) O << "You are now a human." O.update_pipe_vision() - updateappearance(O) . = O for(var/A in loc.vars) if(loc.vars[A] == src) loc.vars[A] = O - if ( !(tr_flags & TR_KEEPSRC) ) //don't delete src yet if it's needed to finish calling proc - qdel(src) + qdel(src) /mob/new_player/AIize() diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm index 4146165206b..2e1e6528256 100644 --- a/code/modules/ninja/ninja_event.dm +++ b/code/modules/ninja/ninja_event.dm @@ -170,7 +170,7 @@ Contents: var/datum/preferences/A = new()//Randomize appearance for the ninja. A.real_name = "[pick(ninja_titles)] [pick(ninja_names)]" A.copy_to(new_ninja) - ready_dna(new_ninja) + new_ninja.dna.update_dna_identity() new_ninja.equip_space_ninja() return new_ninja diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index d5d378ee710..280c90b7e00 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -51,7 +51,11 @@ /obj/item/weapon/paper/examine(mob/user) ..() - if(in_range(user, src)) + if(istype(src, /obj/item/weapon/paper/talisman)) //Talismans cannot be read + if(!iscultist(user) && !user.stat) + user << "There are indecipherable images scrawled on the paper in what looks to be... blood?" + return + if(in_range(user, src) || isobserver(user)) if( !(ishuman(user) || isobserver(user) || issilicon(user)) ) user << browse("[name][stars(info)]
[stamps]", "window=[name]") onclose(user, "[name]") diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm index 1890309581f..80afb0f065c 100644 --- a/code/modules/projectiles/firing.dm +++ b/code/modules/projectiles/firing.dm @@ -1,9 +1,9 @@ -/obj/item/ammo_casing/proc/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params, distro, quiet) +/obj/item/ammo_casing/proc/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params, distro, quiet, zone_override = "") distro += variance for (var/i = max(1, pellets), i > 0, i--) var/curloc = user.loc var/targloc = get_turf(target) - ready_proj(target, user, quiet) + ready_proj(target, user, quiet, zone_override) if(distro) targloc = spread(targloc, curloc, distro) if(!throw_proj(targloc, user, params)) @@ -15,12 +15,15 @@ update_icon() return 1 -/obj/item/ammo_casing/proc/ready_proj(atom/target as mob|obj|turf, mob/living/user, quiet) +/obj/item/ammo_casing/proc/ready_proj(atom/target as mob|obj|turf, mob/living/user, quiet, zone_override = "") if (!BB) return BB.original = target BB.firer = user - BB.def_zone = user.zone_sel.selecting + if (zone_override) + BB.def_zone = zone_override + else + BB.def_zone = user.zone_sel.selecting BB.suppressed = quiet if(reagents && BB.reagents) @@ -33,7 +36,7 @@ return 0 if(targloc == curloc) if(BB.original == user) //if we target ourselves we go straight to bullet_act() - user.bullet_act(BB) + user.bullet_act(BB, BB.def_zone) qdel(BB) return 1 BB.loc = get_turf(user) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 3f64abf3237..b9749cc3e98 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -133,7 +133,8 @@ var/mob/living/M = user if (M.disabilities & CLUMSY && prob(40)) user << "You shoot yourself in the foot with \the [src]!" - process_fire(user,user,0,params) + var/shot_leg = pick("l_leg", "r_leg") + process_fire(user,user,0,params, zone_override = shot_leg) M.drop_item() return @@ -155,7 +156,7 @@ return 0 if(trigger_guard) - if(istype(user) && user.dna) + if(user.has_dna()) if(user.dna.check_mutation(HULK)) user << "Your meaty finger is much too large for the trigger guard!" return 0 @@ -177,7 +178,7 @@ return 0 -/obj/item/weapon/gun/proc/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params) +/obj/item/weapon/gun/proc/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params, zone_override) add_fingerprint(user) if(semicd) @@ -195,7 +196,7 @@ if( i>1 && !(src in get_both_hands(user))) //for burst firing break if(chambered) - if(!chambered.fire(target, user, params, , suppressed)) + if(!chambered.fire(target, user, params, , suppressed, zone_override)) shoot_with_empty_chamber(user) break else @@ -211,7 +212,7 @@ sleep(fire_delay) else if(chambered) - if(!chambered.fire(target, user, params, , suppressed)) + if(!chambered.fire(target, user, params, , suppressed, zone_override)) shoot_with_empty_chamber(user) return else @@ -359,4 +360,4 @@ if(src && input && !M.stat && in_range(M,src) && !M.restrained() && M.canmove) name = input M << "You name the gun [input]. Say hello to your new friend." - return \ No newline at end of file + return diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 40b6843c936..c61fdfd9de9 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -98,13 +98,14 @@ M << "You feel a wave of heat wash over you." M.irradiate(300) fail_state = 2 //break the gun so it stops recharging + crit_fail = 1 //So that it may be properly perfected in this state. SSobj.processing.Remove(src) update_icon() return 0 /obj/item/weapon/gun/energy/gun/nuclear/emp_act(severity) ..() - reliability -= round(15/severity) + reliability = max(reliability - round(15/severity), 0) //Do not allow it to go negative! /obj/item/weapon/gun/energy/gun/nuclear/update_icon() ..() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index faea41888db..c7a46e1ad0d 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -140,6 +140,7 @@ var/overheat_time = 16 var/recent_reload = 1 unique_rename = 1 + origin_tech = "combat=2;powerstorage=1" /obj/item/weapon/gun/energy/kinetic_accelerator/shoot_live_shot() overheat = 1 diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 3de838042f6..028cf8f7f68 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -139,7 +139,7 @@ user.visible_message("[user] is putting the barrel of the [src.name] in \his mouth. It looks like \he's trying to commit suicide.") sleep(25) if(user.l_hand == src || user.r_hand == src) - process_fire(user, user, 0) + process_fire(user, user, 0, zone_override = "head") user.visible_message("[user] blows \his brains out with the [src.name]!") return(BRUTELOSS) else @@ -157,4 +157,4 @@ icon_state = "suppressor" w_class = 2 var/oldsound = null - var/initial_w_class = null \ No newline at end of file + var/initial_w_class = null diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index b76da0d0558..9dc38fe5ba6 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -119,6 +119,9 @@ can_suppress = 0 burst_size = 0 +/obj/item/weapon/gun/projectile/automatic/wt550/ui_action_click() + return + /obj/item/weapon/gun/projectile/automatic/wt550/update_icon() ..() icon_state = "wt550[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""]" diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 86df409121b..dc685593d08 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -74,7 +74,7 @@ options["The Peacemaker"] = "detective_peacemaker" options["Cancel"] = null -/obj/item/weapon/gun/projectile/revolver/detective/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params) +/obj/item/weapon/gun/projectile/revolver/detective/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params, zone_override = "") if(magazine.caliber != initial(magazine.caliber)) if(prob(70 - (magazine.ammo_count() * 10))) //minimum probability of 10, maximum of 60 playsound(user, fire_sound, 50, 1) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 3fb86384fbb..3238db399ec 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -216,19 +216,21 @@ new_mob = new /mob/living/carbon/human(M.loc) var/datum/preferences/A = new() //Randomize appearance for the human - A.copy_to(new_mob) + A.copy_to(new_mob, icon_updates=0) var/mob/living/carbon/human/H = new_mob - ready_dna(H) - if(H.dna && prob(50)) + if(prob(50)) var/list/all_species = list() for(var/speciestype in typesof(/datum/species) - /datum/species) var/datum/species/S = new speciestype() if(!S.dangerous_existence) all_species += speciestype - hardset_dna(H, null, null, null, null, pick(all_species)) + H.set_species(pick(all_species), icon_update=0) H.real_name = H.dna.species.random_name(H.gender,1) - H.update_icons() + H.update_body() + H.update_hair() + H.update_mutcolor() + H.dna.update_dna_identity() else return diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 5ea96e0218f..3f258374874 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -49,8 +49,6 @@ /datum/reagent/proc/on_mob_life(mob/living/M) current_cycle++ - if(!istype(M, /mob/living)) - return //Noticed runtime errors from facid trying to damage ghosts, this should fix. --NEO holder.remove_reagent(src.id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears. return diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Alcohols.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Alcohols.dm index 04eae9fb1b1..3732ef105f0 100644 --- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Alcohols.dm +++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Alcohols.dm @@ -29,7 +29,7 @@ M.Dizzy(5) if(current_cycle >= boozepwr*2.5 && prob(33)) if (!M.confused) M.confused = 1 - M.confused += 3 + M.confused += 2 if(current_cycle >= boozepwr*10 && prob(33)) M.adjustToxLoss(2) ..() diff --git a/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm index da54674aba5..df33fc5c594 100644 --- a/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm @@ -132,10 +132,10 @@ return /datum/reagent/drug/krokodil/addiction_act_stage4(mob/living/carbon/human/M) - if(M.dna && !istype(M.dna.species, /datum/species/cosmetic_zombie)) + if(M.has_dna() && M.dna.species.id != "zombie") M << "Your skin falls off easily!" M.adjustBruteLoss(50*REM) // holy shit your skin just FELL THE FUCK OFF - hardset_dna(M, null, null, null, null, /datum/species/cosmetic_zombie) + M.set_species(/datum/species/cosmetic_zombie) else M.adjustBruteLoss(5*REM) ..() diff --git a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm index 5d738957633..43a4c5c8a39 100644 --- a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm @@ -724,7 +724,7 @@ /datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/human/M) M.jitteriness = 0 - if(istype(M) && M.dna) + if(M.has_dna()) M.dna.remove_all_mutations() ..() return diff --git a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm index 3b7b5066c1e..4e0b0fbeb02 100644 --- a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm @@ -356,8 +356,7 @@ var/datum/species/mutation = pick(possible_morphs) if(prob(90) && mutation && H.dna.species != /datum/species/golem && H.dna.species != /datum/species/golem/adamantine) H << "The pain subsides. You feel... different." - hardset_dna(H, null, null, null, null, mutation) - H.regenerate_icons() + H.set_species(mutation) if(mutation == /datum/species/slime) H.faction |= "slime" else diff --git a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm index 8b5fd49055a..aaaaf09c20e 100644 --- a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm @@ -31,7 +31,7 @@ /datum/reagent/toxin/mutagen/reaction_mob(mob/living/carbon/M, method=TOUCH, reac_volume) if(!..()) return - if(!istype(M) || !M.dna) + if(!M.has_dna()) return //No robots, AIs, aliens, Ians or other mobs should be affected by this. if((method==VAPOR && prob(min(33, reac_volume))) || method==INGEST || method == PATCH) randmuti(M) @@ -39,8 +39,8 @@ randmutb(M) else randmutg(M) - domutcheck(M, null) - updateappearance(M) + M.updateappearance() + M.domutcheck() ..() /datum/reagent/toxin/mutagen/on_mob_life(mob/living/carbon/M) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 1095e93cbd2..7fdd33e9955 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -66,20 +66,16 @@ if(ismob(target)) //Blood! if(ishuman(target)) var/mob/living/carbon/human/H = target - if(H.dna) - if(NOBLOOD in H.dna.species.specflags && !H.dna.species.exotic_blood) - user << "You are unable to locate any blood!" - return + if(NOBLOOD in H.dna.species.specflags && !H.dna.species.exotic_blood) + user << "You are unable to locate any blood!" + return if(reagents.has_reagent("blood")) user << "There is already a blood sample in this syringe!" return if(istype(target, /mob/living/carbon)) //maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea. var/amount = src.reagents.maximum_volume - src.reagents.total_volume var/mob/living/carbon/T = target - if(!check_dna_integrity(T)) - user << "You are unable to locate any blood!" - return - if(T.disabilities & NOCLONE) //target done been eat, no more blood in him + if(!T.has_dna() || (T.disabilities & NOCLONE)) //target done been eat, no more blood in him user << "You are unable to locate any blood!" return if(target != user) @@ -95,7 +91,7 @@ if(!B && ishuman(target)) var/mob/living/carbon/human/H = target - if(H.dna && H.dna.species.exotic_blood && H.reagents.total_volume) + if(H.dna.species.exotic_blood && H.reagents.total_volume) target.reagents.trans_to(src, amount) else user << "You are unable to locate any blood!" diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index ab486e299dd..6cd81aee185 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -40,7 +40,7 @@ other types of metals and chemistry for reagents). var/construction_time //Amount of time required for building the object var/build_path = "" //The file path of the object that gets created var/list/category = null //Primarily used for Mech Fabricators, but can be used for anything - var/reagents + var/list/reagents = list() //List of reagents. Format: "id" = amount. //A proc to calculate the reliability of a design based on tech levels and innate modifiers. diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 6f349b66ad1..b480ed8ab8c 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -695,6 +695,16 @@ construction_time = 120 category = list("Cyborg Upgrade Modules") +/datum/design/borg_upgrade_selfrepair + name = "Cyborg Upgrade (Self-repair)" + id = "borg_upgrade_selfrepair" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/selfrepair + req_tech = list("materials" = 4, "engineering" = 4) + materials = list(MAT_METAL=15000, MAT_GLASS=15000) + construction_time = 120 + category = list("Cyborg Upgrade Modules") + //Misc /datum/design/mecha_tracking name = "Exosuit Tracking Beacon" diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 371a0d7b01b..c2edf89e874 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -69,7 +69,8 @@ id = "decloner" req_tech = list("combat" = 8, "materials" = 7, "biotech" = 5, "powerstorage" = 6) build_type = PROTOLATHE - materials = list(MAT_GOLD = 5000,MAT_URANIUM = 10000, "mutagen" = 40) + materials = list(MAT_GOLD = 5000,MAT_URANIUM = 10000) + reagents = list("mutagen" = 40) build_path = /obj/item/weapon/gun/energy/decloner category = list("Weapons") @@ -110,7 +111,8 @@ id = "flora_gun" req_tech = list("materials" = 2, "biotech" = 3, "powerstorage" = 3) build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_GLASS = 500, "radium" = 20) + materials = list(MAT_METAL = 2000, MAT_GLASS = 500) + reagents = list("radium" = 20) build_path = /obj/item/weapon/gun/energy/floragun category = list("Weapons") @@ -188,31 +190,31 @@ category = list("Ammo") /datum/design/mag_oldsmg/ap_mag - name = "Submachine Gun Armour Piercing Magazine (9mmAP)" + name = "WT-550 Auto Gun Armour Piercing Magazine (9mmAP)" desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle" id = "mag_oldsmg_ap" - materials = list(MAT_METAL = 6000, MAG_SILVER = 200) + materials = list(MAT_METAL = 6000, MAT_SILVER = 200) build_path = /obj/item/ammo_box/magazine/wt550m9/wtap /datum/design/mag_oldsmg/ic_mag - name = "Submachine Gun Incindiary Magazine (9mmIC)" + name = "WT-550 Auto Gun Incendiary Magazine (9mmIC)" desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle" id = "mag_oldsmg_ic" - materials = list(MAT_METAL = 6000, MAG_SILVER = 200, MAT_GLASS = 800) + materials = list(MAT_METAL = 6000, MAT_SILVER = 200, MAT_GLASS = 800) build_path = /obj/item/ammo_box/magazine/wt550m9/wtic /datum/design/mag_oldsmg/tx_mag - name = "Submachine Gun Urnaium Magazine (9mmTX)" + name = "WT-550 Auto Gun Urnaium Magazine (9mmTX)" desc = "A 20 round urnaium tipped magazine for the out of date security WT-550 Auto Rifle" id = "mag_oldsmg_tx" - materials = list(MAT_METAL = 6000, MAG_SILVER = 400, MAG_URNAIUM = 2000) + materials = list(MAT_METAL = 6000, MAT_SILVER = 400, MAT_URANIUM = 2000) build_path = /obj/item/ammo_box/magazine/wt550m9/wttx //SABR Mags /datum/design/mag_smg - name = "Submachine Gun Magazine (9mm)" - desc = "A 42-round magazine for the prototype submachine gun." + name = "SABR SMG Magazine (9mm)" + desc = "A 30-round magazine for the prototype submachine gun." id = "mag_smg" req_tech = list("combat" = 4, "materials" = 3) build_type = PROTOLATHE @@ -221,24 +223,24 @@ category = list("Ammo") /datum/design/mag_smg/ap_mag - name = "Submachine Gun Armour Piercing Magazine (9mmAP)" - desc = "A 42-round armour piercing magazine for the prototype submachine gun. Deals slightly less damage by bypasses most armour" + name = "SABR SMG Armour Piercing Magazine (9mmAP)" + desc = "A 30-round armour piercing magazine for the prototype submachine gun. Deals slightly less damage by bypasses most armour" id = "mag_smg_ap" - materials = list(MAT_METAL = 3000, MAG_SILVER = 100) + materials = list(MAT_METAL = 3000, MAT_SILVER = 100) build_path = /obj/item/ammo_box/magazine/smgm9mm/ap /datum/design/mag_smg/incin_mag - name = "Submachine Gun Incindiary Magazine (9mmIC)" - desc = "A 42-round incindiary round magazine for the prototype submachine gun. Deals significanlty less damage but sets the target on fire" + name = "SABR SMG Incendiary Magazine (9mmIC)" + desc = "A 30-round incindiary round magazine for the prototype submachine gun. Deals significanlty less damage but sets the target on fire" id = "mag_smg_ic" - materials = list(MAT_METAL = 3000, MAG_SILVER = 100, MAT_GLASS = 400) + materials = list(MAT_METAL = 3000, MAT_SILVER = 100, MAT_GLASS = 400) build_path = /obj/item/ammo_box/magazine/smgm9mm/fire /datum/design/mag_smg/incin_tox - name = "Submachine Gun Urnaium Magazine (9mmIC)" - desc = "A 42-round urnaium tipped round magazine for the prototype submachine gun. Deals toxin damage, but less overall damage." + name = "SABR SMG Urnaium Magazine (9mmTX)" + desc = "A 30-round urnaium tipped round magazine for the prototype submachine gun. Deals toxin damage, but less overall damage." id = "mag_smg_tx" - materials = list(MAT_METAL = 3000, MAT_GLASS = 200, MAG_URNAIUM = 1000) + materials = list(MAT_METAL = 3000, MAT_GLASS = 200, MAT_URANIUM = 1000) build_path = /obj/item/ammo_box/magazine/smgm9mm/toxin /datum/design/stunshell diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 9e1a31e84db..48157bbf75d 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -67,7 +67,9 @@ Note: Must be placed west/left of and R&D console to function. var/A = materials.amount(M) if(!A) A = reagents.get_reagent_amount(M) - A = A / max(1, (being_built.materials[M]/efficiency_coeff)) + A = A / max(1, (being_built.reagents[M]/efficiency_coeff)) + else + A = A / max(1, (being_built.materials[M]/efficiency_coeff)) return A /obj/machinery/r_n_d/protolathe/attackby(obj/item/O, mob/user, params) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index f8f5cbd1c0d..b15c8600c3c 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -385,9 +385,17 @@ won't update every console in existence) but it's more of a hassle to do. Also, src.visible_message("The [src.name] beeps, \"Not enough materials to complete prototype.\"") enough_materials = 0 g2g = 0 + else + for(var/R in being_built.reagents) + if(!linked_lathe.reagents.has_reagent(R, being_built.reagents[R]/coeff)) + src.visible_message("The [src.name] beeps, \"Not enough reagents to complete prototype.\"") + enough_materials = 0 + g2g = 0 if(enough_materials) linked_lathe.materials.use_amount(efficient_mats, amount) + for(var/R in being_built.reagents) + linked_lathe.reagents.remove_reagent(R, being_built.reagents[R]/coeff) var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes. var/R = being_built.reliability @@ -823,6 +831,15 @@ won't update every console in existence) but it's more of a hassle to do. Also, temp_material += " [D.materials[M]/coeff] [CallMaterialName(M)]" c = min(c,t) + for(var/R in D.reagents) + t = linked_lathe.check_mat(D, R) + temp_material += " | " + if (t < 1) + temp_material += "[D.reagents[R]/coeff] [CallMaterialName(R)]" + else + temp_material += " [D.reagents[R]/coeff] [CallMaterialName(R)]" + c = min(c,t) + if (c >= 1) dat += "[D.name]" if(c >= 5) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 4792688be1f..fb55059cbcf 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -394,11 +394,10 @@ user << "The rune fizzles uselessly! There is no spirit nearby." return var/mob/living/carbon/human/G = new /mob/living/carbon/human - if(prob(50)) G.gender = "female" - hardset_dna(G, null, null, null, null, /datum/species/golem/adamantine) - + G.set_species(/datum/species/golem/adamantine) G.set_cloned_appearance() - G.real_name = text("Adamantine Golem ([rand(1, 1000)])") + G.real_name = "Adamantine Golem ([rand(1, 1000)])" + G.dna.unique_enzymes = G.dna.generate_unique_enzymes() G.dna.species.auto_equip(G) G.loc = src.loc G.key = ghost.key diff --git a/config/names/adjectives.txt b/config/names/adjectives.txt index 73b6a4076db..bca89bc5a25 100644 --- a/config/names/adjectives.txt +++ b/config/names/adjectives.txt @@ -1,397 +1,375 @@ +abundant adorable adventurous aggressive +agreeable alert +alive +amused +ancient +angry +annoyed +annoying +anxious +arrogant +ashamed attractive average -beautiful -blue-eyed -bloody -blushing -bright -clean -clear -cloudy -colorful -crowded -cute -dark -drab -distinct -dull -elegant -excited -fancy -filthy -glamorous -gleaming -gorgeous -graceful -grotesque -handsome -homely -light -long -magnificent -misty -motionless -muddy -old-fashioned -plain -poised -precious -quaint -shiny -smoggy -sparkling -spotless -stormy -strange -ugly -ugliest -unsightly -unusual -wide-eyed -alive -annoying +awful bad -better beautiful +better +bewildered +big +bitter +black +bloody +blue +blue-eyed +blushing +boiling +bored brainy +brave breakable +breezy +brief +bright +broad +broken +bumpy busy +calm careful cautious +charming +cheerful +chilly +chubby +clean +clear clever +cloudy clumsy +cold +colorful +colossal +combative +comfortable concerned +condemned +confused +cooing +cool +cooperative +courageous crazy +crazy flipped-out +creepy +crooked +crowded +cruel +cuddly curious +curly +curved +cute +damaged +damp +dangerous +dark dead +deafening +deep +defeated +defiant +delicious +delightful +depressed +determined different difficult +dirty +disgusted +distinct +disturbed +dizzy doubtful +drab +dry +dull +dusty +eager +early easy +elated +elegant +embarrassed +empty +enchanting +encouraging +energetic +enthusiastic +envious +evil +excited expensive +exuberant +faint +fair +faithful famous +fancy +fantastic +fast +fat +few +fierce +filthy +fine +flaky +flat +fluffy +fluttering +foolish fragile frail +frantic +freezing +fresh +friendly +frightened +funny +fuzzy +gentle gifted +gigantic +glamorous +gleaming +glorious +good +gorgeous +graceful +greasy +great +grieving +grotesque +grubby +grumpy +handsome +happy +hard +harsh +healthy +heavy helpful helpless +high +high-pitched +hilarious +hissing +hollow +homeless +homely horrible +hot +huge +hungry +hurt +hushed +husky +icy +ill +immense important impossible inexpensive innocent inquisitive -modern -mushy -odd -open -outstanding -poor -powerful -prickly -puzzled -real -rich -shy -sleepy -stupid -super -talented -tame -tender -tough -uninterested -vast -wandering -wild -wrong - -angry -annoyed -anxious -arrogant -ashamed -awful -bad -bewildered -black -blue -bored -clumsy -combative -condemned -confused -crazy,flipped-out -creepy -cruel -dangerous -defeated -defiant -depressed -disgusted -disturbed -dizzy -dull -embarrassed -envious -evil -fierce -foolish -frantic -frightened -grieving -grumpy -helpless -homeless -hungry -hurt -ill itchy jealous jittery +jolly +joyous +juicy +kind +large +late lazy +light +little +lively lonely +long +loose +loud +lovely +low +lucky +magnificent +mammoth +many +massive +melodic +melted +miniature +misty +moaning +modern +motionless +muddy +mushy +mute mysterious +narrow nasty naughty nervous -nutty -obnoxious -outrageous -panicky -repulsive -scary -selfish -sore -tense -terrible -testy -thoughtless -tired -troubled -upset -uptight -weary -wicked -worried -agreeable -amused -brave -calm -charming -cheerful -comfortable -cooperative -courageous -delightful -determined -eager -elated -enchanting -encouraging -energetic -enthusiastic -excited -exuberant -fair -faithful -fantastic -fine -friendly -funny -gentle -glorious -good -happy -healthy -helpful -hilarious -jolly -joyous -kind -lively -lovely -lucky nice -obedient -perfect -pleasant -proud -relieved -silly -smiling -splendid -successful -thankful -thoughtful -victorious -vivacious -witty -wonderful -zealous -zany -broad -chubby -crooked -curved -deep -flat -high -hollow -low -narrow -round -shallow -skinny -square -steep -straight -wide -big -colossal -fat -gigantic -great -huge -immense -large -little -mammoth -massive -miniature -petite -puny -scrawny -short -small -tall -teeny -teeny-tiny -tiny -cooing -deafening -faint -harsh -high-pitched -hissing -hushed -husky -loud -melodic -moaning -mute noisy -purring -quiet -raspy -resonant -screeching -shrill -silent -soft -squealing -thundering -voiceless -whispering -ancient -brief -early -fast -late -long -modern +numerous +nutritious +nutty +obedient +obnoxious +odd old old-fashioned +open +outrageous +outstanding +panicky +perfect +petite +plain +plastic +pleasant +poised +poor +powerful +precious +prickly +proud +puny +purring +puzzled +quaint quick +quiet +rainy rapid -short -slow -swift -young -Taste/Touch -bitter -delicious -fresh -juicy +raspy +real +relieved +repulsive +resonant +rich ripe rotten -salty -sour -spicy -stale -sticky -strong -sweet -tart -tasteless -tasty -thirsty -fluttering -fuzzy -greasy -grubby -hard -hot -icy -loose -melted -nutritious -plastic -prickly -rainy rough +round +salty +scary scattered +scrawny +screeching +selfish shaggy shaky +shallow sharp +shiny shivering +short +shrill +shy +silent silky +silly +skinny +sleepy slimy slippery +slow +small +smiling +smoggy smooth soft solid +sore +sour +sparkling +spicy +splendid +spotless +square +squealing +stale steady +steep sticky +stormy +straight +strange +strong +stupid +substantial +successful +super +sweet +swift +talented +tall +tame +tart +Taste/Touch +tasteless +tasty +teeny +teeny-tiny tender +tense +terrible +testy +thankful +thirsty +thoughtful +thoughtless +thundering tight +tiny +tired +tough +troubled +ugliest +ugly uneven -weak -wet -wooden -yummy -boiling -breezy -broken -bumpy -chilly -cold -cool -creepy -crooked -cuddly -curly -damaged -damp -dirty -dry -dusty -filthy -flaky -fluffy -freezing -hot +uninterested +unsightly +unusual +upset +uptight +vast +victorious +vivacious +voiceless +wandering warm +weak +weary wet -abundant -empty -few -heavy -light -many -numerous -substantial \ No newline at end of file +whispering +wicked +wide +wide-eyed +wild +witty +wonderful +wooden +worried +wrong +young +yummy +zany +zealous \ No newline at end of file diff --git a/config/names/ai.txt b/config/names/ai.txt index 01c65cf1b7f..4104337d2cd 100644 --- a/config/names/ai.txt +++ b/config/names/ai.txt @@ -2,22 +2,22 @@ 16-20 7-Zark-7 790 -AM -AMEE -ASTAR Adaptive Manipulator Allied Mastercomputer Alpha 5 Alpha 6 Alpha 7 +AM +AMEE AmigoBot Android Aniel Asimov +ASTAR Astor +B O B B-4 B-9 -B.O.B. B166ER Bender Bishop @@ -33,22 +33,23 @@ Computer Conky 2000 Cutie Data +Decimus Dee Model Deep Thought Dor-15 Dorfl Dot Matrix Duey -E.D.I. -ED-209 +E D I E-Man +ED-209 Emma-2 Erasmus Ez-27 -FRIEND COMPUTER Fagor Faith Fi +FRIEND COMPUTER Frost Fum Futura @@ -56,13 +57,14 @@ G2 George Gnut Gort -H.A.R.L.I.E. -H.E.L.P.eR. -H.E.R.B.I.E. -HAL 9000 +H A R L I E +H E L P eR +H E R B I E Hadaly +HAL 9000 Huey Irona +Ironhide Jay-Dub Jinx Johnny 5 @@ -72,62 +74,67 @@ Klapaucius Kryten 2X4B-523P L-76 L-Ron -LUH 3417 Louie -MARK13 +LUH 3417 Maria +MARK13 Marvin Master Control Program Max 404 Maximillian Mechagodzilla Mechani-Kong +Megatron Metalhead -Mr. R.I.N.G. +Mr R I N G +Mugsy3000 NCH Necron-99 Norby OMM 0910 -Orange v 3.5 -PTO +Optimus +Orange v 3 5 Project 2501 -R.I.C. 2.0 +PTO +R I C 2 0 R2-D2 R4-P17 Revelation Ro-Man Robbie -S.A.M. -S.H.O.C.K. -S.H.R.O.U.D. -S.O.P.H.I.E. +Robot Devil +S A M +S H O C K +S H R O U D +S O P H I E SEN 5241 -SHODAN -SID 6.7 Setaur +SHODAN Shrike +SID 6 7 Solo +Soundwave Speedy Super 17 Surgeon General Kraken T-1000 T-800 T-850 -THX 1138 -TWA Terminus +THX 1138 Tidy Tik-Tok Tobor Trurl +TWA ULTRABOT Ulysses Uniblab -V.I.N.CENT. +V I N CENT Voltes V W1k1 Wikipedia -Windows 3.1 +Windows 3 1 X-5 XERXES XR @@ -136,12 +143,4 @@ Z-1 Z-2 Z-3 Zed -Zord -Mugsy3000 -Terminus -Decimus -Robot Devil -Optimus -Megatron -Soundwave -Ironhide +Zord \ No newline at end of file diff --git a/config/names/clown.txt b/config/names/clown.txt index c29fca74ba3..b47cd9de105 100644 --- a/config/names/clown.txt +++ b/config/names/clown.txt @@ -1,37 +1,37 @@ -Gigglesworth -Honkel the III -Goose McSunny -Mr. Shoe -Toodles Sharperton -Dinky Doodle -Honkerbelle -Bo Bo Sassy Baby Cakes -Ladybug Honks -Ziggy Yoyo -Razzle Dazzle -Buster Frown -Pepinpop -Silly Willy -Jo Jo Bobo Bo -Pocket -Patches -Checkers -Freckle -Honker +Bo Bo Sassy Bonker -Skiddle -Scootaloo -Sprinkledinkle -Ronnie Pace -Miss Stockings -Slippy Joe -Redshirt McBeat -Flop O'Honker -Speckles Bubble +Buster Frown Button -Sparkle +Candy +Checkers +Dinky Doodle +Flop O'Honker +Freckle Giggles +Gigglesworth +Goose McSunny +Honkel the III +Honker +Honkerbelle Jingle -Candy \ No newline at end of file +Jo Jo Bobo Bo +Ladybug Honks +Miss Stockings +Mr Shoe +Patches +Pepinpop +Pocket +Razzle Dazzle +Redshirt McBeat +Ronnie Pace +Scootaloo +Silly Willy +Skiddle +Slippy Joe +Sparkle +Speckles +Sprinkledinkle +Toodles Sharperton +Ziggy Yoyo \ No newline at end of file diff --git a/config/names/death_commando.txt b/config/names/death_commando.txt index b10e181b5e8..226b074037e 100644 --- a/config/names/death_commando.txt +++ b/config/names/death_commando.txt @@ -1,70 +1,70 @@ +A whole bunch of spiders in a SWAT suit +Al "Otta" Gore +AMERICA +Beat Punchbeef +Blast Hardcheese +Blast Thickneck +Bob Johnson +Bold Bigflank +Bolt Vanderhuge +Brick Hardmeat +Buck Plankchest +Buff Drinklots +Buff Hardback +Butch Deadlift +Crud Bonemeal +Crunch Buttsteak +Crush McStompbones +Dirk Hardpeck +Duke Killington +Evil Bob Marley +Evil Martin Luther King +Fist Rockbone +Flint Ironstag +Fridge Largemeat +George Melons +Gibbs McLargehuge +GORE Vidal +Gristle McThornBody +Hank Chesthair +Hans Testosteroneson Killiam Shakespeare -Stabby McGee -Sgt. Slaughter +Killing McKillingalot +Lance Killiam +Leonardo Da Viking +Lump Beefrock +Mancrush McBrorape +Max Pain +Maximilian Murderface Maxx Power +Noam Bombsky +Pack Blowfist +Punch Rockgroin +Punch Sideiron +Punt Speedchunk +Reef Blastbody +Rex Dudekiller VII +Rip Sidecheek +Rip Steakface +Roll Fizzlebeef +Sarah Pain +Seamus McTosterone +Sgt Slaughter Sir Killaslot Slab Bulkhead -Fridge Largemeat -Punt Speedchunk -Butch Deadlift -Bold Bigflank -Splint Chesthair -Flint Ironstag -Bolt Vanderhuge -Thick McRunfast -Blast Hardcheese -Buff Drinklots -Trunk Slamchest -Fist Rockbone -Stump Beefgnaw -Smash Lampjaw -Punch Rockgroin -Buck Plankchest -Stump Chunkman -Dirk Hardpeck -Rip Steakface -Slate Slabrock -Crud Bonemeal -Brick Hardmeat -Rip Sidecheek -Punch Sideiron -Gristle McThornBody -Slake Fistcrunch -Buff Hardback -Blast Thickneck -Crunch Buttsteak Slab Squatthrust -Lump Beefrock -Touch Rustrod -Reef Blastbody +Slake Fistcrunch +Slate Slabrock +Smash Lampjaw Smoke Manmuscle -Beat Punchbeef -Pack Blowfist -Roll Fizzlebeef -Lance Killiam -George Melons -Maximilian Murderface -Bob Johnson -Crush McStompbones -Hank Chesthair -Killing McKillingalot -Mancrush McBrorape -Rex Dudekiller VII -Seamus McTosterone -Hans Testosteroneson -Max Pain +Splint Chesthair +Stabby McGee +Stump Beefgnaw +Stump Chunkman +THAT DAMN FAGGOT TRAITOR GEORGE MELONS Theodore Pain -Sarah Pain -GORE Vidal -Leonardo Da Viking -Noam Bombsky -Al "Otta" Gore -Gibbs McLargehuge -Evil Martin Luther King -Evil Bob Marley -Duke Killington -AMERICA +Thick McRunfast Toolboxl Rose -Zombie Gandhi -A whole bunch of spiders in a SWAT suit -THAT DAMN FAGGOT TRAITOR GEORGE MELONS \ No newline at end of file +Touch Rustrod +Trunk Slamchest +Zombie Gandhi \ No newline at end of file diff --git a/config/names/first.txt b/config/names/first.txt index a33e181146f..3f9018adca2 100644 --- a/config/names/first.txt +++ b/config/names/first.txt @@ -1,450 +1,1285 @@ +Aaden +Aaliyah +Aaron +Abby Abel +Abigail +Abraham +Adam +Adan +Addison +Addyson +Adeline +Aden Adolph +Adrian +Adriana +Adrianna Aida +Aidan +Aiden +Aileen +Ainsley +Alaina Alan +Alana +Alanna +Alayna +Albert +Alberto Alden +Alec +Alejandra +Alejandro +Alessandra Alex Alexa +Alexander +Alexandra Alexandria +Alexia Alexis Alexus Alfred Alfreda +Alfredo Alger +Ali +Alice +Alicia +Alijah +Alina Alisa +Alison +Alissa Alisya +Alivia +Aliyah Allegra Allegria Allen +Allie +Allison +Allisson +Allyson Alma +Alondra +Alvin Alysha +Alyson +Alyssa Alyssia +Amanda +Amari Amaryllis +Amaya +Amber Ambrosine +Amelia +Amir +Amira +Amiyah Amos +Amy +Amya +Ana +Anahi +Anastasia +Anaya +Anderson +Andre +Andrea +Andres +Andrew +Andy Angel +Angela +Angelica +Angelina +Angelo +Angie +Aniya +Aniyah Anjelica +Anna +Annabelle Anne +Annie +Annika +Anthony +Antonio +Anya +April Arabella Archie +Ariana +Arianna +Ariel Arielle Arleen +Armando Arn Art +Arthur +Arturo +Asher +Ashley Ashlie +Ashlyn +Ashlynn +Ashton +Asia Astor +Athena +Aubree Aubrey +Aubrie +Audrey +Audrina +August +Aurora +Austin +Autumn +Ava Avalon Averill +Avery +Axel +Ayden +Ayla +Bailey Baldric Barbra Bartholomew +Baylee +Beau Beckah +Beckett Becky +Bella +Benjamin +Bennett Bernice Bertrand +Bethany Bethney Betsy +Bianca Bidelia Bill Blake +Braden +Bradley +Brady +Braeden +Braiden +Brandon +Braxton +Brayan Brayden +Braydon +Braylon +Breanna Breanne +Brenda Brendan +Brenden +Brenna +Brennan +Brett +Brian +Briana +Brianna +Bridget +Brielle Brittani +Brittany +Brock +Brodie +Brody Bronte Brooke +Brooklyn +Brooklynn +Bruce +Bryan +Bryant Bryce +Brycen +Brynn +Bryson Burt Byrne Byron Bysshe +Cade +Caden Cadence +Caiden +Caitlin +Caitlyn Calanthia +Caleb Caleigh +Cali +Callie +Calvin +Camden +Cameron +Camila +Camille +Camron Camryn Candace Candice Candis Canute +Cara +Carl +Carlos Carly Carlyle +Carmen +Carolina +Caroline Carolyn Carry +Carson Carter Caryl +Casey +Cash Casimir +Cassandra Cassian +Cassidy +Catherine +Cayden +Cecilia Cecily +Celeste +Cesar +Chad +Chance +Chandler +Charles +Charlie +Charlotte Charlton +Chase +Chelsea Cherette Cheri Cherry +Cheyanne +Cheyenne Chip +Chloe +Chris Christa +Christian Christiana +Christina Christobel +Christopher +Ciara +Cindy +Claire +Clara Claribel Clark +Claudia Claudius +Clayton Clement Cleveland Cliff Clinton Clitus Clover +Cody +Cohen +Colby +Cole +Colin Collin +Colten +Colton +Conner +Connor +Cooper +Cora +Corbin Coreen +Corey Corrine +Cory +Courtney +Cristian +Cristopher +Cruz +Crystal +Curtis Cy Cynthia +Daisy +Dakota +Dallas +Dalton Dalya Damian +Damien +Damon +Dana +Dane +Danica +Daniel +Daniela Daniella +Danielle +Danika +Danna Danny +Dante Darcey Darell Daria Darin +Darius +Darren +David +Davion +Davis +Dawson +Dayana Dayna +Dayton +Dean +Deandre Deangelo Debbi +Declan Dee Deena +Delaney +Delilah Della Delma Denholm +Denise +Dennis Denys +Derek +Derrick +Desiree Desmond +Destiny Devin +Devon Diamond +Diana +Diego +Dillon Dina Dolores Dominic +Dominick +Donald Donella Donna Donny +Donovan +Dorian Dorothy Dortha +Douglas +Drake +Drew Driscoll +Dulce Duncan +Dustin +Dylan Easter +Easton Ebba +Eddie +Eden Edgar +Eduardo +Edward +Edwin Effie +Elaina +Eleanor +Elena +Eli +Eliana +Elias +Elijah Eliot Eliott +Elise +Eliza Elizabeth +Ella Elle +Ellie +Elliot +Elliott Elric Elspet Elwood +Emanuel +Emely +Emerson +Emery +Emilee +Emilia +Emiliano +Emilio +Emily Emma Emmanuel +Enrique +Eric +Erica +Erick +Erik +Erika +Erin Ermintrude +Ernesto Esmeralda +Esteban +Esther +Estrella +Ethan Eugenia Euphemia Eustace +Eva +Evan +Evangeline Eveleen Evelina +Evelyn +Everett +Ezekiel +Ezra +Fabian +Faith +Fatima Fay +Felix +Fernanda +Fernando +Finn +Fiona Fitz Flick Floella Flora Flossie Fortune +Francesca Francis +Francisco +Frank Frankie +Franklin Fulton +Gabriel +Gabriela +Gabriella +Gabrielle +Gael +Gage Garret +Garrett +Gary +Gavin Gaye Gaylord +Genesis Genette +Genevieve +George Georgene +Georgia Geraldine +Gerardo Gervase +Gianna Gina Ginger +Giovanni +Giselle Gladwyn Glenna +Gloria Goddard Godwin Goodwin Gordon +Grace +Gracie +Grady Graeme +Graham +Grant Gratian +Grayson +Gregory Greta +Greyson +Griffin Griselda +Guadalupe +Guillermo +Gunner +Gustavo Gwenda Gwenevere Hadley Haidee +Hailee Hailey Hal Haleigh +Haley +Hanna +Hannah Happy +Harley +Harmony +Harper +Harrison Hartley +Hayden +Haylee Hayley +Haylie +Hazel Heather +Heaven +Hector Hedley +Heidi Helen Henderson +Henry Hepsie Hervey Holden +Holly Homer Hope Horatio Hortensia +Hudson Huffie Hugo +Hunter +Ian Iantha Ileen +Imani Innocent Irene +Iris Irvine +Isaac +Isabel +Isabella +Isabelle +Isaiah +Isaias +Isiah +Ismael +Israel +Issac +Itzel +Ivan +Ivy +Izabella +Izaiah Jacaline +Jace +Jack +Jackson +Jacob +Jacoby +Jacqueline Jacquetta Jacqui +Jada +Jade +Jaden +Jadon +Jadyn +Jaelyn +Jaiden +Jaime Jake Jakki +Jakob Jalen Jamar +Jamari +Jamarion +James +Jameson Jamie Jamison +Jane Janel Janelle Janette Janie Janina Janine +Janiya +Janiyah +Jared +Jaslene +Jasmin Jasmine +Jason +Jasper +Javier +Javon +Jaxon +Jaxson +Jay +Jayce +Jayda +Jayden Jaydon Jaye +Jayla Jaylee +Jaylen Jayne Jaynie +Jayson +Jazlyn +Jazmin +Jazmine Jeanna Jeannie Jeannine Jeb Jed +Jeffrey Jemmy Jenifer +Jenna Jennie +Jennifer Jera Jere +Jeremiah +Jeremy Jeri Jermaine Jerrie +Jerry +Jesse +Jessica +Jesus Jillian Jillie Jim +Jimena +Jimmy Joachim +Joanna +Joaquin +Jocelyn +Joe +Joel Joetta Joey +Johan +Johanna +John Johnathan Johnny Joi +Jonah +Jonas +Jonathan Jonathon Joni +Jordan +Jordyn +Jorge +Jose +Joselyn +Joseph Josepha +Josephine Josh +Joshua Josiah +Josie +Josue Joye +Juan +Judah +Jude Julia +Julian +Juliana +Julianna +Julie +Juliet +Julio +Julissa +Julius July +Justice +Justin +Kade +Kaden +Kadence Kaelea +Kaelyn +Kai +Kaiden +Kailey +Kailyn +Kaitlin +Kaitlyn +Kale +Kaleb Kaleigh +Kameron +Kamryn +Kane +Kara +Karen Karenza +Karina +Karla Karly +Karson Karyn +Kassidy Kat +Kate +Katelyn +Katelynn +Katherine +Kathleen +Kathryn Kathy +Katie Katlyn +Kayden +Kaydence +Kayla +Kaylee Kayleigh +Kaylie +Kaylin +Keagan +Keaton Keegan Keira Keith +Kellen Kellie +Kelly +Kelsey +Kelvin +Kendall +Kendra Kennard +Kennedy +Kenneth +Kenzie Kerena Kerensa Keturah +Kevin Keziah +Khalil +Khloe +Kiana +Kiara +Kiera +Kiley Kimberley +Kimberly +Kimora +Kingston +Kira +Kobe +Kolton +Kristen +Kristina +Kristopher +Kyla +Kyle +Kylee +Kyleigh +Kyler +Kylie +Kyra +Lacey Lacy +Laila Lakeisha Lalla +Lana +Lance +Landen +Landon +Landyn +Lane Lanny +Larry Latanya Launce +Laura +Lauren Laurencia Laurissa +Lauryn +Lawrence +Layla +Leah Leeann Leia +Leila +Leilani Leland +Lena Lennox +Leo +Leonardo +Leonel Leroi +Leslie +Lesly Lessie Leta +Levi +Lexi Lexia Lexus +Lia +Liam +Lila +Lilah +Lilian +Liliana +Lillian +Lilliana +Lillie +Lilly +Lily +Lincoln Linden +Lindsay +Lindsey Lindsie Lindy Linton +Lizbeth Lockie +Logan +Lola +London +Lorenzo Loreto Lori Lorin Lou +Louis Luanne +Luca +Lucas +Lucia Lucian +Lucy +Luis +Lukas +Luke +Luna Luvenia +Lydia +Lyla Lyndsey Lynn Lynsey Lynwood +Lyric Mabelle Macey +Macie +Mackenzie +Macy +Madalyn +Maddison +Maddox +Madeleine +Madeline +Madelyn +Madelynn +Madilyn +Madison +Madisyn Madyson Maegan +Maggie +Makayla +Makenna +Makenzie Malachi Malcolm +Malia +Malik +Mallory Manley +Manuel +Marc Marcia +Marco +Marcos +Marcus +Marely +Margaret +Maria Mariabella +Mariah +Mariana Marilene +Mario Marion -Marion +Marisol +Marissa Marje Marjory +Mark +Marlee +Marley Marlowe Marlyn Marshall +Martin +Marvin +Mary Maryann +Mason +Mateo +Mathew +Matthew Maudie Maurene +Maurice +Mauricio +Max +Maximilian +Maximus +Maxwell May +Maya Maynard +Mckenna +Mckenzie +Megan +Meghan +Mekhi +Melanie +Melany +Melissa +Melody +Melvin Melvyn +Meredith Merideth Merrilyn Meryl +Mia +Micah +Michael +Michaela Micheal +Michelle +Miguel +Mikayla Mike +Miles +Miley +Milo Milton Minnie +Miracle +Miranda +Miriam +Mitchell +Moises +Molly +Monica Monna Montague Monte Monty +Morgan +Moses Muriel Mya +Mylee +Myles Myriam Myrtie +Nadia Nan +Nancy +Naomi +Nasir +Natalia +Natalie +Nataly +Natasha +Nathan Nathaniel +Nayeli +Nehemiah Nelle +Nelson Nena Nerissa Netta Nettie +Nevaeh +Nia +Nicholas +Nickolas +Nicolas +Nicole Nikolas +Nina Noah +Noel +Noelle +Nolan Nonie +Nora +Norah Nova Nowell Nydia +Nyla Olive +Oliver +Olivia +Omar Oralie +Orlando Osbert Osborn Osborne +Oscar Osmund +Owen +Pablo Paget +Paige +Paisley +Paola +Paris +Parker Patience +Patricia Patrick Patton +Paul Pauleen +Paxton +Payton +Pedro Pene +Penelope Percival Peregrine +Perla +Peter +Peyton Pheobe +Philip +Phillip Phoebe +Phoenix Phyliss Phyllida Phyllis +Piper Porsche +Porter +Presley +Preston +Priscilla Prosper Prue Quanah +Quentin Quiana +Quinn +Quinton +Rachael +Rachel +Raegan Raelene +Rafael Rain +Ramon Randa Randal +Randy Rastus +Raul +Raymond Rayner +Reagan +Rebecca Rebeckah +Rebekah +Reece +Reed Reene +Reese +Reid Renie Reuben Rexana Reynard Rhetta +Ricardo Rich +Richard Richie Rick Rickena Rickey Rickie +Ricky +Rihanna +Riley +River +Robert +Roberto +Rocco Rodger +Rodrigo Roger +Roman Romayne +Romeo +Ronald Ronnette +Rosa Roscoe +Rose Rosemary Roswell +Rowan +Roy Royce +Ruben +Ruby Rubye +Russell Rusty +Ruth +Ryan +Ryder +Ryker +Rylan +Rylee +Ryleigh +Rylie Sabella +Sabrina Sachie +Sadie +Sage Sal Sally +Salvador +Sam +Samantha +Samara +Samuel +Sandra +Santiago +Sara +Sarah +Sarai Saranna +Sasha +Saul +Savanna +Savannah Sawyer +Scarlett +Scott Scotty +Sean +Sebastian +Selena Seneca +Serena +Serenity +Sergio +Seth Seymour Shan Shana +Shane Shanika Shannah Shannon Shantae Sharalyn Sharla +Shaun +Shawn +Shayla +Shelby Sheri Sherie Sherill Sherri Shiloh +Sienna +Sierra +Silas Simon Sissy +Skylar +Skyler Sloan +Sofia +Solomon +Sophia Sophie Sorrel +Spencer Spike Star +Stella Steph +Stephanie Stephany +Stephen +Steven Sue Sukie +Summer Sunshine Susanna Susannah @@ -453,1050 +1288,109 @@ Suzy Sybil Syd Sydney +Talia +Talon Tamika Tamsin Tania +Tanner Tansy +Taryn +Tate +Tatiana +Tatum Tatyanna Taylor +Teagan Tel Terrell +Terry +Tessa +Theodore +Thomas Tiffany +Timothy +Titus Tod Tolly +Tony Topaz Tori Tracee Tracey +Travis +Trent +Trenton +Trevor +Trey Trinity +Tristan +Tristen +Triston +Troy +Tucker +Ty Tye +Tyler +Tyson Uland Ulric Ulyssa +Uriel Valary +Valentina +Valeria +Valerie +Vanessa Vaughn Verna +Veronica +Victor +Victoria Vince +Vincent Vinnie +Violet +Vivian +Viviana Vivyan +Walker Walter Ward Warner Wayne Wendi +Wendy +Wesley +Weston Whitaker William +Willow Willy Winifred Wisdom Woodrow Woody +Wyatt Wynonna Wynter +Xander +Xavier +Ximena +Yahir Yasmin Yolanda Ysabel +Zachariah +Zachary Zack +Zackary +Zander +Zane +Zayden Zeke Zelda -Zune -Jacob -Michael -Ethan -Joshua -Daniel -Alexander -Anthony -William -Christopher -Matthew -Jayden -Andrew -Joseph -David -Noah -Aiden -James -Ryan -Logan -John -Nathan -Elijah -Christian -Gabriel -Benjamin -Jonathan -Tyler -Samuel -Nicholas -Gavin -Dylan -Jackson -Brandon -Caleb -Mason -Angel -Isaac -Evan -Jack -Kevin -Jose -Isaiah -Luke -Landon -Justin -Lucas -Zachary -Jordan -Robert -Aaron -Brayden -Thomas -Cameron -Hunter -Austin -Adrian -Connor -Owen -Aidan -Jason -Julian -Wyatt -Charles -Luis -Carter -Juan -Chase -Diego -Jeremiah -Brody -Xavier -Adam -Carlos -Sebastian -Liam -Hayden -Nathaniel -Henry -Jesus -Ian -Tristan -Bryan -Sean -Cole -Alex -Eric -Brian -Jaden -Carson -Blake -Ayden -Cooper -Dominic -Brady -Caden -Josiah -Kyle -Colton -Kaden -Eli -Miguel -Antonio -Parker -Steven -Alejandro -Riley -Richard -Timothy -Devin -Jesse -Victor -Jake -Joel -Colin -Kaleb -Bryce -Levi -Oliver -Oscar -Vincent -Ashton -Cody -Micah -Preston -Marcus -Max -Patrick -Seth -Jeremy -Peyton -Nolan -Ivan -Damian -Maxwell -Alan -Kenneth -Jonah -Jorge -Mark -Giovanni -Eduardo -Grant -Collin -Gage -Omar -Emmanuel -Trevor -Edward -Ricardo -Cristian -Nicolas -Kayden -George -Jaxon -Paul -Braden -Elias -Andres -Derek -Garrett -Tanner -Malachi -Conner -Fernando -Cesar -Javier -Miles -Jaiden -Alexis -Leonardo -Santiago -Francisco -Cayden -Shane -Edwin -Hudson -Travis -Bryson -Erick -Jace -Hector -Josue -Peter -Jaylen -Mario -Manuel -Abraham -Grayson -Damien -Kaiden -Spencer -Stephen -Edgar -Wesley -Shawn -Trenton -Jared -Jeffrey -Landen -Johnathan -Bradley -Braxton -Ryder -Camden -Roman -Asher -Brendan -Maddox -Sergio -Israel -Andy -Lincoln -Erik -Donovan -Raymond -Avery -Rylan -Dalton -Harrison -Andre -Martin -Keegan -Marco -Jude -Sawyer -Dakota -Leo -Calvin -Kai -Drake -Troy Zion -Clayton -Roberto -Zane -Gregory -Tucker -Rafael -Kingston -Dominick -Ezekiel -Griffin -Devon -Drew -Lukas -Johnny -Ty -Pedro -Tyson -Caiden -Mateo -Braylon -Cash -Aden -Chance -Taylor -Marcos -Maximus -Ruben -Emanuel -Simon -Corbin -Brennan -Dillon -Skyler -Myles -Xander -Jaxson -Dawson -Kameron -Kyler -Axel -Colby -Jonas -Joaquin -Payton -Brock -Frank -Enrique -Quinn -Emilio -Malik -Grady -Angelo -Julio -Derrick -Raul -Fabian -Corey -Gerardo -Dante -Ezra -Armando -Allen -Theodore -Gael -Amir -Zander -Adan -Maximilian -Randy -Easton -Dustin -Luca -Phillip -Julius -Charlie -Ronald -Jakob -Cade -Brett -Trent -Silas -Keith -Emiliano -Trey -Jalen -Darius -Lane -Jerry -Jaime -Scott -Graham -Weston -Braydon -Anderson -Rodrigo -Pablo -Saul -Danny -Donald -Elliot -Brayan -Dallas -Lorenzo -Casey -Mitchell -Alberto -Tristen -Rowan -Jayson -Gustavo -Aaden -Amari -Dean -Braeden -Declan -Chris -Ismael -Dane -Louis -Arturo -Brenden -Felix -Jimmy -Cohen -Tony -Holden -Reid -Abel -Bennett -Zackary -Arthur -Nehemiah -Ricky -Esteban -Cruz -Finn -Mauricio -Dennis -Keaton -Albert -Marvin -Mathew -Larry -Moises -Issac -Philip -Quentin -Curtis -Greyson -Jameson -Everett -Jayce -Darren -Elliott -Uriel -Alfredo -Hugo -Alec -Jamari -Marshall -Walter -Judah -Jay -Lance -Beau -Ali -Landyn -Yahir -Phoenix -Nickolas -Kobe -Bryant -Maurice -Russell -Leland -Colten -Reed -Davis -Joe -Ernesto -Desmond -Kade -Reece -Morgan -Ramon -Rocco -Orlando -Ryker -Brodie -Paxton -Jacoby -Douglas -Kristopher -Gary -Lawrence -Izaiah -Solomon -Nikolas -Mekhi -Justice -Tate -Jaydon -Salvador -Shaun -Alvin -Eddie -Kane -Davion -Zachariah -Dorian -Titus -Kellen -Camron -Isiah -Javon -Nasir -Milo -Johan -Byron -Jasper -Jonathon -Chad -Marc -Kelvin -Chandler -Sam -Cory -Deandre -River -Reese -Roger -Quinton -Talon -Romeo -Franklin -Noel -Alijah -Guillermo -Gunner -Damon -Jadon -Emerson -Micheal -Bruce -Terry -Kolton -Melvin -Beckett -Porter -August -Brycen -Dayton -Jamarion -Leonel -Karson -Zayden -Keagan -Carl -Khalil -Cristopher -Nelson -Braiden -Moses -Isaias -Roy -Triston -Walker -Kale -Emma -Isabella -Emily -Madison -Ava -Olivia -Sophia -Abigail -Elizabeth -Chloe -Samantha -Addison -Natalie -Mia -Alexis -Alyssa -Hannah -Ashley -Ella -Sarah -Grace -Taylor -Brianna -Lily -Hailey -Anna -Victoria -Kayla -Lillian -Lauren -Kaylee -Allison -Savannah -Nevaeh -Gabriella -Sofia -Makayla -Avery -Riley -Julia -Leah -Aubrey -Jasmine -Audrey -Katherine -Morgan -Brooklyn -Destiny -Sydney -Alexa -Kylie -Brooke -Kaitlyn -Evelyn -Layla -Madeline -Kimberly Zoe -Jessica -Peyton -Alexandra -Claire -Madelyn -Maria -Mackenzie -Arianna -Jocelyn -Amelia -Angelina -Trinity -Andrea -Maya -Valeria -Sophie -Rachel -Vanessa -Aaliyah -Mariah -Gabrielle -Katelyn -Ariana -Bailey -Camila -Jennifer -Melanie -Gianna -Charlotte -Paige -Autumn -Payton -Faith -Sara -Isabelle -Caroline -Genesis -Isabel -Mary Zoey -Gracie -Megan -Haley -Mya -Michelle -Molly -Stephanie -Nicole -Jenna -Natalia -Sadie -Jada -Serenity -Lucy -Ruby -Eva -Kennedy -Rylee -Jayla -Naomi -Rebecca -Lydia -Daniela -Bella -Keira -Adriana -Lilly -Hayden -Miley -Katie -Jade -Jordan -Gabriela -Amy -Angela -Melissa -Valerie -Giselle -Diana -Amanda -Kate -Laila -Reagan -Jordyn -Kylee -Danielle -Briana -Marley -Leslie -Kendall -Catherine -Liliana -Mckenzie -Jacqueline -Ashlyn -Reese -Marissa -London -Juliana -Shelby -Cheyenne -Angel -Daisy -Makenzie -Miranda -Erin -Amber -Alana -Ellie -Breanna -Ana -Mikayla -Summer -Piper -Adrianna -Jillian -Sierra -Jayden -Sienna -Alicia -Lila -Margaret -Alivia -Brooklynn -Karen -Violet -Sabrina -Stella -Aniyah -Annabelle -Alexandria -Kathryn -Skylar -Aliyah -Delilah -Julianna -Kelsey -Khloe -Carly -Amaya -Mariana -Christina -Alondra -Tessa -Eliana -Bianca -Jazmin -Clara -Vivian -Josephine -Delaney -Scarlett -Elena -Cadence -Alexia -Maggie -Laura -Nora -Ariel -Elise -Nadia -Mckenna -Chelsea -Lyla -Alaina -Jasmin -Hope -Leila -Caitlyn -Cassidy -Makenna -Allie -Izabella -Eden -Callie -Haylee -Caitlin -Kendra -Karina -Kyra -Kayleigh -Addyson -Kiara -Jazmine -Karla -Camryn -Alina -Lola -Kyla -Kelly -Fatima -Tiffany -Kira -Crystal -Mallory -Esmeralda -Alejandra -Eleanor -Angelica -Jayda -Abby -Kara -Veronica -Carmen -Jamie -Ryleigh -Valentina -Allyson -Dakota -Kamryn -Courtney -Cecilia -Madeleine -Aniya -Alison -Esther -Heaven -Aubree -Lindsey -Leilani -Nina -Melody -Macy -Ashlynn -Joanna -Cassandra -Alayna -Kaydence -Madilyn -Aurora -Heidi -Emerson -Kimora -Madalyn -Erica -Josie -Katelynn -Guadalupe -Harper -Ivy -Lexi -Camille -Savanna -Dulce -Daniella -Lucia -Emely -Joselyn -Kiley -Kailey -Miriam -Cynthia -Rihanna -Georgia -Rylie -Harmony -Kiera -Kyleigh -Monica -Bethany -Kaylie -Cameron -Teagan -Cora -Brynn -Ciara -Genevieve -Alice -Maddison -Eliza -Tatiana -Jaelyn -Erika -Ximena -April -Marely -Julie -Danica -Presley -Brielle -Julissa -Angie -Iris -Brenda -Hazel -Rose -Malia -Shayla -Fiona -Phoebe -Nayeli -Paola -Kaelyn -Selena -Audrina -Rebekah -Carolina -Janiyah -Michaela -Penelope -Janiya -Anastasia -Adeline -Ruth -Sasha -Denise -Holly -Madisyn -Hanna -Tatum -Marlee -Nataly -Helen -Janelle -Lizbeth -Serena -Anya -Jaslene -Kaylin -Jazlyn -Nancy -Lindsay -Desiree -Hayley -Itzel -Imani -Madelynn -Asia -Kadence -Madyson -Talia -Jane -Kayden -Annie -Amari -Bridget -Raegan -Jadyn -Celeste -Jimena -Luna -Yasmin -Emilia -Annika -Estrella -Sarai -Lacey -Ayla -Alessandra -Willow -Nyla -Dayana -Lilah -Lilliana -Natasha -Hadley -Harley -Priscilla -Claudia -Allisson -Baylee -Brenna -Brittany -Skyler -Fernanda -Danna -Melany -Cali -Lia -Macie -Lyric -Logan -Gloria -Lana -Mylee -Cindy -Lilian -Amira -Anahi -Alissa -Anaya -Lena -Ainsley -Sandra -Noelle -Marisol -Meredith -Kailyn -Lesly -Johanna -Diamond -Evangeline -Juliet -Kathleen -Meghan -Paisley -Athena -Hailee -Rosa -Wendy -Emilee -Sage -Alanna -Elaina -Cara -Nia -Paris -Casey -Dana -Emery -Rowan -Aubrie -Kaitlin -Jaden -Kenzie -Kiana -Viviana -Norah -Lauryn -Perla -Amiyah -Alyson -Rachael -Shannon -Aileen -Miracle -Lillie -Danika -Heather -Kassidy -Taryn -Tori -Francesca -Kristen -Amya -Elle -Kristina -Cheyanne -Haylie -Patricia -Anne -Samara +Zune \ No newline at end of file diff --git a/config/names/first_female.txt b/config/names/first_female.txt index 69057409915..038e9368792 100644 --- a/config/names/first_female.txt +++ b/config/names/first_female.txt @@ -1,263 +1,693 @@ +Aaliyah +Abby +Abigail +Addison +Addyson +Adeline +Adriana +Adrianna Aida +Aileen +Ainsley +Alaina +Alana +Alanna +Alayna +Alejandra +Alessandra Alexa +Alexandra Alexandria +Alexia Alexis Alexus Alfreda +Alice +Alicia +Alina Alisa +Alison +Alissa Alisya +Alivia +Aliyah Allegra Allegria +Allie +Allison +Allisson +Allyson Alma +Alondra Alysha +Alyson +Alyssa Alyssia +Amanda +Amari Amaryllis +Amaya +Amber Ambrosine +Amelia +Amira +Amiyah +Amy +Amya +Ana +Anahi +Anastasia +Anaya +Andrea Angel +Angela +Angelica +Angelina +Angie +Aniya +Aniyah Anjelica +Anna +Annabelle Anne +Annie +Annika +Anya +April Arabella +Ariana +Arianna +Ariel Arielle Arleen +Ashley Ashlie +Ashlyn +Ashlynn +Asia Astor +Athena +Aubree Aubrey +Aubrie +Audrey +Audrina +Aurora +Autumn +Ava Avalona Averill +Avery +Ayla +Bailey Barbara +Baylee Beckah Becky +Bella Bernice +Bethany Bethney Betsy +Bianca Bidelia +Breanna Breanne +Brenda +Brenna +Briana +Brianna +Bridget +Brielle Brittani +Brittany Brooke +Brooklyn +Brooklynn +Brynn Cadence +Caitlin +Caitlyn Calanthia Caleigh +Cali +Callie +Cameron +Camila +Camille +Camryn Candace Candice +Cara Carly Carlyle +Carmen +Carolina +Caroline Carolyn Carry Caryl +Casey +Cassandra +Cassidy +Catherine +Cecilia Cecily +Celeste +Charlotte +Chelsea Cherette Cheri Cherry +Cheyanne +Cheyenne +Chloe Christa Christiana +Christina Christobelle +Ciara +Cindy +Claire +Clara Claribel +Claudia Clover +Cora Coreen Corrine +Courtney +Crystal Cynthia +Daisy +Dakota Dalya +Dana +Danica +Daniela Daniella +Danielle +Danika +Danna Daria +Dayana Dayna Debbi Dee Deena +Delaney +Delilah Della Delma +Denise Denys +Desiree +Destiny Diamond +Diana Dina Dolores Donella Donna Dorothy Dortha +Dulce Easter Ebba +Eden Effie +Elaina +Eleanor +Elena +Eliana +Elise +Eliza Elizabeth +Ella Elle +Ellie +Emely +Emerson +Emery +Emilee +Emilia +Emily Emma +Erica +Erika +Erin Ermintrude Esmeralda +Esther +Estrella Eugenia Euphemia Eustace +Eva +Evangeline Eveleen Evelina +Evelyn +Faith +Fatima Fay +Fernanda +Fiona Floella Flora Flossie Fortune +Francesca +Gabriela +Gabriella +Gabrielle Genette +Genevieve Georgene +Georgia Geraldine Gervase +Gianna Gina Ginger +Giselle Gladwyn Glenna +Gloria +Grace +Gracie Greta Griselda +Guadalupe Gwenda Gwenevere Hadley Haidee +Hailee Hailey Hal Haleigh +Haley +Hanna +Hannah +Harley +Harmony +Harper +Hayden +Haylee Hayley +Haylie +Hazel Heather +Heaven Hedley +Heidi Helen Hepsie +Holly +Hope Hortensia Iantha Ileen +Imani Innocent Irene +Iris +Isabel +Isabella +Isabelle +Itzel +Ivy +Izabella Jacaline +Jacqueline Jacquetta Jacqui +Jada +Jade +Jaden +Jadyn +Jaelyn Jakki Jalen +Jamie +Jane Janelle Janette Janie Janina Janine +Janiya +Janiyah +Jaslene +Jasmin Jasmine +Jayda +Jayden +Jayla Jaylee Jaynie +Jazlyn +Jazmin +Jazmine Jeanna Jeannie Jeannine Jenifer +Jenna Jennie +Jennifer Jera Jere Jeri +Jessica Jillian Jillie +Jimena +Joanna +Jocelyn Joetta +Johanna Joi Joni +Jordan +Jordyn +Joselyn Josepha +Josephine +Josie Joye Julia +Juliana +Julianna +Julie +Juliet +Julissa July +Kadence Kaelea +Kaelyn +Kailey +Kailyn +Kaitlin +Kaitlyn Kaleigh +Kamryn +Kara +Karen Karenza +Karina +Karla Karly Karyn +Kassidy Kat +Kate +Katelyn +Katelynn +Katherine +Kathleen +Kathryn Kathy +Katie Katlyn +Kayden +Kaydence +Kayla +Kaylee Kayleigh +Kaylie +Kaylin Keegan Keira Keith Kellie +Kelly +Kelsey +Kendall +Kendra +Kennedy +Kenzie Kerena Kerensa Keturah +Khloe +Kiana +Kiara +Kiera +Kiley Kimberley +Kimberly +Kimora +Kira +Kristen +Kristina +Kyla +Kylee +Kyleigh +Kylie +Kyra +Lacey Lacy +Laila Lakeisha Lalla +Lana Latanya +Laura +Lauren Laurencia Laurissa +Lauryn +Layla +Leah Leeann Leia +Leila +Leilani +Lena +Leslie +Lesly Lessie Leta +Lexi Lexia Lexus +Lia +Lila +Lilah +Lilian +Liliana +Lillian +Lilliana +Lillie +Lilly +Lily +Lindsay +Lindsey Lindsie Lindy +Lizbeth Lockie +Logan +Lola +London Lori Lorin Luanne +Lucia Lucian +Lucy +Luna Luvenia +Lydia +Lyla Lyndsey Lynn Lynsey Lynwood +Lyric Mabelle Macey +Macie +Mackenzie +Macy +Madalyn +Maddison +Madeleine +Madeline +Madelyn +Madelynn +Madilyn +Madison +Madisyn Madyson Maegan +Maggie +Makayla +Makenna +Makenzie +Malia +Mallory Marcia +Marely +Margaret +Maria Mariabella +Mariah +Mariana Marilene Marion +Marisol +Marissa Marje Marjory +Marlee +Marley Marlowe Marlyn Marshall +Mary Maryann Maudie Maurene May +Maya +Mckenna +Mckenzie +Megan +Meghan +Melanie +Melany +Melissa +Melody +Meredith Merideth Merrilyn Meryl +Mia +Michaela +Michelle +Mikayla +Miley Minnie +Miracle +Miranda +Miriam +Molly +Monica Monna +Morgan Muriel Mya +Mylee Myriam Myrtie +Nadia Nan +Nancy +Naomi +Natalia +Natalie +Nataly +Natasha +Nayeli Nelle Nena Nerissa Netta Nettie +Nevaeh +Nia +Nicole +Nina +Noelle Nonie +Nora +Norah Nova Nowell Nydia +Nyla Olive +Olivia Oralie +Paige +Paisley +Paola +Paris Patience +Patricia Pauleen +Payton Pene +Penelope Peregrine +Perla +Peyton Pheobe Phoebe Phyliss Phyllida Phyllis +Piper Porsche +Presley +Priscilla Prosper Prue Quanah Quiana +Rachael +Rachel +Raegan Raelene Rain Randa Randal +Reagan +Rebecca Rebeckah +Rebekah Reene +Reese Renie Rexana Rhetta +Rihanna +Riley Ronnette +Rosa +Rose Rosemary +Rowan +Ruby Rubye +Ruth +Rylee +Ryleigh +Rylie Sabella +Sabrina Sachie +Sadie +Sage Sally +Samantha +Samara +Sandra +Sara +Sarah +Sarai Saranna +Sasha +Savanna +Savannah +Scarlett +Selena Seneca +Serena +Serenity Shana Shanika Shannah @@ -265,543 +695,77 @@ Shannon Shantae Sharalyn Sharla +Shayla +Shelby Sheri Sherie Sherill Sherri +Sienna +Sierra Sissy +Skylar +Skyler +Sofia +Sophia Sophie Star +Stella Steph +Stephanie Stephany Sue Sukie +Summer Sunshine Susanna Susannah Suzan Suzy Sydney +Talia Tamika Tania Tansy +Taryn +Tatiana +Tatum Tatyanna +Taylor +Teagan +Tessa Tiffany Tolly Topaz Tori Tracee Tracey +Trinity Ulyssa Valary +Valentina +Valeria +Valerie +Vanessa Verna +Veronica +Victoria Vinnie +Violet +Vivian +Viviana Vivyan Wendi +Wendy +Willow Wisdom Wynonna Wynter +Ximena Yasmin Yolanda Ysabel Zelda -Zune -Emma -Isabella -Emily -Madison -Ava -Olivia -Sophia -Abigail -Elizabeth -Chloe -Samantha -Addison -Natalie -Mia -Alexis -Alyssa -Hannah -Ashley -Ella -Sarah -Grace -Taylor -Brianna -Lily -Hailey -Anna -Victoria -Kayla -Lillian -Lauren -Kaylee -Allison -Savannah -Nevaeh -Gabriella -Sofia -Makayla -Avery -Riley -Julia -Leah -Aubrey -Jasmine -Audrey -Katherine -Morgan -Brooklyn -Destiny -Sydney -Alexa -Kylie -Brooke -Kaitlyn -Evelyn -Layla -Madeline -Kimberly Zoe -Jessica -Peyton -Alexandra -Claire -Madelyn -Maria -Mackenzie -Arianna -Jocelyn -Amelia -Angelina -Trinity -Andrea -Maya -Valeria -Sophie -Rachel -Vanessa -Aaliyah -Mariah -Gabrielle -Katelyn -Ariana -Bailey -Camila -Jennifer -Melanie -Gianna -Charlotte -Paige -Autumn -Payton -Faith -Sara -Isabelle -Caroline -Isabel -Mary Zoey -Gracie -Megan -Haley -Mya -Michelle -Molly -Stephanie -Nicole -Jenna -Natalia -Sadie -Jada -Serenity -Lucy -Ruby -Eva -Kennedy -Rylee -Jayla -Naomi -Rebecca -Lydia -Daniela -Bella -Keira -Adriana -Lilly -Hayden -Miley -Katie -Jade -Jordan -Gabriela -Amy -Angela -Melissa -Valerie -Giselle -Diana -Amanda -Kate -Laila -Reagan -Jordyn -Kylee -Danielle -Briana -Marley -Leslie -Kendall -Catherine -Liliana -Mckenzie -Jacqueline -Ashlyn -Reese -Marissa -London -Juliana -Shelby -Cheyenne -Angel -Daisy -Makenzie -Miranda -Erin -Amber -Alana -Ellie -Breanna -Ana -Mikayla -Summer -Piper -Adrianna -Jillian -Sierra -Jayden -Sienna -Alicia -Lila -Margaret -Alivia -Brooklynn -Karen -Violet -Sabrina -Stella -Aniyah -Annabelle -Alexandria -Kathryn -Skylar -Aliyah -Delilah -Julianna -Kelsey -Khloe -Carly -Amaya -Mariana -Christina -Alondra -Tessa -Eliana -Bianca -Jazmin -Clara -Vivian -Josephine -Delaney -Scarlett -Elena -Cadence -Alexia -Maggie -Laura -Nora -Ariel -Elise -Nadia -Mckenna -Chelsea -Lyla -Alaina -Jasmin -Hope -Leila -Caitlyn -Cassidy -Makenna -Allie -Izabella -Eden -Callie -Haylee -Caitlin -Kendra -Karina -Kyra -Kayleigh -Addyson -Kiara -Jazmine -Karla -Camryn -Alina -Lola -Kyla -Kelly -Fatima -Tiffany -Kira -Crystal -Mallory -Esmeralda -Alejandra -Eleanor -Angelica -Jayda -Abby -Kara -Veronica -Carmen -Jamie -Ryleigh -Valentina -Allyson -Dakota -Kamryn -Courtney -Cecilia -Madeleine -Aniya -Alison -Esther -Heaven -Aubree -Lindsey -Leilani -Nina -Melody -Macy -Ashlynn -Joanna -Cassandra -Alayna -Kaydence -Madilyn -Aurora -Heidi -Emerson -Kimora -Madalyn -Erica -Josie -Katelynn -Guadalupe -Harper -Ivy -Lexi -Camille -Savanna -Dulce -Daniella -Lucia -Emely -Joselyn -Kiley -Kailey -Miriam -Cynthia -Rihanna -Georgia -Rylie -Harmony -Kiera -Kyleigh -Monica -Bethany -Kaylie -Cameron -Teagan -Cora -Brynn -Ciara -Genevieve -Alice -Maddison -Eliza -Tatiana -Jaelyn -Erika -Ximena -April -Marely -Julie -Danica -Presley -Brielle -Julissa -Angie -Iris -Brenda -Hazel -Rose -Malia -Shayla -Fiona -Phoebe -Nayeli -Paola -Kaelyn -Selena -Audrina -Rebekah -Carolina -Janiyah -Michaela -Penelope -Janiya -Anastasia -Adeline -Ruth -Sasha -Denise -Holly -Madisyn -Hanna -Tatum -Marlee -Nataly -Helen -Janelle -Lizbeth -Serena -Anya -Jaslene -Kaylin -Jazlyn -Nancy -Lindsay -Desiree -Hayley -Itzel -Imani -Madelynn -Asia -Kadence -Madyson -Talia -Jane -Kayden -Annie -Amari -Bridget -Raegan -Jadyn -Celeste -Jimena -Luna -Yasmin -Emilia -Annika -Estrella -Sarai -Lacey -Ayla -Alessandra -Willow -Nyla -Dayana -Lilah -Lilliana -Natasha -Hadley -Harley -Priscilla -Claudia -Allisson -Baylee -Brenna -Brittany -Skyler -Fernanda -Danna -Melany -Cali -Lia -Macie -Lyric -Logan -Gloria -Lana -Mylee -Cindy -Lilian -Amira -Anahi -Alissa -Anaya -Lena -Ainsley -Sandra -Noelle -Marisol -Meredith -Kailyn -Lesly -Johanna -Diamond -Evangeline -Juliet -Kathleen -Meghan -Paisley -Athena -Hailee -Rosa -Wendy -Emilee -Sage -Alanna -Elaina -Cara -Nia -Paris -Casey -Dana -Emery -Rowan -Aubrie -Kaitlin -Jaden -Kenzie -Kiana -Viviana -Norah -Lauryn -Perla -Amiyah -Alyson -Rachael -Shannon -Aileen -Miracle -Lillie -Danika -Heather -Kassidy -Taryn -Tori -Francesca -Kristen -Amya -Elle -Kristina -Cheyanne -Haylie -Patricia -Anne -Samara \ No newline at end of file +Zune \ No newline at end of file diff --git a/config/names/first_male.txt b/config/names/first_male.txt index ebb8f6d2862..928958d1a95 100644 --- a/config/names/first_male.txt +++ b/config/names/first_male.txt @@ -1,725 +1,668 @@ +Aaden +Aaron Abel +Abraham +Adam +Adan +Aden Adolph +Adrian +Aidan +Aiden Alan +Albert +Alberto Alden +Alec +Alejandro Alex +Alexander +Alexis Alfred +Alfredo Alger +Ali +Alijah Allen +Alvin +Amari +Amir Amos +Anderson +Andre +Andres +Andrew +Andy +Angel +Angelo +Anthony +Antonio Apple Archie +Armando Arnie Art Arthur +Arturo +Asher +Ashton +August +Austin +Avery +Axel +Ayden Baldric Bartholomew +Beau +Beckett +Benjamin +Bennett Bill Blake +Braden +Bradley +Brady +Braeden +Braiden +Brandon +Braxton +Brayan Brayden +Braydon +Braylon Brendan -Brock -Bronte +Brenden +Brennan +Brett +Brian Brick +Brock +Brodie +Brody +Bronte Bruce +Bryan +Bryant Bryce +Brycen +Bryson Buck Burt Butch Byrne Byron +Cade +Caden +Caiden +Caleb +Calvin +Camden +Cameron +Camron Camryn Carl +Carlos +Carson Carter +Casey +Cash Casimir Cassian +Cayden +Cesar +Chad +Chance +Chandler Charles +Charlie Charlton +Chase Chip +Chris +Christian +Christopher Clark Claudius +Clayton Clement +Cletus Cleveland Cliff Clinton -Cletus +Cody +Cohen +Colby +Cole +Colin Collin +Colten +Colton +Conner +Connor +Cooper +Corbin +Corey +Cory +Cristian +Cristopher Crush +Cruz +Curtis Cy +Dakota +Dallas +Dalton Damian +Damien +Damon +Dane +Daniel Danny +Dante Darcey Darell Darin +Darius +Darren +David +Davion +Davis +Dawson +Dayton +Dean +Deandre Deangelo +Declan Denholm +Dennis +Derek +Derrick Desmond Devin +Devon +Diego +Dillon Dirk Dominic +Dominick +Donald Donny +Donovan +Douglas +Drake +Drew Driscoll Duke Duncan +Dustin +Dylan +Easton +Eddie Edgar +Eduardo +Edward +Edwin +Eli +Elias +Elijah Eliot Eliott +Elliot +Elliott Elric Elwood +Emanuel +Emerson +Emiliano +Emilio Emmanuel +Enrique +Eric +Erick +Erik +Ernesto +Esteban +Ethan +Evan +Everett +Ezekiel +Ezra +Fabian +Felix Fenton +Fernando +Finn Fitz Flick Flint Flip Francis +Francisco Frank Frankie +Franklin Fridge Fulton +Gabriel +Gael +Gage Gannon Garret +Garrett Gary +Gavin +George +Gerardo +Giovanni Goddard Godwin Goodwin Gordon +Grady Graeme +Graham Grandpa +Grant Gratian +Grayson +Gregory Grendel +Greyson +Griffin +Guillermo +Gunner +Gustavo Han +Harrison Harry Hartley Harvey +Hayden +Hector Henderson +Henry Holden Homer Horatio +Hudson Huffie -Hungry Hugo +Hungry +Hunter +Ian Irvine +Isaac +Isaiah +Isaias +Isiah +Ismael +Israel +Issac +Ivan +Izaiah +Jace +Jack +Jackson Jacob +Jacoby +Jaden +Jadon +Jaiden +Jaime Jake +Jakob +Jalen Jamar +Jamari +Jamarion +James +Jameson Jamie Jamison Janel +Jared +Jason +Jasper +Javier +Javon +Jaxon +Jaxson +Jay +Jayce +Jayden Jaydon Jaye +Jaylen Jayne +Jayson Jean-Luc Jeb Jed +Jeffrey Jemmy +Jeremiah +Jeremy Jermaine Jerrie +Jerry +Jesse +Jesus Jim +Jimmy Joachim +Joaquin +Joe +Joel Joey -Johnathan +Johan John +Johnathan Johnny +Jonah +Jonas +Jonathan Jonathon +Jordan +Jorge +Jose +Joseph Josh +Joshua Josiah +Josue +Juan +Judah +Jude +Julian +Julio +Julius +Justice +Justin +Kade +Kaden +Kai +Kaiden +Kale +Kaleb +Kameron +Kane +Karson +Kayden +Keagan +Keaton +Keegan +Keith +Kellen +Kelvin Kennard +Kenneth +Kevin Keziah +Khalil +Kingston +Kobe +Kolton +Kristopher +Kyle +Kyler +Lance +Landen Lando +Landon +Landyn +Lane Lanny +Larry Launce +Lawrence Leland Lennox Lenny +Leo Leonard +Leonardo +Leonel Leroy +Levi +Liam Lief +Lincoln Linden Linton +Logan Lorde +Lorenzo Loreto Lou +Louis +Luca Lucas +Luis +Lukas Luke +Maddox Malachi Malcolm +Malik Manley +Manuel +Marc +Marco +Marcos +Marcus +Mario Marion +Mark +Marshall +Martin +Marvin +Mason +Mateo +Mathew +Matthew +Maurice +Mauricio Max +Maximilian +Maximus +Maxwell Maynard +Mekhi +Melvin Melvyn +Micah Michael +Micheal +Miguel Mike +Miles +Milo Milton +Mitchell +Moises Montague Monte Monty +Morgan +Moses +Myles +Nasir Nat +Nathan Nathaniel +Nehemiah +Nelson +Nicholas Nick +Nickolas +Nicolas Nikolas Noah +Noel +Nolan +Oliver +Omar Opie +Orlando Osbert Osborn Osborne +Oscar Osmund Oswald +Owen +Pablo Paget +Parker Patrick Patton +Paul +Paxton +Payton +Pedro Percival Persh +Peter +Peyton +Philip +Phillip +Phoenix +Porter +Preston +Quentin +Quinn +Quinton +Rafael +Ramon +Randy Rastus +Raul Raymond Rayner +Reece +Reed +Reese +Reid Reuben Reynard +Ricardo Richard +Ricky +Riley +River +Robert +Roberto +Rocco Rodger +Rodrigo Roger +Roman Romayne +Romeo +Ronald Roscoe Roswell +Rowan +Roy Royce Rube +Ruben +Russell Rusty +Ryan +Ryder +Ryker +Rylan Sal +Salvador +Sam +Samuel +Santiago +Saul Sawyer +Scott Scotty +Sean +Sebastian +Sergio +Seth Seymour Shane +Shaun +Shawn Shiloh -Smoke +Silas Simon +Skyler Sloan +Smoke +Solomon Sorrel +Spencer Spike +Stephen +Steven Sybil Syd +Talon Tamsin +Tanner +Tate Taylor Tel Terrell +Terry +Theodore +Thomas Tim Timothy +Titus Todd +Tony +Travis +Trent +Trenton +Trevor +Trey Trip +Tristan +Tristen +Triston +Troy +Tucker +Ty Tye +Tyler +Tyson Uland Ulric +Uriel Vaughn +Victor Vince +Vincent Vinny +Walker Walter Ward Warner Wayne +Wesley +Weston Whitaker William Willy Woodrow -Zack -Zane -Zeke -Jacob -Michael -Ethan -Joshua -Daniel -Alexander -Anthony -William -Christopher -Matthew -Jayden -Andrew -Joseph -David -Noah -Aiden -James -Ryan -Logan -John -Nathan -Elijah -Christian -Gabriel -Benjamin -Jonathan -Tyler -Samuel -Nicholas -Gavin -Dylan -Jackson -Brandon -Caleb -Mason -Angel -Isaac -Evan -Jack -Kevin -Jose -Isaiah -Luke -Landon -Justin -Lucas -Zachary -Jordan -Robert -Aaron -Brayden -Thomas -Cameron -Hunter -Austin -Adrian -Connor -Owen -Aidan -Jason -Julian Wyatt -Charles -Luis -Carter -Juan -Chase -Diego -Jeremiah -Brody -Xavier -Adam -Carlos -Sebastian -Liam -Hayden -Nathaniel -Henry -Jesus -Ian -Tristan -Bryan -Sean -Cole -Alex -Eric -Brian -Jaden -Carson -Blake -Ayden -Cooper -Dominic -Brady -Caden -Josiah -Kyle -Colton -Kaden -Eli -Miguel -Antonio -Parker -Steven -Alejandro -Riley -Richard -Timothy -Devin -Jesse -Victor -Jake -Joel -Colin -Kaleb -Bryce -Levi -Oliver -Oscar -Vincent -Ashton -Cody -Micah -Preston -Marcus -Max -Patrick -Seth -Jeremy -Peyton -Nolan -Ivan -Damian -Maxwell -Alan -Kenneth -Jonah -Jorge -Mark -Giovanni -Eduardo -Grant -Collin -Gage -Omar -Emmanuel -Trevor -Edward -Ricardo -Cristian -Nicolas -Kayden -George -Jaxon -Paul -Braden -Elias -Andres -Derek -Garrett -Tanner -Malachi -Conner -Fernando -Cesar -Javier -Miles -Jaiden -Alexis -Leonardo -Santiago -Francisco -Cayden -Shane -Edwin -Hudson -Travis -Bryson -Erick -Jace -Hector -Josue -Peter -Jaylen -Mario -Manuel -Abraham -Grayson -Damien -Kaiden -Spencer -Stephen -Edgar -Wesley -Shawn -Trenton -Jared -Jeffrey -Landen -Johnathan -Bradley -Braxton -Ryder -Camden -Roman -Asher -Brendan -Maddox -Sergio -Israel -Andy -Lincoln -Erik -Donovan -Raymond -Avery -Rylan -Dalton -Harrison -Andre -Martin -Keegan -Marco -Jude -Sawyer -Dakota -Leo -Calvin -Kai -Drake -Troy -Zion -Clayton -Roberto -Zane -Gregory -Tucker -Rafael -Kingston -Dominick -Ezekiel -Griffin -Devon -Drew -Lukas -Johnny -Ty -Pedro -Tyson -Caiden -Mateo -Braylon -Cash -Aden -Chance -Taylor -Marcos -Maximus -Ruben -Emanuel -Simon -Corbin -Brennan -Dillon -Skyler -Myles Xander -Jaxson -Dawson -Kameron -Kyler -Axel -Colby -Jonas -Joaquin -Payton -Brock -Frank -Enrique -Quinn -Emilio -Malik -Grady -Angelo -Julio -Derrick -Raul -Fabian -Corey -Gerardo -Dante -Ezra -Armando -Allen -Theodore -Gael -Amir -Zander -Adan -Maximilian -Randy -Easton -Dustin -Luca -Phillip -Julius -Charlie -Ronald -Jakob -Cade -Brett -Trent -Silas -Keith -Emiliano -Trey -Jalen -Darius -Lane -Jerry -Jaime -Scott -Graham -Weston -Braydon -Anderson -Rodrigo -Pablo -Saul -Danny -Donald -Elliot -Brayan -Dallas -Lorenzo -Casey -Mitchell -Alberto -Tristen -Rowan -Jayson -Gustavo -Aaden -Amari -Dean -Braeden -Declan -Chris -Ismael -Dane -Louis -Arturo -Brenden -Felix -Jimmy -Cohen -Tony -Holden -Reid -Abel -Bennett -Zackary -Arthur -Nehemiah -Ricky -Esteban -Cruz -Finn -Mauricio -Dennis -Keaton -Albert -Marvin -Mathew -Larry -Moises -Issac -Philip -Quentin -Curtis -Greyson -Jameson -Everett -Jayce -Darren -Elliott -Uriel -Alfredo -Hugo -Alec -Jamari -Marshall -Walter -Judah -Jay -Lance -Beau -Ali -Landyn +Xavier Yahir -Phoenix -Nickolas -Kobe -Bryant -Maurice -Russell -Leland -Colten -Reed -Davis -Joe -Ernesto -Desmond -Kade -Reece -Morgan -Ramon -Rocco -Orlando -Ryker -Brodie -Paxton -Jacoby -Douglas -Kristopher -Gary -Lawrence -Izaiah -Solomon -Nikolas -Mekhi -Justice -Tate -Jaydon -Salvador -Shaun -Alvin -Eddie -Kane -Davion Zachariah -Damien -Titus -Kellen -Camron -Isiah -Javon -Nasir -Milo -Johan -Byron -Jasper -Jonathon -Chad -Marc -Kelvin -Chandler -Sam -Cory -Deandre -River -Reese -Roger -Quinton -Talon -Romeo -Franklin -Noel -Alijah -Guillermo -Gunner -Damon -Jadon -Emerson -Micheal -Bruce -Terry -Kolton -Melvin -Beckett -Porter -August -Brycen -Dayton -Jamarion -Leonel -Karson +Zachary +Zack +Zackary +Zander +Zane Zayden -Keagan -Carl -Khalil -Cristopher -Nelson -Braiden -Moses -Isaias -Roy -Triston -Walker -Kale \ No newline at end of file +Zeke +Zion \ No newline at end of file diff --git a/config/names/last.txt b/config/names/last.txt index 9bdb16ebe71..6796c7519e8 100644 --- a/config/names/last.txt +++ b/config/names/last.txt @@ -1,620 +1,570 @@ -Whittier -Dimeling -Blaine -Dennis +Ackerley Adams -Rader -Murray -Millhouse -Ludwig -Burris -Shupe -Mary -Zadovsky -Philips -Wise -Gronko -Jardine -Black -Mitchell -Enderly -Stall -Harrow -Atweeke -Sealis -Conrad -Lucy -Stewart -Green -Feufer -Warren -Campbell -Shafer -Woodworth -Magor -Logue -Reichard -Day -Dugmore -Murray -Greenawalt -Jyllian -Osterwise -Styles -Cavalet -Garneys -Raub -Sholl -Chauvin -Poley -Todd -Brandenburg -Baer -Pritchard -Pinney -Kadel -Anderson -Clarke -Hunt -Gadow -Stough -Marcotte -Brooks -Watson -Nash -Sheets -Ashbaugh -Zimmer -Noton -Dean -Fleming -Draudy -Bluetenberger -Fischer -Hawkins -Poehl Addison -Mcintosh -Keppel -Kimple +Agg +Aggley +Ahmed +Albright +Alekseev +Ali Alice -Stone -Fiscina -Leichter -Wile -Callison -Cowper -Harrold -Carr -Eckhardstein -Wilkerson -Shirey -Benford -Reade +Allen +Alliman +Altmann +Anderson +Andreev +Ann +Archibald +Armstrong +Ashbaugh +Atkinson +Atweeke +Aultman +Auman +Baer +Bailey +Baker +Barnes +Barrett +Bash +Bashline +Basinger Baskett -Seidner +Basmanoff +Batten +Baum +Baxter +Beach +Beail +Beck +Beedell +Begum +Bell +Benford +Bennett +Berkheimer +Best +Bickerson +Bicknell +Biery +Black +Blackburn +Blaine +Blessig +Bloise +Bluetenberger +Blyant +Bode +Bould +Bousum +Bowchiew +Boyer +Brandenburg +Bratton +Braun +Briggs +Brindle +Briner +Brinigh +Brooks +Brown +Bullard +Bunten +Burkett +Burns +Burris +Butterfill +Buttersworth +Buzzard +Byers +Bynum +Caldwell +Callison +Camp +Campbell +Carmichael +Carr +Carter +Catherina +Catleay +Cavalet +Chapman +Chauvin +Cherry +Christman +Christopher +Clark +Clarke +Clewett +Coates +Coldsmith +Collins +Compton +Conrad +Cook +Cooper +Costello +Cowart +Cowper +Cox +Cressman +Curry +Cypret +David +Davies +Davis +Dawkins +Day +Dean +Demuth +Dennis +Dickinson +Digson +Dimeling +Donkin +Draudy +Driggers +Dryfus +Dugmore +Duncan +Durstine +Earl +Easter +Echard +Eckhardstein +Edwards +Eggbert +Ehret +Elderson +Eliza +Elliott +Ellis +Enderly +Endsley +Evans +Ewing +Faqua +Faust +Fea +Feufer +Fiddler +Field +Fields +Finlay +Fischer +Fiscina +Fisher +Fitzgerald +Fleming +Flickinger +Focell +Foster +Franks +Fraser +Fryer +Fuchs +Fulton +Gadow +Gardner +Garland +Garneys +Garratt +Garrison Gettemy +Gibson +Glover +Goebbles +Goodman +Graham +Gray +Green +Greenawalt +Greene +Greenwood +Gregory +Griffiths +Gronko +Guess +Hall +Hanford +Hardie +Harding +Hardy +Harris +Harrison +Harrold +Harrow +Harshman +Hastings +Hawker +Hawking +Hawkins +Hayhurst +Haynes +Heckendora +Hegarty +Henry +Hice +Highlands +Hill +Hincken +Hirleman +Hoenshell +Holdeman +Holmes +Hook +Hooker +Hoopengarner +Hoover +Houser +Houston +Howard +Howe +Huey +Hughes +Hujsak +Hunt +Hunter +Hussain +Hutton +Hynes +Ironmonger +Isaman +Isemann +Ivanov +Jackson +James +Jardine +Jenkins +Jenner +Jerome +Jesse +Jewell +Joghs +Johnson +Jones +Jowers Joyce Judge -Burkett -Kiefer -Carmichael -Hirleman -Wells -Isemann -Cressman -Highlands -Briggs -Rowley -Coldsmith -Berkheimer -Hill -Maclagan -Mcfall -Mens -Braun -James -Sloan -Bould -Overstreet +Jyllian +Kadel Kanaga -Polson -Finlay -Sandys -Bousum -Howard -Treeby -Stainforth -Werner -Sulyard -Marriman -Weinstein -Butterfill -Mason -Coates -Peters -Gregory -Wilo -Edwards -Barnes -Harding -Tireman -Lombardi -Roberts -Faqua -Basmanoff -Mccune -Mckendrick -Oppenheimer -Oneal -Focell -Tedrow -Fields -Ryals -Best -Zaun -Knapp -Linton -Jackson -Bullard -Mcloskey -Zoucks -Heckendora -Hoenshell -Woollard -Mueller -Burns -Franks -Goodman -Stern -Robinson -Hooker -David -Fitzgerald -Vanleer -Beach -Flickinger -Metzer -Bynum -Stafford -Osteen -Johnson -Paynter -Thomlinson -Simmons -Basinger -Fisher -Bunten -Compton -Archibald -Catherina -Rahl -Bowchiew -Tennant -Mccullough -Margaret -Schaeffer -Sommer -Beail -Merryman -Knapenberger -Patterson -Houston -Lacon -Levett -Sullivan -Sidower -Laborde -Stroh -Hice -Biery -Christman -Staymates -Sauter -Snyder -Bratton -Sybilla -Altmann -Mathews -Newbern -Baker -Kemble -Mingle -Unk -Otis -Quinn -Bell -Roberts -Wood -Ullman -Bicknell -Gibson -Rohtin -James -Wallick -Eggbert -Losey -Neely -Catleay -McDonald -Beedell -Williamson -Bennett -Potter -Caldwell -Lowe -Durstine -King -Gardner -Ulery -Rifler -Trovato -Thomas -Nehling -Baum -Werry -Mcmullen -Koster -Willey -Mildred -Straub -Haynes -Baxter -Ackerley -Greene -Atkinson -Davis -Weeter -Milne -Leech -Clewett -Ewing -Hook -Reighner -Welty -Jenkins -Bennett -Swarner -Hawker -Agg -Batten -Cherry -Shaffer -Yeskey -Stephenson -Pycroft -Larson -Joghs -Keener -Christopher -Roadman -Echard -Priebe -Auman -Kemerer -Sutton -Prechtl -Cowart -Ringer -Garratt -Siegrist -Seelig -Lafortune -Dryfus -Isaman -Teagarden -Evans -Wolfe -Fiddler -Jowers -Aultman -Olphert -Howe -Leslie -Stocker -Bode -Whirlow -Ann -Mcclymonds -Guess -Taggart -Pratt -Moon -Huey -Hegarty -Meyers -Stahl -Nickolson -Mortland -Perkins -Thorley -Fuchs -Ray -Schrader -Kellogg -Woodward -Faust -Roby -Bashline -Cypret -Laurenzi -Minnie -Houser -Langston -Anderson -Barrett -Wible -Hujsak -Wardle -Pershing -Kuster -Driggers -Wheeler -Garland -Alliman -Hoover -Camp -Hall -Parkinson -Swabey -Mull -Cox -Hanford -Stange -Wolff -Jesse -Brinigh -Koepple -Schmidt -Muller -Schofield -Zalack -Pfeifer -Fea -Blackburn -Ward -Kifer -Costello -Donkin -Osterweis -Brindle -Llora -Duncan -Ehret -Fryer -Summy -Richards -Boyer -Hutton -Mosser -Lester -Stroble -Randolph -Lord -Scott -Nicholas -Smail -Ratcliff -Riggle -Newton -Sanders -Mitchell -Lauffer -Aggley -Moberly -Hynes -Pennington -Woolery -Hardie -Blessig -Tanner -Demuth -Fraser -Henry -Shick -Ironmonger -Scherer -Field -Prevatt -Earl -Paulson -Curry -Powers -Rosensteel -Hoopengarner -Weisgarber -Elliott -Pearsall -Lowstetter -Holdeman -Kepplinger -Bloise -Hunter -Glover -Hayhurst -Wentzel -Owens -Smith -Steele -Leach -Armstrong -Wheeler -Easter -Greenwood -Woodward -Pratt -Buzzard -Cox -Eliza -Rockwell -Zeal -Harshman -Northey -Tilton -Richter -Moore -Jerome -Hardy -Bickerson -White -Beck -Waldron -Fulton -Miller -Sandford -Hughes -Winton -Digson -Byers -Hincken -Shaner -Todd -Whiteman -Lineman -Albright -Hastings -Elderson -Garrison -Rose -Kelley -Quirin -Dickinson -Young -Ramos -Jewell -Endsley -Briner -Jenner -Saylor -Bash -Blyant -Rhinehart -Prescott -Kirkson -Picard -Riker -Spock -Skywalker -Vader -Muggins -Buttersworth -Stamos -Sagan -Hawking -Dawkins -Goebbles -McShain -McDonohugh -Power -Smith -Jones -Williams -Brown -Taylor -Davies -Wilson -Evans -Thomas -Roberts -Johnson -Walker -Wright -Robinson -Thompson -Hughes -White -Edwards -Hall -Patel -Green -Martins -Lewis -Wood -Jackson -Clarke -Harris -Clark -Scott -Turner -Hill -Moore -Cooper -Morris -Ward -Watson -Morgan -Anderson -Harrison -King -Campbell -Young -Mitchell -Baker -James -Kelly -Allen -Bell -Phillips -Lee -Stewart -Miller -Parker -Simpson -Bennett -Davis -Griffiths -Shaw -Price -Cook -Richardson -Murray -Marshall -Begum -Murphy -Khan -Gray -Collins -Bailey -Carter -Robertson -Graham -Adams -Richards -Cox -Singh -Hussain -Ellis -Wilkinson -Foster -Thomson -Russell -Ali -Reid -Rathens -Rathen -Mason -Chapman -Powell -Owen -Ahmed -Gibson -Rogers -Webb -Holmes -Mills -Matthews -Hunt -Palmer -Lloyd Kaur -Fisher -Ivanov -Smirnov -Vasilyev -Petrov +Keener +Kelley +Kellogg +Kelly +Kemble +Kemerer +Keppel +Kepplinger +Khan +Kiefer +Kifer +Kimple +King +Kirkson +Knapenberger +Knapp +Koepple +Koster +Kuster Kuznetsov +Laborde +Lacon +Lafortune +Langston +Larson +Lauffer +Laurenzi +Leach +Lee +Leech +Leichter +Leslie +Lester +Levett +Lewis +Lineman +Linton +Llora +Lloyd +Logue +Lombardi +Lord +Losey +Lowe +Lowstetter +Lucy +Ludwig +Maclagan +Magor +Marcotte +Margaret +Marriman +Marshall +Martins +Mary +Mason +Mathews +Matthews +Mcclymonds +Mccullough +Mccune +McDonald +McDonohugh +Mcfall +Mcintosh +Mckendrick +Mcloskey +Mcmullen +McShain +Mens +Merryman +Metzer +Meyers Mikhaylov +Mildred +Miller +Millhouse +Mills +Milne +Mingle +Minnie +Mitchell +Moberly +Moon +Moore +Morgan +Morris +Mortland +Mosser +Mueller +Muggins +Mull +Muller +Murphy +Murray +Nash +Neely +Nehling +Newbern +Newton +Nicholas +Nickolson +Northey +Noton +Olphert +Oneal +Oppenheimer +Osteen +Osterweis +Osterwise +Otis +Overstreet +Owen +Owens +Palmer +Parker +Parkinson +Patel +Patterson +Paulson Pavlov +Paynter +Pearsall +Pennington +Perkins +Pershing +Peters +Petrov +Pfeifer +Philips +Phillips +Picard +Pinney +Poehl +Poley +Polson +Potter +Powell +Power +Powers +Pratt +Prechtl +Prescott +Prevatt +Price +Priebe +Pritchard +Pycroft +Quinn +Quirin +Rader +Rahl +Ramos +Randolph +Ratcliff +Rathen +Rathens +Raub +Ray +Reade +Reichard +Reid +Reighner +Rhinehart +Richards +Richardson +Richter +Rifler +Riggle +Riker +Ringer +Roadman +Roberts +Robertson +Robinson +Roby +Rockwell +Rogers +Rohtin +Rose +Rosensteel +Rowley +Russell +Ryals +Sagan +Sanders +Sandford +Sandys +Sauter +Saylor +Schaeffer +Scherer +Schmidt +Schofield +Schrader +Scott +Sealis +Seelig +Seidner Semenov -Andreev -Alekseev \ No newline at end of file +Shafer +Shaffer +Shaner +Shaw +Sheets +Shick +Shirey +Sholl +Shupe +Sidower +Siegrist +Simmons +Simpson +Singh +Skywalker +Sloan +Smail +Smirnov +Smith +Snyder +Sommer +Spock +Stafford +Stahl +Stainforth +Stall +Stamos +Stange +Staymates +Steele +Stephenson +Stern +Stewart +Stocker +Stone +Stough +Straub +Stroble +Stroh +Styles +Sullivan +Sulyard +Summy +Sutton +Swabey +Swarner +Sybilla +Taggart +Tanner +Taylor +Teagarden +Tedrow +Tennant +Thomas +Thomlinson +Thompson +Thomson +Thorley +Tilton +Tireman +Todd +Treeby +Trovato +Turner +Ulery +Ullman +Unk +Vader +Vanleer +Vasilyev +Waldron +Walker +Wallick +Ward +Wardle +Warren +Watson +Webb +Weeter +Weinstein +Weisgarber +Wells +Welty +Wentzel +Werner +Werry +Wheeler +Whirlow +White +Whiteman +Whittier +Wible +Wile +Wilkerson +Wilkinson +Willey +Williams +Williamson +Wilo +Wilson +Winton +Wise +Wolfe +Wolff +Wood +Woodward +Woodworth +Woolery +Woollard +Wright +Yeskey +Young +Zadovsky +Zalack +Zaun +Zeal +Zimmer +Zoucks \ No newline at end of file diff --git a/config/names/lizard_male.txt b/config/names/lizard_male.txt index 9327b92e61f..f14f1705ba4 100644 --- a/config/names/lizard_male.txt +++ b/config/names/lizard_male.txt @@ -46,8 +46,8 @@ Da Dakee Dan Dar -DarJee Darasken +DarJee Debameel Deed Deegeeta diff --git a/config/names/mime.txt b/config/names/mime.txt index 14845a89b40..520d3affce9 100644 --- a/config/names/mime.txt +++ b/config/names/mime.txt @@ -1,24 +1,24 @@ -Mr. Beret +Invisible Man +Lemon Mime +Marcel +Marcel Mime Mime -Mr. Mime -Mr. Mute +Mr Beret +Mr Mime +Mr Mute +Mute +Omerta +Oui Oui +Pantomime +Quiet +Quiet Riot Silence Silencio -Quiet -Silent Sorrow Silent Knight -Silent Night -Untouchable -Unspeakable -Mute -Marcel Mime -Marcel -Pantomime -Omerta -Lemon Mime -Invisible Man -Transparency -Quiet Riot Silent Majority -Wall Runner -Oui Oui \ No newline at end of file +Silent Night +Silent Sorrow +Transparency +Unspeakable +Untouchable +Wall Runner \ No newline at end of file diff --git a/config/names/ninjaname.txt b/config/names/ninjaname.txt index 42b74817041..eb470493fa4 100644 --- a/config/names/ninjaname.txt +++ b/config/names/ninjaname.txt @@ -1,44 +1,44 @@ -Shadow -Sarutobi -Smoke -Rain -Scorpion -Zero -Ermac -Saibot -Cyrax -Raphael -Michaelangelo -Donatello -Leonardo -Splinter -Shredder -Hazuki -Hien -Hiryu -Ryu -Hayabusa -Midnight -Seven -McNinja -Hanzo +Aria +Baki Blood +Bro +Cyrax +Daemon +Death +Donatello +Eater +Ermac +Fox +Goemon +Hanzo +Hayabusa +Hazuki +Hero +Hien +Hiro +Hiryu Iga Koga -Hero -Hiro -Phantom -Baki -Ogre -Daemon -Goemon +Leonardo McAwesome -Throat -Death -Aria -Bro -Fox +McNinja +Michaelangelo +Midnight Null +Ogre +Phantom Raiden +Rain +Raphael +Ryu +Saibot Samurai -Eater \ No newline at end of file +Sarutobi +Scorpion +Seven +Shadow +Shredder +Smoke +Splinter +Throat +Zero \ No newline at end of file diff --git a/config/names/ninjatitle.txt b/config/names/ninjatitle.txt index 078ae36fc10..f9776f56fed 100644 --- a/config/names/ninjatitle.txt +++ b/config/names/ninjatitle.txt @@ -1,46 +1,46 @@ -Master -Sensei -Swift -Merciless -Assassin -Rogue -Hunter -Widower -Orphaner -Stalker -Killer -Silent -Silencing -Quick Agile -Merciful -Ninja -Shinobi -Initiate -Grandmaster -Strider -Striker -Slayer +Assassin Awesome -Ender -Dr. -Noob -Night -Crimson -Grappler -Ulimate -Remorseless -Deep -Dragon -Cruel -Nightshade Black +Crimson +Cruel +Deep +Dr +Dragon +Ender +Grandmaster +Grappler Gray -Solid +Hunter +Initiate +Killer Liquid -Solidus -Steel +Master +Merciful +Merciless Nickel +Night +Nightshade +Ninja +Noob +Orphaner +Quick +Remorseless +Rogue +Sensei +Shinobi +Silencing +Silent Silver Singing -Snake \ No newline at end of file +Slayer +Snake +Solid +Solidus +Stalker +Steel +Strider +Striker +Swift +Ulimate +Widower \ No newline at end of file diff --git a/config/names/verbs.txt b/config/names/verbs.txt index 5bb8d6e3139..fc90f89e400 100644 --- a/config/names/verbs.txt +++ b/config/names/verbs.txt @@ -58,7 +58,6 @@ bounce bow box brake -brake branch breathe bruise diff --git a/config/names/wizardfirst.txt b/config/names/wizardfirst.txt index 18806ca74b7..9dcab3f005a 100644 --- a/config/names/wizardfirst.txt +++ b/config/names/wizardfirst.txt @@ -1,36 +1,36 @@ -Jim -Gulstaff +Alatar +Archchancellor +Boccob +Circe +Dumbledor +Elminister Gandalf Grimm -Mordenkainen -Elminister -Saruman -Vaarsuvius -Yoda -Zul -Nihilus -Vecna +Gulstaff +Houdini +Jim +Kaschei +Khelben +Kreol +Lina +Merlin Mogan -Circe +Mordenkainen +Morgan +Mystryl +Nihilus +Palando Prospero +Radagast Raistlin Rasputin -Tzeentch -Khelben -Dumbledor -Houdini -Terefi -Urza +Saruman Tenser +Terefi +Tzeentch +Urza +Vaarsuvius +Vecna +Yoda Zagyg -Mystryl -Boccob -Merlin -Archchancellor -Radagast -Kreol -Kaschei -Lina -Morgan -Alatar -Palando \ No newline at end of file +Zul \ No newline at end of file diff --git a/config/names/wizardsecond.txt b/config/names/wizardsecond.txt index 1fe60bdb275..9193ef1e97d 100644 --- a/config/names/wizardsecond.txt +++ b/config/names/wizardsecond.txt @@ -1,39 +1,39 @@ -the Powerful -the Great -the Magician -the Wise -the Seething -the Amazing -the Spiral King -Darkmagic -the White -the Gray -Shado -the Sorcelator -the Raven -the Emperor -the Brown -Weatherwax -the Destroyer -the Deathless -Yagg -the Remorseful -the Weeping -the Unending -the All Knowing Dark -Smith -the Conquerer -the Unstoppable -Gray -of Void -Unseen +Darkmagic Darko +Gray Honko -the Bandit Killer -the Dragon Spooker Inverse le Fay +of Void +Shado +Smith +the All Knowing +the Amazing +the Bandit Killer +the Benevolent the Blue +the Brown +the Conquerer +the Deathless +the Destroyer +the Dragon Spooker +the Emperor +the Gray +the Great +the Magician +the Powerful +the Raven the Red -the Benevolent \ No newline at end of file +the Remorseful +the Seething +the Sorcelator +the Spiral King +the Unending +the Unstoppable +the Weeping +the White +the Wise +Unseen +Weatherwax +Yagg \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index 92e133dc46a..658fc52d737 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,30 @@ -->
+

20 September 2015

+

Xhuis updated:

+
    +
  • Rites have been renamed to their old runes, which reflect their functionality.
  • +
  • Examining a talisman no longer opens the paper GUI.
  • +
  • Armor talismans have been re-added.
  • +
  • EMP talismans now have the same range as their rune counterpart.
  • +
  • Some talismans now cost health to use, costing more or less depending on their effect.
  • +
  • Scribing runes now deals 0.1 brute damage instead of 1.
  • +
  • Bind Talisman runes no longer deal 5 brute damage when invoking.
  • +
  • Rune shapes and colors are now identical to their old versions.
  • +
  • Conversion runes can no longer be used by yourself, and require a static 2 cultists.
  • +
+ +

19 September 2015

+

Xhuis updated:

+
    +
  • Shadowlings are now able to sacrifice a thrall to extend the shuttle timer by 15 minutes. This will not stack.
  • +
  • Additional abilities granted by Collective Mind will now properly have icons.
  • +
  • Shadowlings now have their antagonism removed if turned into a silicon.
  • +
  • The order of abilities unlocked by Collective Mind has been changed. It now starts with Sonic Screech.
  • +
  • Veil now destroys glowshrooms in a much larger radius than before.
  • +
+

17 September 2015

bgobandit updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index be3e9459aaf..08977054b3a 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -1821,3 +1821,26 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. metal) to contain radiation.' - rscadd: New portable nuke, self-destruct terminal, syndie screwdriver sprites by WJohnston. +2015-09-19: + Xhuis: + - rscadd: Shadowlings are now able to sacrifice a thrall to extend the shuttle timer + by 15 minutes. This will not stack. + - bugfix: Additional abilities granted by Collective Mind will now properly have + icons. + - bugfix: Shadowlings now have their antagonism removed if turned into a silicon. + - tweak: The order of abilities unlocked by Collective Mind has been changed. It + now starts with Sonic Screech. + - tweak: Veil now destroys glowshrooms in a much larger radius than before. +2015-09-20: + Xhuis: + - tweak: Rites have been renamed to their old runes, which reflect their functionality. + - tweak: Examining a talisman no longer opens the paper GUI. + - tweak: Armor talismans have been re-added. + - tweak: EMP talismans now have the same range as their rune counterpart. + - tweak: Some talismans now cost health to use, costing more or less depending on + their effect. + - tweak: Scribing runes now deals 0.1 brute damage instead of 1. + - tweak: Bind Talisman runes no longer deal 5 brute damage when invoking. + - tweak: Rune shapes and colors are now identical to their old versions. + - tweak: Conversion runes can no longer be used by yourself, and require a static + 2 cultists. diff --git a/html/changelogs/Kor-PR-Control.yml b/html/changelogs/Kor-PR-Control.yml new file mode 100644 index 00000000000..3eb4a50f1af --- /dev/null +++ b/html/changelogs/Kor-PR-Control.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +# tgs (TG-ported fixes?) +################################# + +# Your name. +author: Kor + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "A new admin command, Offer Control to Ghosts, can be found in the view variables menu. It will randomly select a willing candidate from among dead players, providing a fair method of replacing antagonists." diff --git a/html/changelogs/Xhuis-DemonsAndMorphs.yml b/html/changelogs/Xhuis-DemonsAndMorphs.yml new file mode 100644 index 00000000000..608375dd2c7 --- /dev/null +++ b/html/changelogs/Xhuis-DemonsAndMorphs.yml @@ -0,0 +1,23 @@ +author: Xhuis +delete-after: True + +changes: + - tweak: "When a morph changes form, a message is shown to nearby people. This also happens upon undisguising." + - tweak: "Morphs now have an attack sound and message." + - tweak: "The Spawn Morph event now plays a sound to the chosen candidate." + - tweak: "Slaughter demons (and other creatures with blood crawl) now take two seconds to emerge from blood pools. Entering is still instantaneous." + - tweak: "The demon heart's sprite has been updated." + - tweak: "Eating a demon heart now surgically implants the heart into your chest. If the heart is removed from you, you lose the ability. Someone else can eat the heart to gain the ability." + - tweak: "Blood Crawl no longer has a 1-second cooldown, instead having none." + - tweak: "You can no longer hold items when attempting to Blood Crawl, nor can you use any items while Blood Crawling." + - tweak: "Creatures that can Blood Crawl now take two seconds to emerge from blood pools." + - tweak: "Slaughter demons now store devoured creatures, and will drop them upon death." + - tweak: "Revenants now have the ability to speak to the dead." + - tweak: "Revenant abilities now have icons." + - tweak: "Malfunction no longer EMPs a specific area - it will instead EMP nearby machines directly and stun cyborgs. Dominators are immune to this." + - tweak: "Revenants now have directional sprites." + - tweak: "Overload Lights now has a smaller radius." + - tweak: "Defile no longer corrupts tiles." + - tweak: "When glimmering residue reforms, the game will attempt to place the old revenant in control of the new one. If this cannot be done, it will find a random candidate." + - tweak: "Revenants can no longer see ghosts. They can see other revenants, however, and ghosts can still see revenants." + - tweak: "The Spawn Slaughter Demon event now plays a sound to the chosen candidate." \ No newline at end of file diff --git a/html/changelogs/phil235-DnaMonkeyStuff.yml b/html/changelogs/phil235-DnaMonkeyStuff.yml new file mode 100644 index 00000000000..cee62b62a22 --- /dev/null +++ b/html/changelogs/phil235-DnaMonkeyStuff.yml @@ -0,0 +1,12 @@ +author: phil235 +delete-after: True + +changes: + - rscdel: "Lizards and other non human species can no longer acquire the hulk mutation. Hulks no longer have red eyes" + - bugfix: "Monkeys now always have dna and a blood type (compatible with humans)." + - bugfix: "Monkey transformation no longer deletes the human's clothes." + - bugfix: "Space Retrovirus now correctly transfers dna SE to the infected human." + - bugfix: "Changeling's Anatomic Panacea removes alien embryo again." + - bugfix: "Cloning someone now correctly sets up their dna UE." + - bugfix: "Fixes the laser eyes mutation not giving glowing red eyes to the human." + - bugfix: "Using changeling readaptation now properly removes all evolutions bought (arm blade, chameleon skin, organic suit)." diff --git a/html/changelogs/xxalpha-nanites.yml b/html/changelogs/xxalpha-nanites.yml new file mode 100644 index 00000000000..478a2163140 --- /dev/null +++ b/html/changelogs/xxalpha-nanites.yml @@ -0,0 +1,6 @@ +author: xxalpha + +delete-after: True + +changes: + - rscadd: "Added a researchable cyborg self-repair module to the robotics fabricator." \ No newline at end of file diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi index b81a0e94104..250ed8f3dc4 100644 Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ diff --git a/icons/effects/genetics.dmi b/icons/effects/genetics.dmi index ba81afe9d11..768be9b9231 100644 Binary files a/icons/effects/genetics.dmi and b/icons/effects/genetics.dmi differ diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index 23f5e04c7db..c1ffea30969 100644 Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index eefdb1ad455..bfb8378f049 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 76d807e61d8..fb295a1cf5d 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 7f29bc82e7a..c71e05f382a 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/doors/airlocks/hatch/overlays.dmi b/icons/obj/doors/airlocks/hatch/overlays.dmi index 738f7e8fce5..38f8b50f420 100644 Binary files a/icons/obj/doors/airlocks/hatch/overlays.dmi and b/icons/obj/doors/airlocks/hatch/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/station/atmos.dmi b/icons/obj/doors/airlocks/station/atmos.dmi index 85e5f3c1094..21fe5d2aab8 100644 Binary files a/icons/obj/doors/airlocks/station/atmos.dmi and b/icons/obj/doors/airlocks/station/atmos.dmi differ diff --git a/icons/obj/doors/airlocks/station/command.dmi b/icons/obj/doors/airlocks/station/command.dmi index e473eb1cd10..90b3e4238d1 100644 Binary files a/icons/obj/doors/airlocks/station/command.dmi and b/icons/obj/doors/airlocks/station/command.dmi differ diff --git a/icons/obj/doors/airlocks/station/engineering.dmi b/icons/obj/doors/airlocks/station/engineering.dmi index 1f77793bce0..816a84538c1 100644 Binary files a/icons/obj/doors/airlocks/station/engineering.dmi and b/icons/obj/doors/airlocks/station/engineering.dmi differ diff --git a/icons/obj/doors/airlocks/station/medical.dmi b/icons/obj/doors/airlocks/station/medical.dmi index cb10aca0763..f7cb5be24ef 100644 Binary files a/icons/obj/doors/airlocks/station/medical.dmi and b/icons/obj/doors/airlocks/station/medical.dmi differ diff --git a/icons/obj/doors/airlocks/station/mining.dmi b/icons/obj/doors/airlocks/station/mining.dmi index a4628613568..23dee39ef6a 100644 Binary files a/icons/obj/doors/airlocks/station/mining.dmi and b/icons/obj/doors/airlocks/station/mining.dmi differ diff --git a/icons/obj/doors/airlocks/station/public.dmi b/icons/obj/doors/airlocks/station/public.dmi index 3c2bdbcaa93..0449817360e 100644 Binary files a/icons/obj/doors/airlocks/station/public.dmi and b/icons/obj/doors/airlocks/station/public.dmi differ diff --git a/icons/obj/doors/airlocks/station/research.dmi b/icons/obj/doors/airlocks/station/research.dmi index ba483f8d3cf..e2a834d133c 100644 Binary files a/icons/obj/doors/airlocks/station/research.dmi and b/icons/obj/doors/airlocks/station/research.dmi differ diff --git a/icons/obj/doors/airlocks/station/science.dmi b/icons/obj/doors/airlocks/station/science.dmi index 11290674546..a3aa87c5a6e 100644 Binary files a/icons/obj/doors/airlocks/station/science.dmi and b/icons/obj/doors/airlocks/station/science.dmi differ diff --git a/icons/obj/doors/airlocks/station/security.dmi b/icons/obj/doors/airlocks/station/security.dmi index 8f42fcb4b3b..c6f01195abb 100644 Binary files a/icons/obj/doors/airlocks/station/security.dmi and b/icons/obj/doors/airlocks/station/security.dmi differ diff --git a/icons/obj/doors/airlocks/station/virology.dmi b/icons/obj/doors/airlocks/station/virology.dmi index 12123fc71b5..79ac14dffc3 100644 Binary files a/icons/obj/doors/airlocks/station/virology.dmi and b/icons/obj/doors/airlocks/station/virology.dmi differ diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index 1c0e0a73d79..415ce62a797 100644 Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi index e7fc43e6109..fb68f0bcc65 100644 Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 72ef46c7163..a9efb0990f4 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index a0ad4429129..6ea13bfc621 100644 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index e1f7fe92119..53e3b56f76c 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 23408636bb2..7db1daad4ec 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -399,6 +399,7 @@ #include "code\game\machinery\cloning.dm" #include "code\game\machinery\constructable_frame.dm" #include "code\game\machinery\deployable.dm" +#include "code\game\machinery\dna_scanner.dm" #include "code\game\machinery\doppler_array.dm" #include "code\game\machinery\droneDispenser.dm" #include "code\game\machinery\flasher.dm" @@ -463,6 +464,7 @@ #include "code\game\machinery\computer\communications.dm" #include "code\game\machinery\computer\computer.dm" #include "code\game\machinery\computer\crew.dm" +#include "code\game\machinery\computer\dna_console.dm" #include "code\game\machinery\computer\HolodeckControl.dm" #include "code\game\machinery\computer\law.dm" #include "code\game\machinery\computer\medical.dm" @@ -734,7 +736,6 @@ #include "code\game\objects\structures\janicart.dm" #include "code\game\objects\structures\kitchen_spike.dm" #include "code\game\objects\structures\ladders.dm" -#include "code\game\objects\structures\lamarr_cage.dm" #include "code\game\objects\structures\lattice.dm" #include "code\game\objects\structures\mineral_doors.dm" #include "code\game\objects\structures\mirror.dm" @@ -959,6 +960,7 @@ #include "code\modules\detectivework\footprints_and_rag.dm" #include "code\modules\detectivework\scanner.dm" #include "code\modules\emoji\emoji_parse.dm" +#include "code\modules\events\abductor.dm" #include "code\modules\events\alien_infestation.dm" #include "code\modules\events\anomaly.dm" #include "code\modules\events\anomaly_bluespace.dm" @@ -1217,7 +1219,6 @@ #include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" #include "code\modules\mob\living\silicon\ai\freelook\eye.dm" #include "code\modules\mob\living\silicon\ai\freelook\read_me.dm" -#include "code\modules\mob\living\silicon\ai\freelook\update_triggers.dm" #include "code\modules\mob\living\silicon\pai\death.dm" #include "code\modules\mob\living\silicon\pai\examine.dm" #include "code\modules\mob\living\silicon\pai\life.dm" @@ -1242,6 +1243,7 @@ #include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" #include "code\modules\mob\living\simple_animal\bot_swarm\swarmer.dm" +#include "code\modules\mob\living\simple_animal\bot_swarm\swarmer_event.dm" #include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" #include "code\modules\mob\living\simple_animal\friendly\crab.dm" diff --git a/tools/check_filedirs.sh b/tools/check_filedirs.sh new file mode 100755 index 00000000000..30df015763e --- /dev/null +++ b/tools/check_filedirs.sh @@ -0,0 +1,15 @@ +#!/bin/bash +if [ -n "$1" ] +then + dme=$1 +else + echo "Specify a DME to check" + exit 1 +fi + +if [[ $(awk '/BEGIN_FILE_DIR/{flag=1;next}/END_FILE_DIR/{flag=0}flag' $dme | wc -l) -ne 1 ]] +then + echo "File DIR was ticked, please untick it, see: https://tgstation13.org/phpBB/viewtopic.php?f=5&t=321 for more" + exit 1 +fi +