Merge remote-tracking branch 'remotes/upstream/master' into thaw

This commit is contained in:
Xhuis
2015-06-16 11:42:47 -04:00
359 changed files with 5479 additions and 2929 deletions
+2 -2
View File
@@ -3,8 +3,8 @@ language: c
env:
global:
- BYOND_MAJOR="506"
- BYOND_MINOR="1247"
- BYOND_MAJOR="507"
- BYOND_MINOR="1286"
matrix:
- DM_MAPFILE="tgstation2"
- DM_MAPFILE="metastation"
@@ -1475,7 +1475,7 @@
"aCs" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/crew_quarters/sleep)
"aCt" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/sign/pods{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/sleep)
"aCu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/starboard)
"aCv" = (/obj/structure/table,/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "High-Risk Modules"; req_access_txt = "20"},/obj/structure/window/reinforced,/obj/machinery/flasher{pixel_x = 0; pixel_y = 24; id = "AI"},/obj/item/weapon/aiModule/core/full/antimov,/obj/item/weapon/aiModule/supplied/oxygen,/obj/item/weapon/aiModule/zeroth/oneHuman,/obj/item/weapon/aiModule/reset/purge,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"aCv" = (/obj/structure/table,/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "High-Risk Modules"; req_access_txt = "20"},/obj/structure/window/reinforced,/obj/machinery/flasher{pixel_x = 0; pixel_y = 24; id = "AI"},/obj/item/weapon/aiModule/core/full/antimov,/obj/item/weapon/aiModule/supplied/oxygen,/obj/item/weapon/aiModule/supplied/protectStation,/obj/item/weapon/aiModule/zeroth/oneHuman,/obj/item/weapon/aiModule/reset/purge,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"aCw" = (/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
"aCx" = (/obj/structure/dispenser,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
"aCy" = (/obj/machinery/camera{c_tag = "Engineering - Storage"; dir = 2; network = list("SS13")},/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
@@ -2299,7 +2299,7 @@
"aSk" = (/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "Upload APC"; pixel_y = -24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/camera/motion{c_tag = "AI Upload Chamber - Port"; dir = 1; network = list("SS13","RD","AIUpload")},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
"aSl" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"aSm" = (/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; name = "Private AI Channel"; pixel_y = -25},/obj/machinery/camera/motion{c_tag = "AI Upload Chamber - Starboard"; dir = 1; network = list("SS13","RD","AIUpload")},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
"aSn" = (/obj/structure/table,/obj/machinery/light{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/flasher{id = "AI"; pixel_x = 0; pixel_y = -24},/obj/item/weapon/aiModule/supplied/protectStation,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"aSn" = (/obj/structure/table,/obj/machinery/light{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/flasher{id = "AI"; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"aSo" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
"aSp" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/crew_quarters/courtroom)
"aSq" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom)
File diff suppressed because it is too large Load Diff
@@ -351,8 +351,8 @@
"agM" = (/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j2s"; sortType = 7},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
"agN" = (/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j2s"; sortType = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/security/main)
"agO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/security/main)
"agP" = (/turf/simulated/wall,/area/shuttle/pod_3)
"agQ" = (/turf/space,/turf/simulated/wall/shuttle{dir = 2; icon_state = "swall_f10"; layer = 2},/area/space)
"agP" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/simulated/floor/plating,/area/shuttle/pod_3)
"agQ" = (/turf/space,/turf/simulated/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/shuttle/pod_3)
"agR" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Security Delivery"; req_access_txt = "1"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/main)
"agS" = (/obj/machinery/recharger,/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/main)
"agT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
@@ -381,7 +381,7 @@
"ahq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel,/area/security/main)
"ahr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/security/main)
"ahs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/security/main)
"aht" = (/obj/machinery/door/airlock/external{name = "Escape Pod Three"; req_access_txt = "63"},/turf/simulated/floor/plating,/area/shuttle/pod_3)
"aht" = (/turf/space,/turf/simulated/wall/shuttle{dir = 2; icon_state = "swall_f10"; layer = 2},/area/shuttle/pod_3)
"ahu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/main)
"ahv" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/main)
"ahw" = (/obj/machinery/power/apc{dir = 4; name = "Security Office APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
@@ -403,8 +403,6 @@
"ahM" = (/obj/structure/grille,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/security/warden)
"ahN" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/main)
"ahO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (NORTH)"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
"ahP" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/simulated/floor/plating,/area/space)
"ahQ" = (/turf/space,/turf/simulated/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/space)
"ahR" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
"ahS" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
"ahT" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-y"; dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/main)
@@ -6582,9 +6580,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgabQacgabRabsackaasaclabSacmacnacoabSacpacqacrabSacsaaiacMacNacOacOacPacQacRacSactacuabEaeIaecabDabpacwacxacyacbaczaboaaaaafacAacBacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaafaaaaafaaaaaaaceaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacCaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaciacDacjacEacHaasacIabSacJacnacIabSacKacqacIabSacLaaiacMadkadladladladladmadnactacTabEaeIaecabDabpacUacVacWacbacXaboaafaafacAacYacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacZacZacZacZacZaaaadaaaaacZacZacZacZacZaafabfaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadbadbadbadbaafaafaaaadcaaaaafaafabfabfabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafhaaHaaHaaHacFaddacGabsadfadgadhabSadfadiadhabSadfadjadhabSabSaaiafnaRFaNFadVaNFadWbhdbiGactadoabEaeIaecabDaboadpadqadradsadtaboabnabmadvacBacAacAachaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadwadxadxadxadxadyadzadAadBadBadBadBadCaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaafaaaaafaaaaaaadcaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHabhadeadDadGadFadIadHadKadJadMadLadOadNadUadLaepadPadQadRaaiadSadTaNFboSaNFadXadYadZaeaabEabEaebaeTabmaboaedaboaeeaboaefaboaegaehacAaeiagParqanTanTagQaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaemaemaemaemaemaaaadzaaaaemaemaemaemaemaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaenaenaenaenaenaaaaeoaaaaenaenaenaenaenaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHadEaeqaeraeuaetaewaevafiaexavkaifaexaexaexaifaOyaOvaeyaezaaiaeAaeBaeCaeDaeEaeFaeGaeHactahoagSaeJahpabmaeLaeMaeNaeOaePaeQaeNaeRaeSaeVaeUahtamoamIamJahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaadzaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaafaafbafbafbafbafcafdafeaffaffaffaffafgaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaesaOzaRfbfTbfPabSbiEafjafkaflafmbNoafoafpafpafpabSafqafraaiafsaftafuafvafwafxafyafzactacvabnafBafCabmafDafEafFafGafHafIafJafKafLacAafMagPaptanTanTahQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacZacZacZacZacZaaaadzaaaacZacZacZacZacZaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaafaaaaafaaaaaaadcaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHabhadeadDadGadFadIadHadKadJadMadLadOadNadUadLaepadPadQadRaaiadSadTaNFboSaNFadXadYadZaeaabEabEaebaeTabmaboaedaboaeeaboaefaboaegaehacAaeiacAarqanTanTahtaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaemaemaemaemaemaaaadzaaaaemaemaemaemaemaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaenaenaenaenaenaaaaeoaaaaenaenaenaenaenaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHadEaeqaeraeuaetaewaevafiaexavkaifaexaexaexaifaOyaOvaeyaezaaiaeAaeBaeCaeDaeEaeFaeGaeHactahoagSaeJahpabmaeLaeMaeNaeOaePaeQaeNaeRaeSaeVaeUaeVamoamIamJagPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaadzaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaafaafbafbafbafbafcafdafeaffaffaffaffafgaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaesaOzaRfbfTbfPabSbiEafjafkaflafmbNoafoafpafpafpabSafqafraaiafsaftafuafvafwafxafyafzactacvabnafBafCabmafDafEafFafGafHafIafJafKafLacAafMacAaptanTanTagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacZacZacZacZacZaaaadzaaaacZacZacZacZacZaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafafPafPafPafPafPaaaafdaaaafPafPafPafPafPaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaHaaHbaMbOybkdaaHaaiadhafQadfafRafRafRafRafRafRafRafSafTafUafVafWafXafYafZagaagbagcafUagdahSageagfaggaghagiafFagjafHagkaglagmabmadvacAacAacAachaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadwadxadxadxadxadyadzadAadBadBadBadBadCaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaafdaaaaaaaaaaafaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaHaaHaaHaaHaaHaaiagnagoagpafRagqagragsagtaguafRagvagwagxagyagzagAagBagaagCagbagDagEagFafFagGagHagIagJagKaeKafAagNagOagLagMagRanUagUacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaemaemaemaemaemaaaadzaaaaemaemaemaemaemaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaenaenaenaenaenaaaafdaaaaenaenaenaenaenaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaiagVagWagXafRagYagZahaahbahcafRagvahdaheahfahgahhahiahjahjahkahlahmahnaqqaPUaPTahqahrahsahTahVahuahvahWahwabmacAahxacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaadzaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+1 -7
View File
@@ -269,22 +269,16 @@
/atom/movable/var/pressure_resistance = 5
/atom/movable/var/last_forced_movement = 0
/atom/movable/proc/experience_pressure_difference(pressure_difference, direction)
if(last_forced_movement >= world.time-10)
return 0
else if(!anchored)
if(!anchored)
if(pressure_difference > pressure_resistance)
last_forced_movement = world.time
spawn step(src, direction)
return 1
/datum/excited_group
var/list/turf_list = list()
var/breakdown_cooldown = 0
+2 -1
View File
@@ -9,8 +9,9 @@
#define MIDROUND_ANTAG 64
#define SOUND_INSTRUMENTS 128
#define SOUND_SHIP_AMBIENCE 256
#define SOUND_PRAYERS 512
#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE)
#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS)
//Chat toggles
#define CHAT_OOC 1
+10
View File
@@ -13,6 +13,16 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, undershirt_list, undershirt_m, undershirt_f)
//socks
init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f)
//lizard bodyparts (blizzard intensifies)
init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, body_markings_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails, tails_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated, animated_tails_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, snouts_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, horns_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, frills_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, spines_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines_animated, animated_spines_list)
//Species
for(var/spath in typesof(/datum/species))
+16
View File
@@ -36,6 +36,22 @@
if(FEMALE) return pick(socks_f)
else return pick(socks_list)
/proc/random_features()
if(!tails_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails, tails_list)
if(!snouts_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, snouts_list)
if(!horns_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, horns_list)
if(!frills_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, frills_list)
if(!spines_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, spines_list)
if(!body_markings_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, body_markings_list)
return(list("mcolor" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "tail" = pick(tails_list), "snout" = pick(snouts_list), "horns" = pick(horns_list), "frills" = pick(frills_list), "spines" = pick(spines_list), "body_markings" = pick(body_markings_list)))
/proc/random_hair_style(gender)
switch(gender)
if(MALE) return pick(hair_styles_male_list)
+3 -52
View File
@@ -76,12 +76,12 @@
// Used to get a properly sanitized input, of max_length
/proc/stripped_input(var/mob/user, var/message = "", var/title = "", var/default = "", var/max_length=MAX_MESSAGE_LEN)
var/name = input(user, message, title, default) as text|null
return strip_html_properly(name, max_length)
return html_encode(trim(name, max_length)) //trim is "inside" because html_encode can expand single symbols into multiple symbols (such as turning < into &lt;)
// Used to get a properly sanitized multiline input, of max_length
/proc/stripped_multiline_input(var/mob/user, var/message = "", var/title = "", var/default = "", var/max_length=MAX_MESSAGE_LEN)
var/name = input(user, message, title, default) as message|null
return strip_html_properly(name, max_length)
return html_encode(trim(name, max_length))
//Filters out undesirable characters from names
/proc/reject_bad_name(var/t_in, var/allow_numbers=0, var/max_length=MAX_NAME_LEN)
@@ -147,56 +147,7 @@
return t_out
//this proc strips html properly, this means that it removes everything between < and >, and between "http" and "://"
//also limit the size of the input, if specified to
/proc/strip_html_properly(var/input,var/max_length=MAX_MESSAGE_LEN)
if(!input)
return
if(max_length)
input = copytext(input,1,max_length)
var/sanitized_output
var/next_html_tag = findtext(input, "<")
var/next_http = findtext(input, "http", 1, next_html_tag)
//the opening and closing of the expression to skip, e.g '<' and '>'
var/opening = non_zero_min(next_html_tag, next_http)
var/closing
sanitized_output = copytext(input, 1, opening)
while(next_html_tag || next_http)
//we treat < ... >
if(opening == next_html_tag)
closing = findtext(input, ">", opening + 1)
if(closing)
next_html_tag = findtext(input, "<", closing)
next_http = findtext(input, "http", closing, next_html_tag)
else //no matching ">"
next_html_tag = 0
//we treat "http(s)://"
else
closing = findtext(input, "://", opening + 1)
if(closing)
closing += 2 //skip these extra //
next_http = findtext(input, "http", closing)
next_html_tag = findtext(input, "<", closing, next_http)
else //no matching "://"
next_http = 0
//check if we've something to skip
if(closing)
opening = non_zero_min(next_html_tag, next_http)
sanitized_output += copytext(input, closing + 1, opening)
sanitized_output += copytext(input, opening) //don't forget the remaining text
return sanitized_output
//strip_html_properly helper proc that returns the smallest non null of two numbers
//html_encode helper proc that returns the smallest non null of two numbers
//or 0 if they're both null (needed because of findtext returning 0 when a value is not present)
/proc/non_zero_min(var/a, var/b)
if(!a)
+2 -19
View File
@@ -987,25 +987,8 @@ Turf and target are seperate in case you want to teleport some distance from a t
/proc/get_turf(atom/A)
if (!istype(A))
return
if (isturf(A))
return A
var/list/atom/checked_turf_candidates = list() //prevent recursion from badmins being dumbasses
var/atom/turf_candidate = A.loc
while (!isturf(turf_candidate))
if (!turf_candidate || turf_candidate in checked_turf_candidates)
return
checked_turf_candidates += turf_candidate
//SO I BET YOU MIGHT BE WONDERING WHY I'M CHECKING THIS AGAIN.
//I'LL FUCKING TELL YOU WAY, ITS BECAUSE FOR SOME GOD DAMN REASON, WHEN THIS IS CALLED
//IN AN OBJECT'S NEW() PROC, THE FIRST CHECK WILL FUCKING PASS, BUT FUCKING RUNTIME HERE
//BITCHING ABOUT HOW IT CAN'T READ NULL.LOC, SO FUCK IT, WE CHECK THIS TWICE.
if (!turf_candidate)
return
turf_candidate = turf_candidate.loc
return turf_candidate
for(A, A && !isturf(A), A=A.loc); //semicolon is for the empty statement
return A
//Gets the turf this atom's *ICON* appears to inhabit
+9
View File
@@ -18,6 +18,15 @@ var/global/list/undershirt_f = list() //stores only undershirt name
var/global/list/socks_list = list() //stores /datum/sprite_accessory/socks indexed by name
var/global/list/socks_m = list() //stores only socks name
var/global/list/socks_f = list() //stores only socks name
//Lizard Bits (all datum lists indexed by name)
var/global/list/body_markings_list = list()
var/global/list/tails_list = list()
var/global/list/animated_tails_list = list()
var/global/list/snouts_list = list()
var/global/list/horns_list = list()
var/global/list/frills_list = list()
var/global/list/spines_list = list()
var/global/list/animated_spines_list = list()
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel")
//Female Uniforms
+65 -2
View File
@@ -33,8 +33,12 @@
clear_alert(category)
return .()
else if(alert.icon_state == "[id][severity]")
// src << "threw alert not in need of update [category] [id] [severity]"
return 0
if(alert.timeout)
clear_alert(category)
return .()
else
// src << "threw alert not in need of update [category] [id] [severity]"
return 0
// src << "updating alert [category] [id] [severity]"
else
alert = PoolOrNew(/obj/screen/alert)
@@ -63,6 +67,12 @@
return 0
alert.name = initial(path_as_obj.name)
alert.desc = initial(path_as_obj.desc)
alert.timeout = initial(path_as_obj.timeout)
if(alert.timeout)
spawn(alert.timeout)
if(alert.timeout && alerts[category] == alert && world.time >= alert.timeout)
clear_alert(category)
alert.timeout = world.time + alert.timeout - world.tick_lag
alert.mouse_opacity = 1
return alert
@@ -86,6 +96,7 @@
icon_state = "default"
name = "Alert"
desc = "Something seems to have gone wrong with this alert, so report this bug please"
var/timeout = 0 //If set to a number, this alert will clear itself after that many deciseconds
//Gas alerts
@@ -145,6 +156,37 @@ The box in your backpack has an oxygen tank and gas mask in it."
name = "High Pressure"
desc = "The air around you is hazardously thick. A fire suit would protect you."
/obj/screen/alert/blind
name = "Blind"
desc = "For whatever reason, you can't see. This may be caused by a genetic defect, eye trauma, being unconscious, \
or something covering your eyes."
/obj/screen/alert/high
name = "High"
desc = "Woah man, you're tripping balls! Careful you don't get addicted to this... if you aren't already."
/obj/screen/alert/drunk //Not implemented
name = "Drunk"
desc = "All that alcohol you've been drinking is impairing your speech, motor skills, and mental cognition. Make sure to act like it."
/obj/screen/alert/embeddedobject
name = "Embedded Object"
desc = "Something got lodged into your flesh and is causing major bleeding. It might fall out with time, but surgery is the safest way. \
If you're feeling frisky, click yourself in help intent to pull the object out."
/obj/screen/alert/asleep
name = "Asleep"
desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are."
/obj/screen/alert/weightless
name = "Weightless"
desc = "Gravity has ceased affecting you, and you're floating around aimlessly. You'll need something large and heavy, like a \
wall or lattice strucure, to push yourself off of if you want to move. A jetpack would enable free range of motion. A pair of \
magboots would let you walk around normally on the floor. Barring those, you can throw things, use a fire extuingisher, \
or shoot a gun to move around via Newton's 3rd Law of motion."
//ALIENS
/obj/screen/alert/alien_tox
name = "Plasma"
desc = "There's flammable plasma in the air. If it lights up, you'll be toast."
@@ -154,6 +196,9 @@ The box in your backpack has an oxygen tank and gas mask in it."
name = "Burning"
desc = "It's too hot! Flee to space or at least away from the flames. Standing on weeds will heal you up."
//SILICONS
/obj/screen/alert/nocell
name = "Missing Power Cell"
desc = "Unit has no power cell. No modules available until a power cell is reinstalled. Robotics may provide assistance."
@@ -167,6 +212,24 @@ Reharging stations are available in robotics, the dormitory's bathrooms. and the
name = "Low Charge"
desc = "Unit's power cell is running low. Reharging stations are available in robotics, the dormitory's bathrooms. and the AI satelite."
//Need to cover all use cases - emag, illegal upgrade module, malf AI hack, traitor cyborg
/obj/screen/alert/hacked
name = "Hacked"
desc = "Hazardous non-standard equipment detected. Please ensure any usage of this equipment is in line with unit's laws, if any."
/obj/screen/alert/locked
name = "Locked Down"
desc = "Unit has remotely locked down. Usage of a Robotics Control Computer like the one in the Research Director's \
office by your AI master or any qualified human may resolve this matter. Robotics my provide further assistance if necessary."
/obj/screen/alert/newlaw
name = "Law Update"
desc = "Laws have potentially been uploaded to or removed from this unit. Please be aware of any changes \
so as to remain in compliance with the most up-to-date laws."
timeout = 300
//OBJECT-BASED
/obj/screen/alert/buckled
name = "Buckled"
desc = "You've been buckled to something and can't move. Click the alert to unbuckle unless you're handcuffed."
+4
View File
@@ -160,6 +160,8 @@
var/aggressive_changelog = 0
var/reactionary_explosions = 0 //If we use reactionary explosions, explosions that react to walls and doors
/datum/configuration/New()
var/list/L = typesof(/datum/game_mode) - /datum/game_mode
for(var/T in L)
@@ -485,6 +487,8 @@
config.no_summon_magic = 1
if("no_summon_events")
config.no_summon_events = 1
if("reactionary_explosions")
config.reactionary_explosions = 1
else
diary << "Unknown setting in configuration: '[name]'"
+18 -4
View File
@@ -9,6 +9,7 @@ var/global/datum/controller/game_controller/master_controller = new()
var/processing_interval = 1 //The minimum length of time between MC ticks (in deciseconds). The highest this can be without affecting schedules, is the GCD of all subsystem var/wait. Set to 0 to disable all processing.
var/iteration = 0
var/cost = 0
var/SSCostPerSecond = 0
var/last_thing_processed
var/list/subsystems = list()
@@ -60,7 +61,8 @@ calculate the longest number of ticks the MC can wait between each cycle without
for(var/datum/subsystem/S in subsystems)
S.Initialize(world.timeofday, zlevel)
sleep(-1)
for(var/datum/subsystem/S in subsystems)
S.AfterInitialize(zlevel)
world << "<span class='boldannounce'>Initializations complete</span>"
world.log << "Initializations complete"
@@ -89,10 +91,11 @@ calculate the longest number of ticks the MC can wait between each cycle without
++iteration
start_time = world.timeofday
var/SubSystemRan = 0
for(var/datum/subsystem/SS in subsystems)
if(SS.can_fire > 0)
if(SS.next_fire <= world.time)
SubSystemRan = 1
timer = world.timeofday
last_thing_processed = SS.type
SS.last_fire = world.time
@@ -100,7 +103,9 @@ calculate the longest number of ticks the MC can wait between each cycle without
SS.cost = MC_AVERAGE(SS.cost, world.timeofday - timer)
if (SS.dynamic_wait)
var/oldwait = SS.wait
SS.wait = min(max(round(SS.cost*SS.dwait_delta, 0.1),SS.dwait_lower),SS.dwait_upper)
var/GlobalCostDelta = (SSCostPerSecond-(SS.cost/SS.wait))/(SS.wait/10)-1
var/NewWait = MC_AVERAGE(oldwait,(SS.cost-1.5+GlobalCostDelta)*SS.dwait_delta)
SS.wait = Clamp(round(NewWait,0.1),SS.dwait_lower,SS.dwait_upper)
if (oldwait != SS.wait)
calculateGCD()
SS.next_fire += SS.wait
@@ -109,11 +114,20 @@ calculate the longest number of ticks the MC can wait between each cycle without
sleep(-1)
cost = MC_AVERAGE(cost, world.timeofday - start_time)
if (SubSystemRan)
calculateSScost()
sleep(processing_interval)
else
sleep(50)
/datum/controller/game_controller/proc/calculateSScost()
var/newcost = 0
for(var/datum/subsystem/SS in subsystems)
if (!SS.can_fire)
continue
newcost += SS.cost/(SS.wait/10)
SSCostPerSecond = MC_AVERAGE(SSCostPerSecond,newcost)
#undef MC_AVERAGE
/datum/controller/game_controller/proc/roundHasStarted()
+6 -4
View File
@@ -3,7 +3,6 @@ var/datum/subsystem/air/SSair
/datum/subsystem/air
name = "Air"
priority = 20
cost = 5
wait = 5
dynamic_wait = 1
dwait_lower = 5
@@ -56,10 +55,12 @@ var/datum/subsystem/air/SSair
/datum/subsystem/air/Initialize(timeofday, zlevel)
setup_allturfs(zlevel)
setup_atmos_machinery(zlevel)
..()
/datum/subsystem/air/AfterInitialize(zlevel)
setup_allturfs(zlevel)
#define MC_AVERAGE(average, current) (0.8*(average) + 0.2*(current))
/datum/subsystem/air/fire()
var/timer = world.timeofday
@@ -167,15 +168,14 @@ var/datum/subsystem/air/SSair
EG.dismantle()
/datum/subsystem/air/proc/setup_allturfs(z_level)
active_turfs.Cut()
var/z_start = 1
var/z_finish = world.maxz
if(1 <= z_level && z_level <= world.maxz)
z_level = round(z_level)
z_start = z_level
z_finish = z_level
var/list/turfs_to_init = block(locate(1, 1, z_start), locate(world.maxx, world.maxy, z_finish))
for(var/turf/simulated/T in turfs_to_init)
T.CalculateAdjacentTurfs()
if(!T.blocks_air)
@@ -195,6 +195,8 @@ var/datum/subsystem/air/SSair
if(!T.air.check_turf_total(enemy_tile))
T.excited = 1
active_turfs |= T
if(active_turfs.len)
warning("There are [active_turfs.len] active turfs at roundstart, this is a mapping error caused by a difference of the air between the adjacent turfs.")
/datum/subsystem/air/proc/setup_atmos_machinery(z_level)
for (var/obj/machinery/atmospherics/AM in atmos_machinery)
+3 -1
View File
@@ -5,9 +5,11 @@ var/datum/subsystem/garbage_collector/SSgarbage
can_fire = 1
wait = 5
priority = -1
dynamic_wait = 1
dwait_delta = 5
var/collection_timeout = 300// deciseconds to wait to let running procs finish before we just say fuck it and force del() the object
var/max_run_time = 2 // how long, in deciseconds, can we run before waiting for the next tick
var/max_run_time = 1 // how long, in deciseconds, can we run before waiting for the next tick
var/delslasttick = 0 // number of del()'s we've done this tick
var/gcedlasttick = 0 // number of things that gc'ed last tick
var/totaldels = 0
+1
View File
@@ -7,6 +7,7 @@ var/datum/subsystem/lighting/SSlighting
wait = 5
priority = 1
dynamic_wait = 1
dwait_delta = 1
var/list/changed_lights = list() //list of all datum/light_source that need updating
var/changed_lights_workload = 0 //stats on the largest number of lights (max changed_lights.len)
+1 -1
View File
@@ -109,7 +109,7 @@ var/datum/subsystem/shuttle/SSshuttle
user << "The emergency shuttle has been disabled by Centcom."
return
call_reason = strip_html_properly(trim(call_reason))
call_reason = html_encode(trim(call_reason))
if(length(call_reason) < CALL_SHUTTLE_REASON_LENGTH)
user << "You must provide a reason."
+1 -1
View File
@@ -417,5 +417,5 @@ var/datum/subsystem/ticker/ticker
/datum/subsystem/ticker/proc/send_random_tip()
var/list/randomtips = file2list("config/tips.txt")
if(randomtips.len)
world << "<font color='purple'><b>Tip of the round: </b>[strip_html_properly(pick(randomtips))]</font>"
world << "<font color='purple'><b>Tip of the round: </b>[html_encode(pick(randomtips))]</font>"
+3
View File
@@ -37,6 +37,9 @@
world << "<span class='boldannounce'>[msg]</span>"
world.log << msg
/datum/subsystem/proc/AfterInitialize()
return
//hook for printing stats to the "MC" statuspanel for admins to see performance and related stats etc.
/datum/subsystem/proc/stat_entry(msg)
var/dwait = ""
+18
View File
@@ -5,6 +5,7 @@
var/list/inherent = list()
var/list/supplied = list()
var/list/ion = list()
var/mob/living/silicon/owner
/datum/ai_laws/default/asimov
name = "Three Laws of Robotics"
@@ -169,3 +170,20 @@
if (length(law) > 0)
who << "[number]. [law]"
number++
/datum/ai_laws/proc/clear_zeroth_law(var/force) //only removes zeroth from antag ai if force is 1
if(force)
src.zeroth = null
src.zeroth_borg = null
return
else
if(src.owner.mind.special_role)
return
else
src.zeroth = null
src.zeroth_borg = null
return
/datum/ai_laws/proc/associate(var/mob/living/silicon/M)
if(!owner)
owner = M
+2 -2
View File
@@ -260,7 +260,7 @@ var/record_id_num = 1001
L.fields["enzymes"] = H.dna.struc_enzymes
L.fields["identity"] = H.dna.uni_identity
L.fields["species"] = H.dna.species.type
L.fields["mcolor"] = H.dna.mutant_color
L.fields["features"] = H.dna.features
L.fields["image"] = image
locked += L
return
@@ -272,7 +272,7 @@ var/record_id_num = 1001
photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]_s")
else
photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]_s")
photo.Blend("#[H.dna.mutant_color]", ICON_MULTIPLY)
photo.Blend("#[H.dna.features["mcolor"]]", ICON_MULTIPLY)
var/icon/eyes_s
if(EYECOLOR in H.dna.species.specflags)
+9 -1
View File
@@ -38,7 +38,15 @@ var/global/datum/getrev/revdata = new()
src << "Protect Assistant Role From Traitor: [config.protect_assistant_from_antagonist]"
src << "Enforce Human Authority: [config.enforce_human_authority]"
src << "Allow Latejoin Antagonists: [config.allow_latejoin_antagonists]"
src << "Protect Assistant From Antagonist: [config.protect_assistant_from_antagonist]"
src << "Enforce Continuous Rounds: [config.continuous.len] of [config.modes.len] roundtypes"
src << "Allow Midround Antagonists: [config.midround_antag.len] of [config.modes.len] roundtypes"
if(config.show_game_type_odds)
src <<"<b>Game Mode Odds:</b>"
var/sum = 0
for(var/i=1,i<=config.probabilities.len,i++)
sum += config.probabilities[config.probabilities[i]]
for(var/i=1,i<=config.probabilities.len,i++)
if(config.probabilities[config.probabilities[i]] > 0)
var/percentage = round(config.probabilities[config.probabilities[i]] / sum * 100, 0.1)
src << "[config.probabilities[i]] [percentage]%"
return
+2 -2
View File
@@ -87,11 +87,11 @@
name = "Boxing"
/datum/martial_art/boxing/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
A << "<span class='warning'> Can't disarm while boxing!</span>"
A << "<span class='warning'>Can't disarm while boxing!</span>"
return 1
/datum/martial_art/boxing/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
A << "<span class='warning'> Can't grab while boxing!</span>"
A << "<span class='warning'>Can't grab while boxing!</span>"
return 1
/datum/martial_art/boxing/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
+108
View File
@@ -0,0 +1,108 @@
/obj/effect/proc_holder/spell/targeted/lichdom
name = "Bind Soul"
desc = "A dark necromantic pact that can forever bind your soul to an item of your choosing. So long as both your body and the item remain intact you can revive from death, though the time between reincarnations grows steadily with use."
school = "necromancy"
charge_max = 10
clothes_req = 0
centcom_cancast = 0
invocation = "NECREM IMORTIUM!"
invocation_type = "shout"
range = -1
level_max = 0 //cannot be improved
cooldown_min = 10
include_user = 1
var/obj/marked_item
var/mob/living/current_body
action_icon_state = "skeleton"
/obj/effect/proc_holder/spell/targeted/lichdom/New()
if(ticker.mode.round_ends_with_antag_death)
ticker.mode.round_ends_with_antag_death = 0
..()
/obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets)
for(var/mob/user in targets)
var/list/hand_items = list()
if(iscarbon(user))
hand_items = list(user.get_active_hand(),user.get_inactive_hand())
if(marked_item && !stat_allowed) //sanity, shouldn't happen without badminry
marked_item = null
return
if(stat_allowed) //Death is not my end!
if(user.stat == CONSCIOUS && iscarbon(user))
user << "<span class='notice'>You aren't dead enough to revive!</span>" //Usually a good problem to have
charge_counter = charge_max
return
if(!marked_item.loc) //Wait nevermind
user << "<span class='warning'>Your phylactery is gone!</span>"
return
if(isobserver(user))
var/mob/dead/observer/O = user
O.reenter_corpse()
var/mob/living/carbon/human/lich = new /mob/living/carbon/human(get_turf(marked_item))
lich.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(lich), slot_shoes)
lich.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(lich), slot_w_uniform)
lich.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(lich), slot_wear_suit)
lich.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(lich), slot_head)
lich.real_name = user.mind.name
user.mind.transfer_to(lich)
hardset_dna(lich,null,null,lich.real_name,null,/datum/species/skeleton)
lich << "<span class='warning'>Your bones clatter and shutter as they're pulled back into this world!</span>"
charge_max += 600
var/mob/old_body = current_body
current_body = lich
lich.Weaken(10)
if(old_body && old_body.loc)
if(iscarbon(old_body))
var/mob/living/carbon/C = old_body
for(var/obj/item/W in C)
C.unEquip(W)
var/wheres_wizdo = dir2text(get_dir(get_turf(old_body), get_turf(marked_item)))
if(wheres_wizdo)
old_body.visible_message("<span class='warning'>Suddenly [old_body.name]'s corpse falls to pieces! You see a strange energy rise from the remains, and speed off towards the [wheres_wizdo]!</span>")
old_body.dust()
if(!marked_item) //linking item to the spell
message = "<span class='warning'>"
for(var/obj/item in hand_items)
if(ABSTRACT in item.flags || NODROP in item.flags)
continue
marked_item = item
user << "<span class='warning'>You begin to focus your very being into the [item.name]...</span>"
break
if(!marked_item)
user << "<span class='caution'>You must hold an item you wish to make your phylactery...</span>"
spawn(50)
if(marked_item.loc != user) //I changed my mind I don't want to put my soul in a cheeseburger!
user << "<span class='warning'>Your soul snaps back to your body as you drop the [marked_item.name]!</span>"
marked_item = null
return
name = "RISE!"
desc = "Rise from the dead! You will reform at the location of your phylactery and your old body will crumble away."
charge_max = 1800 //3 minute cooldown, if you rise in sight of someone and killed again, you're probably screwed.
charge_counter = 1800
stat_allowed = 1
marked_item.name = "Ensouled [marked_item.name]"
marked_item.desc = "A terrible aura surrounds this item, its very existence is offensive to life itself..."
marked_item.color = "#003300"
user << "<span class='userdanger'>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!</span>"
hardset_dna(user, null, null, null, null, /datum/species/skeleton)
current_body = user.mind.current
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.unEquip(H.wear_suit)
H.unEquip(H.head)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), slot_head)
+1 -1
View File
@@ -7,7 +7,7 @@
invocation = "GAR YOK"
invocation_type = "whisper"
range = -1
level_max = 1 //cannot be improved
level_max = 0 //cannot be improved
cooldown_min = 100
include_user = 1
-76
View File
@@ -1,76 +0,0 @@
// Wires for cameras.
/datum/wires/camera
random = 0
holder_type = /obj/machinery/camera
wire_count = 6
/datum/wires/camera/GetInteractWindow()
. = ..()
var/obj/machinery/camera/C = holder
. += "<br>\n[(C.view_range == initial(C.view_range) ? "The focus light is on." : "The focus light is off.")]"
. += "<br>\n[(C.can_use() ? "The power link light is on." : "The power link light is off.")]"
. += "<br>\n[(C.light_disabled ? "The camera light is off." : "The camera light is on.")]"
. += "<br>\n[(C.alarm_on ? "The alarm light is on." : "The alarm light is off.")]"
return .
/datum/wires/camera/CanUse(var/mob/living/L)
var/obj/machinery/camera/C = holder
if(!C.panel_open)
return 0
return 1
var/const/CAMERA_WIRE_FOCUS = 1
var/const/CAMERA_WIRE_POWER = 2
var/const/CAMERA_WIRE_LIGHT = 4
var/const/CAMERA_WIRE_ALARM = 8
var/const/CAMERA_WIRE_NOTHING1 = 16
var/const/CAMERA_WIRE_NOTHING2 = 32
/datum/wires/camera/UpdateCut(var/index, var/mended)
var/obj/machinery/camera/C = holder
switch(index)
if(CAMERA_WIRE_FOCUS)
var/range = (mended ? initial(C.view_range) : C.short_range)
C.setViewRange(range)
if(CAMERA_WIRE_POWER)
if(C.status && !mended || !C.status && mended)
C.deactivate(usr, 1)
if(CAMERA_WIRE_LIGHT)
C.light_disabled = !mended
if(CAMERA_WIRE_ALARM)
if(!mended)
C.triggerCameraAlarm()
else
C.cancelCameraAlarm()
return
/datum/wires/camera/UpdatePulsed(var/index)
var/obj/machinery/camera/C = holder
if(IsIndexCut(index))
return
switch(index)
if(CAMERA_WIRE_FOCUS)
var/new_range = (C.view_range == initial(C.view_range) ? C.short_range : initial(C.view_range))
C.setViewRange(new_range)
if(CAMERA_WIRE_POWER)
C.deactivate(null) // Deactivate the camera
if(CAMERA_WIRE_LIGHT)
C.light_disabled = !C.light_disabled
if(CAMERA_WIRE_ALARM)
C.visible_message("\icon[C] *beep*", "\icon[C] *beep*")
return
/datum/wires/camera/proc/CanDeconstruct()
if(IsIndexCut(CAMERA_WIRE_POWER) && IsIndexCut(CAMERA_WIRE_FOCUS) && IsIndexCut(CAMERA_WIRE_LIGHT) && IsIndexCut(CAMERA_WIRE_NOTHING1) && IsIndexCut(CAMERA_WIRE_NOTHING2))
return 1
else
return 0
+1 -2
View File
@@ -102,8 +102,7 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown",
/datum/wires/Topic(href, href_list)
..()
if(in_range(holder, usr) && isliving(usr))
if(usr.Adjacent(holder) && isliving(usr))
var/mob/living/L = usr
if(CanUse(L) && href_list["action"])
var/obj/item/I = L.get_active_hand()
+4
View File
@@ -21,6 +21,10 @@
// replaced by OPENCONTAINER flags and atom/proc/is_open_container()
///Chemistry.
var/allow_spin = 1
//Value used to increment ex_act() if reactionary_explosions is on
var/explosion_block = 0
/atom/proc/onCentcom()
var/turf/T = get_turf(src)
if(!T)
+1 -1
View File
@@ -299,4 +299,4 @@ var/list/pointers = list()
for(var/d in data)
var/val = data[d]
if(istext(val))
data[d] = strip_html_properly(val)
data[d] = html_encode(val)
+10 -9
View File
@@ -21,7 +21,7 @@
var/uni_identity
var/blood_type
var/datum/species/species = new /datum/species/human() //The type of mutant race the player is if applicable (i.e. potato-man)
var/mutant_color = "FFF" // What color you are if you have certain speciess
var/list/features = list("FFF") //first value is mutant color
var/real_name //Stores the real name of the person who originally got this dna datum. Used primarely for changelings,
var/list/mutations = list() //All mutations are from now on here
var/mob/living/carbon/holder
@@ -36,7 +36,7 @@
destination.dna.uni_identity = uni_identity
destination.dna.blood_type = blood_type
hardset_dna(destination, null, null, null, null, species)
destination.dna.mutant_color = mutant_color
destination.dna.features = features
destination.dna.real_name = real_name
destination.dna.mutations = mutations
@@ -46,7 +46,7 @@
new_dna.uni_identity = uni_identity
new_dna.blood_type = blood_type
new_dna.species = new species.type
new_dna.mutant_color = mutant_color
new_dna.features = features
new_dna.real_name = real_name
new_dna.mutations = mutations
@@ -131,7 +131,7 @@
spans |= M.get_spans()
return spans
/proc/hardset_dna(mob/living/carbon/owner, ui, se, real_name, blood_type, datum/species/mrace, mcolor)
/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)
@@ -143,8 +143,8 @@
owner.reagents.del_reagent(exotic_blood.id)
owner.dna.species = new mrace()
if(mcolor)
owner.dna.mutant_color = mcolor
if(features)
owner.dna.features = features
if(real_name)
owner.real_name = real_name
@@ -193,6 +193,7 @@
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
/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
@@ -497,8 +498,8 @@
/obj/machinery/computer/scan_consolenew
name = "\improper DNA scanner access console"
desc = "Scan DNA."
icon = 'icons/obj/computer.dmi'
icon_state = "scanner"
icon_screen = "dna"
icon_keyboard = "med_key"
density = 1
circuit = /obj/item/weapon/circuitboard/scan_consolenew
var/radduration = 2
@@ -972,7 +973,7 @@
/datum/dna/proc/is_same_as(var/datum/dna/D)
if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name)
if(species == D.species && mutant_color == D.mutant_color && blood_type == D.blood_type)
if(species == D.species && features == D.features && blood_type == D.blood_type)
return 1
return 0
+2 -2
View File
@@ -92,7 +92,7 @@
for(var/mob/living/carbon/human/H in orange(4,T))
if(H == host)
continue
H << "<span class='alien'> You hear a buzz in your head </span>"
H << "<span class='alien'>You hear a buzz in your head </span>"
H.confused += 20
/obj/item/gland/pop
@@ -213,7 +213,7 @@
/obj/effect/cocoon/abductor/proc/Copy(var/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.mutant_color)
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)
//There's no define for this / get all items ?
var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\
@@ -43,7 +43,7 @@
photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]_s")
else
photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]_s")
photo.Blend("#[H.dna.mutant_color]", ICON_MULTIPLY)
photo.Blend("#[H.dna.features["mcolor"]]", ICON_MULTIPLY)
var/icon/eyes_s
if(EYECOLOR in H.dna.species.specflags)
@@ -86,7 +86,7 @@
dat += "<a href='?src=\ref[src];experiment=3'>Analyze</a><br>"
dat += "</td></tr></table>"
else
dat += "<span class='linkOff'> Experiment </span>"
dat += "<span class='linkOff'>Experiment </span>"
if(!occupant)
dat += "<h3>Machine Unoccupied</h3>"
+49 -1
View File
@@ -146,4 +146,52 @@
ticker.mode.syndicates += R.mind
ticker.mode.update_synd_icons_added(R.mind)
R.mind.special_role = "syndicate"
R.faction = list("syndicate")
R.faction = list("syndicate")
/obj/item/weapon/antag_spawner/slaughter_demon //Warning edgiest item in the game
name = "vial of blood"
desc = "A magically infused bottle of blood, distilled from countless murder victims. Used in unholy rituals to attract horrifying creatures."
icon = 'icons/obj/wizard.dmi'
icon_state = "vial"
/obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user as mob)
var/list/demon_candidates = get_candidates(BE_ALIEN)
if(user.z != 1)
user << "<span class='notice'>You should probably wait until you reach the station.</span>"
return
if(demon_candidates.len > 0)
used = 1
var/client/C = pick(demon_candidates)
spawn_antag(C, get_turf(src.loc), "Slaughter Demon")
user << "<span class='notice'>You shatter the bottle, no turning back now!</span>"
user << "<span class='notice'>You sense a dark presence lurking just beyond the veil...</span>"
playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1)
qdel(src)
else
user << "<span class='notice'>You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.</span>"
/obj/item/weapon/antag_spawner/slaughter_demon/spawn_antag(var/client/C, var/turf/T, var/type = "")
var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T)
var/mob/living/simple_animal/slaughter/S = new /mob/living/simple_animal/slaughter/(holder)
S.phased = TRUE
S.key = C.key
S.mind.assigned_role = "Slaughter Demon"
S.mind.special_role = "Slaughter Demon"
ticker.mode.traitors += S.mind
var/datum/objective/assassinate/new_objective = new /datum/objective/assassinate
new_objective.owner = S:mind
new_objective:target = usr:mind
new_objective.explanation_text = "Kill [usr.real_name], the one who summoned you."
S.mind.objectives += new_objective
var/datum/objective/new_objective2 = new /datum/objective
new_objective2.owner = S:mind
new_objective2.explanation_text = "Kill everyone else while you're at it."
S.mind.objectives += new_objective2
S << S.playstyle_string
S << "<B>You are currently not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest.</B>"
S << "<B>Objective #[1]</B>: [new_objective.explanation_text]"
S << "<B>Objective #[2]</B>: [new_objective2.explanation_text]"
+1 -1
View File
@@ -86,7 +86,7 @@
if(overmind && overmind.blob_reagent_datum)
adjustcolors(overmind.blob_reagent_datum.color)
H.loc = src
loc.visible_message("<span class='warning'> The corpse of [H.name] suddenly rises!</span>")
loc.visible_message("<span class='warning'>The corpse of [H.name] suddenly rises!</span>")
/mob/living/simple_animal/hostile/blob/blobspore/death(gibbed)
..(1)
+2 -2
View File
@@ -65,12 +65,12 @@
/mob/camera/blob/proc/update_health()
if(blob_core)
hud_used.blobhealthdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'> <font color='#e36600'>[round(blob_core.health)]</font></div>"
hud_used.blobhealthdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#e36600'>[round(blob_core.health)]</font></div>"
/mob/camera/blob/proc/add_points(var/points)
if(points != 0)
blob_points = Clamp(blob_points + points, 0, max_blob_points)
hud_used.blobpwrdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'> <font color='#82ed00'>[round(src.blob_points)]</font></div>"
hud_used.blobpwrdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#82ed00'>[round(src.blob_points)]</font></div>"
/mob/camera/blob/say(var/message)
if (!message)
@@ -92,7 +92,7 @@
new_dna.struc_enzymes = T.dna.struc_enzymes
new_dna.real_name = T.dna.real_name
new_dna.species = T.dna.species
new_dna.mutant_color = T.dna.mutant_color
new_dna.features = T.dna.features
new_dna.blood_type = T.dna.blood_type
absorbedcount++
store_dna(new_dna, user)
@@ -303,8 +303,7 @@
icon_state = "lingarmor"
flags = NODROP
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
slowdown = 2
armor = list(melee = 65, bullet = 20, laser = 10, energy = 13, bomb = 0, bio = 0, rad = 0)
armor = list(melee = 40, bullet = 20, laser = 30, energy = 13, bomb = 0, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
cold_protection = 0
heat_protection = 0
@@ -322,7 +321,7 @@
desc = "A tough, hard covering of black chitin with transparent chitin in front."
icon_state = "lingarmorhelmet"
flags = HEADCOVERSEYES | BLOCKHAIR | NODROP
armor = list(melee = 70, bullet = 15, laser = 7,energy = 10, bomb = 5, bio = 2, rad = 0)
armor = list(melee = 40, bullet = 15, laser = 30,energy = 10, bomb = 5, bio = 2, rad = 0)
flags_inv = HIDEEARS
/obj/item/clothing/head/helmet/changeling/dropped()
@@ -91,7 +91,7 @@
var/datum/dna/NewDNA = selected_dna
if(ismonkey(target))
user << "<span class='notice'>We stealthily sting [target.name].</span>"
hardset_dna(target, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.blood_type, NewDNA.species.type, NewDNA.mutant_color)
hardset_dna(target, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.blood_type, NewDNA.species.type, NewDNA.features)
updateappearance(target)
feedback_add_details("changeling_powers","TS")
return 1
@@ -17,8 +17,7 @@
user.dna = chosen_dna
user.real_name = chosen_dna.real_name
hardset_dna(user, null, null, null, null, chosen_dna.species.type)
user.dna.mutant_color = chosen_dna.mutant_color
hardset_dna(user, null, null, null, null, chosen_dna.species.type, chosen_dna.features)
updateappearance(user)
domutcheck(user)
+1 -1
View File
@@ -188,7 +188,7 @@
return 0
if(living_antag_player && living_antag_player.mind && living_antag_player.stat != DEAD && !isnewplayer(living_antag_player) &&!isbrain(living_antag_player))
if(living_antag_player && living_antag_player.mind && isliving(living_antag_player) && living_antag_player.stat != DEAD && !isnewplayer(living_antag_player) &&!isbrain(living_antag_player))
return 0 //A resource saver: once we find someone who has to die for all antags to be dead, we can just keep checking them, cycling over everyone only when we lose our mark.
for(var/mob/Player in living_mob_list)
+212
View File
@@ -0,0 +1,212 @@
/obj/machinery/dominator
name = "dominator"
desc = "A visibly sinister device. Looks like you can break it if you hit it enough."
icon = 'icons/obj/machines/dominator.dmi'
icon_state = "dominator"
density = 1
anchored = 1.0
layer = 3.6
var/health = 200
var/gang
var/operating = 0
var/broken = 0
/obj/machinery/dominator/New()
if(!istype(ticker.mode, /datum/game_mode/gang))
qdel(src)
return
SetLuminosity(2)
/obj/machinery/dominator/examine(mob/user)
..()
if(broken)
user << "<span class='danger'>It looks completely busted.</span>"
return
var/datum/game_mode/gang/mode = ticker.mode
var/time = null
if(gang == "A")
if(isnum(mode.A_timer))
time = max(mode.A_timer, 0)
if(gang == "B")
if(isnum(mode.B_timer))
time = max(mode.B_timer, 0)
if(isnum(time))
if(time > 0)
user << "<span class='notice'>Hostile Takeover in progress. Estimated [time] seconds remain.</span>"
else
user << "<span class='notice'>Hostile Takeover of [station_name()] successful. Have a great day.</span>"
else
user << "<span class='notice'>System on standby.</span>"
user << "<span class='danger'>System Integrity: [health/2]%</span>"
/obj/machinery/dominator/proc/healthcheck(var/damage)
var/iconname = "dominator"
if(gang)
iconname += "-[gang]"
SetLuminosity(3)
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread
health -= damage
switch(health)
if(101 to INFINITY)
if(prob(damage*2))
sparks.set_up(5, 1, src)
sparks.start()
if(1 to 100)
sparks.set_up(5, 1, src)
sparks.start()
iconname += "-damaged"
if(!broken)
if(health <= 0)
set_broken()
else
icon_state = iconname
if(health <= -50)
new /obj/item/stack/sheet/plasteel(src.loc)
qdel(src)
/obj/machinery/dominator/proc/set_broken()
var/datum/game_mode/gang/mode = ticker.mode
if(gang == "A")
mode.A_timer = "OFFLINE"
if(gang == "B")
mode.B_timer = "OFFLINE"
if(!isnum(mode.A_timer) && !isnum(mode.B_timer))
SSshuttle.emergencyNoEscape = 0
if(SSshuttle.emergency.mode == SHUTTLE_STRANDED)
SSshuttle.emergency.mode = SHUTTLE_DOCKED
SSshuttle.emergency.timer = world.time
priority_announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority")
else
priority_announce("All hostile activity within station systems have ceased.","Network Alert")
if(gang)
ticker.mode.message_gangtools(((gang=="A") ? ticker.mode.A_tools : ticker.mode.B_tools),"Hostile takeover cancelled: Dominator is no longer operational.",1,1)
SetLuminosity(0)
icon_state = "dominator-broken"
broken = 1
/obj/machinery/dominator/Destroy()
if(!broken)
set_broken()
..()
/obj/machinery/dominator/emp_act(severity)
healthcheck(100)
..()
/obj/machinery/dominator/ex_act(severity, target)
if(target == src)
qdel(src)
return
switch(severity)
if(1.0)
qdel(src)
if(2.0)
healthcheck(120)
if(3.0)
healthcheck(30)
return
/obj/machinery/dominator/bullet_act(var/obj/item/projectile/Proj)
if(Proj.damage)
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
playsound(src, 'sound/effects/bang.ogg', 50, 1)
visible_message("<span class='danger'>[src] was hit by [Proj].</span>")
healthcheck(Proj.damage)
..()
/obj/machinery/dominator/blob_act()
healthcheck(110)
/obj/machinery/dominator/attackby(I as obj, user as mob, params)
return
/obj/machinery/dominator/attack_hand(mob/user)
if(operating||broken)
examine(user)
return
var/datum/game_mode/gang/mode = ticker.mode
var/gang_territory
var/timer
var/tempgang
if(user.mind in (ticker.mode.A_gang|ticker.mode.A_bosses))
tempgang = "A"
gang_territory = ticker.mode.A_territory.len
timer = mode.A_timer
else if(user.mind in (ticker.mode.B_gang|ticker.mode.B_bosses))
tempgang = "B"
gang_territory = ticker.mode.B_territory.len
timer = mode.B_timer
if(!tempgang)
examine(user)
return
if(isnum(timer)) //In theory, this shouldn't happen. But if it does, they get this meme
user << "<span class='warning'>Error: Hostile Takeover is already in progress.</span>"
return
var/time = max(180,900 - ((round((gang_territory/start_state.num_territories)*200, 1) - 60) * 15))
if(alert(user,"With [round((gang_territory/start_state.num_territories)*100, 1)]% station control, a takeover will require [time] seconds.\nYour gang will be unable to gain influence while it is active.\nThe entire station will likely be alerted to it once it starts.\nAre you ready?","Confirm","Ready","Later") == "Ready")
if ((!in_range(src, user) || !istype(src.loc, /turf)))
return 0
var/area/srcloc = get_area(src.loc)
gang = tempgang
mode.domination(gang,1,srcloc.name)
src.name = "[gang_name(gang)] Gang [src.name]"
healthcheck(0)
operating = 1
ticker.mode.message_gangtools(((gang=="A") ? ticker.mode.A_tools : ticker.mode.B_tools),"Hostile takeover in progress: Estimated [time] seconds until victory.")
/obj/machinery/dominator/attack_alien(mob/living/user)
user.do_attack_animation(src)
playsound(src, 'sound/effects/bang.ogg', 50, 1)
user.visible_message("<span class='danger'>[user] smashes against [src] with its claws.</span>",\
"<span class='danger'>You smash against [src] with your claws.</span>",\
"<span class='italics'>You hear metal scraping.</span>")
healthcheck(15)
/obj/machinery/dominator/attack_animal(mob/living/user as mob)
if(!isanimal(user))
return
var/mob/living/simple_animal/M = user
M.do_attack_animation(src)
if(M.melee_damage_upper <= 0)
return
healthcheck(M.melee_damage_upper)
/obj/machinery/dominator/mech_melee_attack(obj/mecha/M)
if(M.damtype == "brute")
playsound(src, 'sound/effects/bang.ogg', 50, 1)
visible_message("<span class='danger'>[M.name] has hit [src].</span>")
healthcheck(M.force)
return
/obj/machinery/dominator/attack_hulk(mob/user)
playsound(src, 'sound/effects/bang.ogg', 50, 1)
user.visible_message("<span class='danger'>[user] smashes [src].</span>",\
"<span class='danger'>You punch [src].</span>",\
"<span class='italics'>You hear metal being slammed.</span>")
healthcheck(5)
/obj/machinery/dominator/attackby(obj/item/weapon/I as obj, mob/living/user as mob, params)
if(istype(I, /obj/item/weapon))
add_fingerprint(user)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
if( (I.flags&NOBLUDGEON) || !I.force )
return
playsound(src, 'sound/weapons/smash.ogg', 50, 1)
visible_message("<span class='danger'>[user] has hit \the [src] with [I].</span>")
if(I.damtype == BURN || I.damtype == BRUTE)
healthcheck(I.force)
return
+132 -36
View File
@@ -15,6 +15,10 @@
var/list/A_territory_lost = list()
var/list/B_territory_new = list()
var/list/B_territory_lost = list()
var/gang_A_style
var/gang_A_headgear
var/gang_B_style
var/gang_B_headgear
/datum/game_mode/gang
name = "gang war"
@@ -26,14 +30,15 @@
recommended_enemies = 2
enemy_minimum_age = 14
var/finished = 0
var/goal_scalar = 0.5 //Goal = Total territories x goal_scalar
// Victory timers
var/A_timer = "OFFLINE"
var/B_timer = "OFFLINE"
///////////////////////////
//Announces the game type//
///////////////////////////
/datum/game_mode/gang/announce()
world << "<B>The current game mode is - Gang War!</B>"
world << "<B>A violent turf war has erupted on the station!<BR>Gangsters - Take over the station by claiming more than [round(100*goal_scalar,1)]% of the station! <BR>Crew - The gangs will try to keep you on the station. Successfully evacuate the station to win!</B>"
world << "<B>A violent turf war has erupted on the station!<BR>Gangsters - Take over the station by activating and defending a Dominator! <BR>Crew - The gangs will try to keep you on the station. Successfully evacuate the station to win!</B>"
///////////////////////////////////////////////////////////////////////////////
@@ -73,6 +78,15 @@
modePlayer += B_bosses
..()
/datum/game_mode/gang/process(seconds)
if(!finished)
if(isnum(A_timer))
A_timer -= seconds
if(isnum(B_timer))
B_timer -= seconds
ticker.mode.check_win()
/datum/game_mode/gang/proc/assign_bosses()
var/datum/mind/boss = pick(antag_candidates)
A_bosses += boss
@@ -91,7 +105,7 @@
/datum/game_mode/proc/forge_gang_objectives(var/datum/mind/boss_mind)
var/datum/objective/rival_obj = new
rival_obj.owner = boss_mind
rival_obj.explanation_text = "Claim more than 50% the station before the [(boss_mind in A_bosses) ? gang_name("B") : gang_name("A")] Gang does."
rival_obj.explanation_text = "Preform a hostile takeover of the station with a Dominator."
boss_mind.objectives += rival_obj
@@ -103,6 +117,17 @@
boss_mind.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
/datum/game_mode/gang/proc/domination(var/gang,var/modifier=1,var/dominatorloc)
if(gang=="A")
A_timer = max(180,900 - ((round((ticker.mode.A_territory.len/start_state.num_territories)*200, 1) - 60) * 15)) * modifier
if(gang=="B")
B_timer = max(180,900 - ((round((ticker.mode.B_territory.len/start_state.num_territories)*200, 1) - 60) * 15)) * modifier
if(gang && dominatorloc)
priority_announce("Hostile runtimes detected in all station systems. A network breach by the [gang_name(gang)] Gang has been located in [dominatorloc].","Network Alert")
if(get_security_level() != "delta")
set_security_level("red")
SSshuttle.emergencyNoEscape = 1
///////////////////////////////////////////////////////////////////////////
//This equips the bosses with their gear, and makes the clown not clumsy//
///////////////////////////////////////////////////////////////////////////
@@ -132,37 +157,91 @@
var/where = mob.equip_in_one_of_slots(gangtool, slots)
if (!where)
mob << "Your Syndicate benefactors were unfortunately unable to get you a Gangtool."
. += 1
else
gangtool.register_device(mob)
mob << "The <b>Gangtool</b> in your [where] will allow you to use your influence to purchase items and prevent the station from evacuating before you can take over. Use it to recall the emergency shuttle from anywhere on the station."
mob << "The <b>Gangtool</b> in your [where] will allow you to purchase items, send messages to your gangsters and recall the emergency shuttle from anywhere on the station."
mob << "You can also promote your gang members to <b>lieutenant</b> by giving them an unregistered gangtool. Lieutenants cannot be deconverted and are able to use recruitment pens and gangtools."
. += 1
var/where2 = mob.equip_in_one_of_slots(T, slots)
if (!where2)
mob << "Your Syndicate benefactors were unfortunately unable to get you a recruitment pen to start."
else
mob << "The <b>recruitment pen</b> in your [where2] will help you get your gang started. Use it on unsuspecting crew members to recruit them."
. += 1
else
mob << "The <b>recruitment pen</b> in your [where2] will help you get your gang started. Stab unsuspecting crew members with it to recruit them."
var/where3 = mob.equip_in_one_of_slots(SC, slots)
if (!where3)
mob << "Your Syndicate benefactors were unfortunately unable to get you a territory spraycan to start."
else
mob << "The <b>territory spraycan</b> in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get. Distribute these to your gangsters to grow your influence faster."
. += 1
else
mob << "The <b>territory spraycan</b> in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get. All gangsters can use these, so distribute them to grow your influence faster."
mob.update_icons()
return .
//Used by recallers when purchasing a gang outfit. First time a gang outfit is purchased the buyer decides a gang style which is stored so gang outfits are uniform
/datum/game_mode/proc/gang_outfit(mob/user,var/obj/item/device/gangtool/gangtool,var/gang)
if(!user || !gangtool || !gang)
return 0
if(!gangtool.can_use(user))
return 0
var/gang_style_list = list("Gang Colors","Leather Jackets","Black Suits","White Suits")
var/style
if(gang == "A")
if(!gang_A_style)
gang_A_style = input("Pick an outfit style.", "Pick Style") as null|anything in gang_style_list
style = gang_A_style
if(gang == "B")
if(!gang_B_style)
gang_B_style = input("Pick an outfit style.", "Pick Style") as null|anything in gang_style_list
style = gang_B_style
if(!style)
return 0
if(gangtool.can_use(user) && (((gang == "A") ? gang_points.A : gang_points.B) >= 1))
switch(style)
if("Gang Colors")
if(gang == "A")
new /obj/item/clothing/under/color/blue(user.loc)
if(gang == "B")
new /obj/item/clothing/under/color/red(user.loc)
if("Leather Jackets")
new /obj/item/clothing/suit/jacket/leather(user.loc)
if("Black Suits")
new /obj/item/clothing/under/suit_jacket/charcoal(user.loc)
if("White Suits")
new /obj/item/clothing/under/suit_jacket/white(user.loc)
return 1
return 0
/////////////////////////////////////////////
//Checks if the either gang have won or not//
/////////////////////////////////////////////
/datum/game_mode/gang/check_win()
if(A_territory.len > (start_state.num_territories * goal_scalar))
finished = "A" //Gang A wins
else if(B_territory.len > (start_state.num_territories * goal_scalar))
finished = "B" //Gang B wins
var/winner = 0
if(isnum(A_timer))
if(A_timer < 0)
winner += 1
if(isnum(B_timer))
if(B_timer < 0)
winner += 2
if(winner)
if(winner == 3) //Edge Case: If both dominators activate at the same time
domination("A",0.5)
domination("B",0.5)
priority_announce("Multiple station takeover attempts have made simultaneously. Conflicting hostile runtimes appears to have delayed both attempts.","Network Alert")
else if(winner == 1)
finished = "A" //Gang A wins
else if(winner == 2)
finished = "B" //Gang B wins
///////////////////////////////
//Checks if the round is over//
@@ -282,7 +361,7 @@
if(!finished)
world << "<FONT size=3 color=red><B>The station was [station_was_nuked ? "destroyed!" : "evacuated before either gang could claim it!"]</B></FONT>"
else
world << "<FONT size=3 color=red><B>The [finished=="A" ? gang_name("A") : gang_name("B")] Gang has claimed over [round(100*goal_scalar,1)]% of the station and has assumed control!</B></FONT>"
world << "<FONT size=3 color=red><B>The [finished=="A" ? gang_name("A") : gang_name("B")] Gang successfully preformed a hostile takeover of the station!!</B></FONT>"
..()
return 1
@@ -338,8 +417,8 @@
//////////////////////////////////////////////////////////
/datum/gang_points
var/A = 30
var/B = 30
var/A = 25
var/B = 25
var/next_point_interval = 1800
var/next_point_time
@@ -371,25 +450,43 @@
B_lost_names += "[ticker.mode.B_territory_lost[area]], "
ticker.mode.B_territory -= area
var/datum/game_mode/gang/gangmode
if(istype(ticker.mode, /datum/game_mode/gang))
gangmode = ticker.mode
//Calculate and report influence growth
ticker.mode.message_gangtools(ticker.mode.A_tools,"<b>[gang_name("A")] Gang Status Report:</b>")
var/A_new = min(999,A + 15 + ticker.mode.A_territory.len)
ticker.mode.message_gangtools(ticker.mode.A_tools,"*---------*<br><b>[gang_name("A")] Gang Status Report:</b>")
var/A_message = ""
if(A_new != A)
A_message += "Your gang has gained <b>[A_new - A] Influence</b> for holding on to [ticker.mode.A_territory.len] territories."
if(A_new == 999)
A_message += " You cannot gain any more influence without spending some with this device."
A = A_new
if(gangmode && isnum(gangmode.A_timer))
var/new_time = max(180,gangmode.A_timer - (ticker.mode.A_territory.len * 2))
if(new_time < gangmode.A_timer)
A_message += "Your takeover has been rushed by [gangmode.A_timer - new_time] seconds for holding on to [ticker.mode.A_territory.len] territories. "
gangmode.A_timer = new_time
A_message += "[gangmode.A_timer] seconds remain in hostile takeover."
else
var/A_new = min(999,A + 15 + ticker.mode.A_territory.len)
if(A_new != A)
A_message += "Your gang has gained <b>[A_new - A] Influence</b> for holding on to [ticker.mode.A_territory.len] territories."
if(A_new == 999)
A_message += " You cannot gain any more influence without spending some with this device."
A = A_new
ticker.mode.message_gangtools(ticker.mode.A_tools,A_message,0)
ticker.mode.message_gangtools(ticker.mode.B_tools,"<b>[gang_name("B")] Gang Status Report:</b>")
var/B_new = min(999,B + 15 + ticker.mode.B_territory.len)
var/B_message = ""
if(B_new != B)
B_message += "Your gang has gained <b>[B_new - B] Influence</b> for holding on to [ticker.mode.B_territory.len] territories."
if(B_new == 999)
B_message += " You cannot gain any more influence without spending some with this device."
B = B_new
if(gangmode && isnum(gangmode.B_timer))
var/new_time = max(180,gangmode.B_timer - (ticker.mode.B_territory.len * 2))
if(new_time < gangmode.B_timer)
B_message += "Your takeover has been rushed by [gangmode.B_timer - new_time] seconds for holding on to [ticker.mode.B_territory.len] territories. "
gangmode.B_timer = new_time
B_message += "[gangmode.B_timer] seconds remain in hostile takeover."
else
var/B_new = min(999,B + 15 + ticker.mode.B_territory.len)
if(B_new != B)
B_message += "Your gang has gained <b>[B_new - B] Influence</b> for holding on to [ticker.mode.B_territory.len] territories."
if(B_new == 999)
B_message += " You cannot gain any more influence without spending some with this device."
B = B_new
ticker.mode.message_gangtools(ticker.mode.B_tools,B_message,0)
@@ -428,13 +525,12 @@
var/A_control = round((ticker.mode.A_territory.len/start_state.num_territories)*100, 1)
var/B_control = round((ticker.mode.B_territory.len/start_state.num_territories)*100, 1)
ticker.mode.message_gangtools((ticker.mode.A_tools),"Your gang now has <b>[A_control]% control</b> of the station.",0)
ticker.mode.message_gangtools((ticker.mode.A_tools),"The [gang_name("B")] Gang has <b>[B_control]% control</b> of the station.",0,1)
ticker.mode.message_gangtools((ticker.mode.B_tools),"Your gang now has <b>[B_control]% control</b> of the station.",0)
ticker.mode.message_gangtools((ticker.mode.B_tools),"The [gang_name("A")] Gang has <b>[A_control]% control</b> of the station.",0,1)
ticker.mode.message_gangtools((ticker.mode.A_tools),"Your gang now has <b>[A_control]% control</b> of the station.<BR>*---------*",0)
ticker.mode.message_gangtools((ticker.mode.B_tools),"Your gang now has <b>[B_control]% control</b> of the station.<BR>*---------*",0)
//Victory check
ticker.mode.check_win()
//Increase outfit stock
for(var/obj/item/device/gangtool/tool in (ticker.mode.A_tools | ticker.mode.B_tools))
tool.outfits = min(tool.outfits+3,10)
//Restart the counter
start()
@@ -2,7 +2,7 @@
/obj/item/device/gangtool
name = "suspicious device"
desc = "A strange device of sorts. Hard to really make out what it actually does just by looking."
icon_state = "recaller"
icon_state = "gangtool"
item_state = "walkietalkie"
throwforce = 0
w_class = 1.0
@@ -13,6 +13,7 @@
var/boss = 1 //If it has the power to promote gang members
var/recalling = 0
var/promotions = 0
var/outfits = 5
/obj/item/device/gangtool/New() //Initialize supply point income if it hasn't already been started
if(!ticker.mode.gang_points)
@@ -33,30 +34,35 @@
else
dat += "<a href='?src=\ref[src];register=1'>Register Device</a><br>"
else
var/datum/game_mode/gang/gangmode
if(istype(ticker.mode, /datum/game_mode/gang))
gangmode = ticker.mode
var/gang_size = ((gang == "A")? (ticker.mode.A_gang.len + ticker.mode.A_bosses.len) : (ticker.mode.B_gang.len + ticker.mode.B_bosses.len))
var/gang_territory = ((gang == "A")? ticker.mode.A_territory.len : ticker.mode.B_territory.len)
var/points = ((gang == "A") ? ticker.mode.gang_points.A : ticker.mode.gang_points.B)
var/timer
if(gangmode)
timer = ((gang == "A") ? gangmode.A_timer : gangmode.B_timer)
if(isnum(timer))
dat += "<center><font color='red'>Takeover In Progress:<br><B>[timer] seconds remain</B></font></center><hr>"
dat += "Registration: <B>[(gang == "A")? gang_name("A") : gang_name("B")] Gang [boss ? "Administrator" : "Lieutenant"]</B><br>"
dat += "Organization Size: <B>[gang_size]</B><br>"
dat += "Station Control: <B>[round((gang_territory/start_state.num_territories)*100, 1)]%</B><br>"
dat += "<a href='?src=\ref[src];choice=recall'>Recall Emergency Shuttle</a><br>"
dat += "Organization Size: <B>[gang_size]</B> | Station Control: <B>[round((gang_territory/start_state.num_territories)*100, 1)]%</B><br>"
if(outfits > 0)
dat += "<a href='?src=\ref[src];choice=outfit'>Create Gang Outfit</a><br>"
else
dat += "<b>Create Gang Outfit</b> (Restocking)<br>"
dat += "<a href='?src=\ref[src];choice=ping'>Send Gang-wide Message</a><br>"
if(gangmode)
dat += "<a href='?src=\ref[src];choice=recall'>Recall Emergency Shuttle</a><br>"
dat += "<br>"
dat += "Influence: <B>[points]</B><br>"
dat += "Time until Influence grows: <B>[(points >= 100) ? ("--:--") : (time2text(ticker.mode.gang_points.next_point_time - world.time, "mm:ss"))]</B><br>"
dat += "<B>Purchase Items:</B><br>"
dat += "(5 Influence) "
if(points >= 5)
dat += "<a href='?src=\ref[src];choice=ping'>Send Gang-wide Message</a><br>"
else
dat += "Send Gang-wide Message<br>"
dat += "(10 Influence) "
if(points >= 10)
dat += "<a href='?src=\ref[src];purchase=spraycan'><b>Territory Spraycan</b></a><br>"
else
dat += "<b>Territory Spraycan</b><br>"
dat += "Time until Influence grows: <B>[(points >= 999) ? ("--:--") : (time2text(ticker.mode.gang_points.next_point_time - world.time, "mm:ss"))]</B><br>"
dat += "<hr>"
dat += "<B>Purchase Weapons:</B><br>"
dat += "(10 Influence) "
if(points >= 10)
@@ -64,8 +70,8 @@
else
dat += "Switchblade<br>"
dat += "(25 Influence) "
if(points >= 25)
dat += "(20 Influence) "
if(points >= 20)
dat += "<a href='?src=\ref[src];purchase=pistol'>10mm Pistol</a><br>"
else
dat += "10mm Pistol<br>"
@@ -76,8 +82,29 @@
else
dat += "10mm Ammo<br>"
dat += "(40 Influence) "
if(points >= 40)
dat += "(50 Influence) "
if(points >= 50)
dat += "<a href='?src=\ref[src];purchase=SMG'>Thompson SMG</a><br>"
else
dat += "Thompson SMG<br>"
dat += "<br>"
dat += "<B>Purchase Utilities:</B><br>"
dat += "(5 Influence) "
if(points >= 5)
dat += "<a href='?src=\ref[src];purchase=spraycan'><b>Territory Spraycan</b></a><br>"
else
dat += "<b>Territory Spraycan</b><br>"
dat += "(10 Influence) "
if(points >= 10)
dat += "<a href='?src=\ref[src];purchase=vest'>Bulletproof Vest</a><br>"
else
dat += "Bulletproof Vest<br>"
dat += "(30 Influence) "
if(points >= 30)
dat += "<a href='?src=\ref[src];purchase=pen'>Recruitment Pen</a><br>"
else
dat += "Recruitment Pen<br>"
@@ -86,19 +113,28 @@
if(promotions >= 3)
dat += "(Out of stock) Promote a Gangster<br>"
else
dat += "([(promotions*20)+10] Influence, [3-promotions] left) "
if(points >= (promotions*20)+10)
dat += "([(promotions*10)+10] Influence, [3-promotions] left) "
if(points >= (promotions*10)+10)
dat += "<a href='?src=\ref[src];purchase=gangtool'>Promote a Gangster</a><br>"
else
dat += "Promote a Gangster<br>"
if(gangmode)
dat += "(30 Influence) "
if(points >= 30)
dat += "<a href='?src=\ref[src];purchase=dominator'><b>Station Dominator</b></a><br>"
else
dat += "Station Dominator<br>"
dat += "<i>(Estimated Takeover Time: [round(max(180,900 - ((round((gang_territory/start_state.num_territories)*200, 10) - 60) * 15))/60,1)] minutes)</i><br>"
dat += "<br>"
dat += "<a href='?src=\ref[src];choice=refresh'>Refresh</a><br>"
var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v0.4")
var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v0.4", 340, 600)
popup.set_content(dat)
popup.open()
/obj/item/device/gangtool/Topic(href, href_list)
if(!can_use(usr))
return
@@ -116,44 +152,77 @@
var/item_type
switch(href_list["purchase"])
if("spraycan")
if(points >= 10)
if(points >= 5)
item_type = /obj/item/toy/crayon/spraycan/gang
points = 10
points = 5
if("switchblade")
if(points >= 10)
item_type = /obj/item/weapon/switchblade
points = 10
if("pistol")
if(points >= 25)
if(points >= 20)
item_type = /obj/item/weapon/gun/projectile/automatic/pistol
points = 25
points = 20
if("ammo")
if(points >= 10)
item_type = /obj/item/ammo_box/magazine/m10mm
points = 10
if("SMG")
if(points >= 50)
item_type = /obj/item/weapon/gun/projectile/automatic/tommygun
points = 50
if("vest")
if(points >= 10)
item_type = /obj/item/clothing/suit/armor/bulletproof
points = 10
if("pen")
if(points >= 40)
if(points >= 30)
item_type = /obj/item/weapon/pen/gang
points = 40
points = 30
if("gangtool")
if((promotions < 3) && (points >= (promotions*20)+10))
if((promotions < 3) && (points >= (promotions*10)+10))
item_type = /obj/item/device/gangtool/lt
points = (promotions*20)+10
points = (promotions*10)+10
promotions++
if("dominator")
if(istype(ticker.mode, /datum/game_mode/gang))
var/datum/game_mode/gang/mode = ticker.mode
if(isnum((gang == "A") ? mode.A_timer : mode.B_timer))
return
var/usrarea = get_area(usr.loc)
var/usrturf = get_turf(usr.loc)
if(istype(usrarea,/area/space) || istype(usrturf,/turf/space) || usr.z != 1)
usr << "<span class='warning'>You can only use this on the station!</span>"
return
for(var/obj/obj in usrturf)
if(obj.density)
usr << "<span class='warning'>There's not enough room here!</span>"
return
if(points >= 30)
item_type = /obj/machinery/dominator
points = 30
if(item_type)
if(gang == "A")
ticker.mode.gang_points.A -= points
else if(gang == "B")
ticker.mode.gang_points.B -= points
var/obj/purchased = new item_type(get_turf(usr))
var/mob/living/carbon/human/H = usr
H.put_in_any_hand_if_possible(purchased)
if(ispath(item_type))
var/obj/purchased = new item_type(get_turf(usr))
var/mob/living/carbon/human/H = usr
H.put_in_any_hand_if_possible(purchased)
ticker.mode.message_gangtools(((gang=="A")? ticker.mode.A_tools : ticker.mode.B_tools), "A [href_list["purchase"]] was purchased by [usr] for [points] Influence.")
log_game("A [href_list["purchase"]] was purchased by [key_name(usr)] for [points] Influence.")
else if(href_list["choice"])
switch(href_list["choice"])
if("outfit")
if(outfits > 0)
ticker.mode.gang_outfit(usr,src,gang)
outfits -= 1
if("recall")
recall(usr)
if("ping")
@@ -172,19 +241,17 @@
return
var/list/members = list()
if(gang == "A")
if(ticker.mode.gang_points.A >= 5)
members += ticker.mode.A_bosses | ticker.mode.A_gang
ticker.mode.gang_points.A -= 5
members += ticker.mode.A_bosses | ticker.mode.A_gang
else if(gang == "B")
if(ticker.mode.gang_points.B >= 5)
members += ticker.mode.B_bosses | ticker.mode.B_gang
ticker.mode.gang_points.B -= 5
members += ticker.mode.B_bosses | ticker.mode.B_gang
if(members.len)
var/ping = "<span class='danger'><B><i>[gang_name(gang)] [boss ? "Gang Boss" : "Gang Lieutenant"]</i>: [message]</B></span>"
for(var/datum/mind/ganger in members)
if(ganger.current.z <= 2)
ganger.current << "<span class='danger'><b>BOSS:</b> [message]</span>"
message_admins("[key_name_admin(user)] sent a global message to the [gang_name(gang)] Gang ([gang]): [message].")
log_game("[key_name(user)] sent a global message to the [gang_name(gang)] Gang ([gang]): [message].")
ganger.current << ping
for(var/mob/M in dead_mob_list)
M << ping
log_game("[key_name(user)] Messaged [gang_name(gang)] Gang ([gang]): [message].")
/obj/item/device/gangtool/proc/register_device(var/mob/user)
@@ -196,6 +263,7 @@
if(user.mind in (ticker.mode.A_gang | ticker.mode.A_bosses))
ticker.mode.A_tools += src
gang = "A"
icon_state = "gangtool-a"
if(!(user.mind in ticker.mode.A_bosses))
ticker.mode.remove_gangster(user.mind, 0, 2)
ticker.mode.A_bosses += user.mind
@@ -206,6 +274,7 @@
else if(user.mind in (ticker.mode.B_gang | ticker.mode.B_bosses))
ticker.mode.B_tools += src
gang = "B"
icon_state = "gangtool-b"
if(!(user.mind in ticker.mode.B_bosses))
ticker.mode.remove_gangster(user.mind, 0, 2)
ticker.mode.B_bosses += user.mind
@@ -218,7 +287,7 @@
user << "<FONT size=3 color=red><B>You have been promoted to Lieutenant!</B></FONT>"
ticker.mode.forge_gang_objectives(user.mind)
ticker.mode.greet_gang(user.mind,0)
user << "The <b>Gangtool</b> you registered will allow you to use your gang's influence to purchase items and prevent the station from evacuating before your gang can take over. Use it to recall the emergency shuttle from anywhere on the station."
user << "The <b>Gangtool</b> you registered will allow you to purchase items, send messages to your gangsters and to recall the emergency shuttle from anywhere on the station."
user << "You may also now use <b>recruitment pens</b> to grow your gang membership. Use them on unsuspecting crew members to recruit them."
if(!gang)
usr << "<span class='warning'>ACCESS DENIED: Unauthorized user.</span>"
@@ -227,6 +296,9 @@
if(recalling || !can_use(user))
return
if(!istype(ticker.mode, /datum/game_mode/gang))
return
recalling = 1
loc << "<span class='info'>\icon[src]Generating shuttle recall order with codes retrieved from last call signal...</span>"
+4 -3
View File
@@ -228,9 +228,9 @@
*/
/datum/intercept_text/proc/build_gang(datum/mind/correct_person)
src.text += "<BR><BR>We have recieved reports of a sudden increase of criminal activity in close proximity to our operations within your sector."
src.text += "Ensure law and order is maintained on the station and be on the lookout for unusually territorial behavior from the crew."
src.text += "In the event of a full-scale takeover attempt, sensitive research items are to be secured and the station evacuated ASAP."
src.text += "<BR><BR>We have reports of criminal activity in close proximity to our operations within your sector."
src.text += "Ensure law and order is maintained on the station and be on the lookout for aggressive factionalism within the crew."
src.text += "In the event of a full-scale criminal takeover threat, sensitive research items are to be secured and the station evacuated ASAP."
src.text += "<BR><HR>"
/datum/intercept_text/proc/build_wizard(datum/mind/correct_person)
@@ -289,3 +289,4 @@
*/
src.text += "These lifeforms are associated with the <B><U>[orgname1] [orgname2]</U></B> and may be attempting to acquire sensitive materials on their behalf. "
src.text += "Please take care not to alarm the crew, as <B><U>[cname]</U></B> may take advantage of a panic situation. Remember, they can be anybody, suspect everybody!"
src.text += "<BR><HR>"
@@ -99,7 +99,7 @@
C.post_status("alert", "lockdown")
src.verbs += /mob/living/silicon/ai/proc/disablelockdown
src << "<span class = 'warning'>Lockdown Initiated.</span>"
src << "<span class='warning'>Lockdown Initiated.</span>"
malf_cooldown = 1
spawn(30)
malf_cooldown = 0
@@ -127,7 +127,7 @@
else if(!D.stat) //Opens only powered doors.
D.open() //Open everything!
src << "<span class = 'notice'>Lockdown Lifted.</span>"
src << "<span class='notice'>Lockdown Lifted.</span>"
malf_cooldown = 1
spawn(30)
malf_cooldown = 0
+1 -1
View File
@@ -46,7 +46,7 @@
/datum/game_mode/monkey/proc/greet_carrier(var/datum/mind/carrier)
carrier.current << "<B><span class = 'notice'>You are the Jungle Fever patient zero!!</B>"
carrier.current << "<B><span class='notice'>You are the Jungle Fever patient zero!!</B>"
carrier.current << "<b>You have been planted onto this station by the Animal Rights Consortium.</b>"
carrier.current << "<b>Soon the disease will transform you into an ape. Afterwards, you will be able spread the infection to others with a bite.</b>"
carrier.current << "<b>While your infection strain is undetectable by scanners, any other infectees will show up on medical equipment.</b>"
+1 -1
View File
@@ -49,7 +49,7 @@
dat += "Captured Soul: [A.name]<br>"
dat += {"<A href='byond://?src=\ref[src];choice=Summon'>Summon Shade</A>"}
dat += "<br>"
dat += {"<a href='byond://?src=\ref[src];choice=Close'> Close</a>"}
dat += {"<a href='byond://?src=\ref[src];choice=Close'>Close</a>"}
user << browse(dat, "window=aicard")
onclose(user, "aicard")
return
+494 -359
View File
@@ -1,3 +1,394 @@
/datum/spellbook_entry
var/name = "Entry Name"
var/spell_type = null
var/desc = ""
var/category = "Offensive Spells"
var/log_name = "XX" //What it shows up as in logs
var/cost = 1
var/refundable = 1
var/surplus = -1 // -1 for infinite, not used by anything atm
var/obj/effect/proc_holder/spell/S = null //Since spellbooks can be used by only one person anyway we can track the actual spell
var/buy_word = "Learn"
/datum/spellbook_entry/proc/IsAvailible() // For config prefs / gamemode restrictions - these are round applied
return 1
/datum/spellbook_entry/proc/CanBuy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) // Specific circumstances
if(book.uses<cost)
return 0
return 1
/datum/spellbook_entry/proc/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) //return 1 on success
if(!S)
S = new spell_type()
//Check if we got the spell already
for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list)
if(initial(S.name) == initial(aspell.name)) // Not using directly in case it was learned from one spellbook then upgraded in another
if(aspell.spell_level >= aspell.level_max)
user << "<span class='warning'>This spell cannot be improved further.</span>"
return 0
else
aspell.name = initial(aspell.name)
aspell.spell_level++
aspell.charge_max = round(initial(aspell.charge_max) - aspell.spell_level * (initial(aspell.charge_max) - aspell.cooldown_min)/ aspell.level_max)
if(aspell.charge_max < aspell.charge_counter)
aspell.charge_counter = aspell.charge_max
switch(aspell.spell_level)
if(1)
user << "<span class='notice'>You have improved [aspell.name] into Efficient [aspell.name].</span>"
aspell.name = "Efficient [aspell.name]"
if(2)
user << "<span class='notice'>You have further improved [aspell.name] into Quickened [aspell.name].</span>"
aspell.name = "Quickened [aspell.name]"
if(3)
user << "<span class='notice'>You have further improved [aspell.name] into Free [aspell.name].</span>"
aspell.name = "Free [aspell.name]"
if(4)
user << "<span class='notice'>You have further improved [aspell.name] into Instant [aspell.name].</span>"
aspell.name = "Instant [aspell.name]"
if(aspell.spell_level >= aspell.level_max)
user << "<span class='notice'>This spell cannot be strengthened any further.</span>"
return 1
//No same spell found - just learn it
feedback_add_details("wizard_spell_learned",log_name)
user.mind.AddSpell(S)
user << "<span class='notice'>You have learned [S.name].</span>"
return 1
/datum/spellbook_entry/proc/CanRefund(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
if(!refundable)
return 0
if(!S)
S = new spell_type()
for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list)
if(initial(S.name) == initial(aspell.name))
return 1
return 0
/datum/spellbook_entry/proc/Refund(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) //return point value or -1 for failure
var/area/wizard_station/A = locate()
if(!(user in A.contents))
user << "<span clas=='warning'>You can only refund spells at the wizard lair</span>"
return -1
if(!S)
S = new spell_type()
var/spell_levels = 0
for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list)
if(initial(S.name) == initial(aspell.name))
spell_levels = aspell.spell_level
user.mind.spell_list.Remove(aspell)
del(S)
return cost * (spell_levels+1)
return -1
/datum/spellbook_entry/proc/GetInfo()
if(!S)
S = new spell_type()
var/dat =""
dat += "<b>[initial(S.name)]</b>"
if(S.charge_type == "recharge")
dat += " Cooldown:[S.charge_max/10]"
dat += " Cost:[cost]<br>"
dat += "<i>[S.desc][desc]</i><br>"
dat += "[S.clothes_req?"Needs wizard garb":"Can be cast without wizard garb"]<br>"
return dat
/datum/spellbook_entry/fireball
name = "Fireball"
spell_type = /obj/effect/proc_holder/spell/dumbfire/fireball
log_name = "FB"
/datum/spellbook_entry/magicm
name = "Magic Missile"
spell_type = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile
log_name = "MM"
/datum/spellbook_entry/disintegrate
name = "Disintegrate"
spell_type = /obj/effect/proc_holder/spell/targeted/inflict_handler/disintegrate
log_name = "DG"
/datum/spellbook_entry/disabletech
name = "Disable Tech"
spell_type = /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech
log_name = "DT"
category = "Utility Spells"
/datum/spellbook_entry/repulse
name = "Repulse"
spell_type = /obj/effect/proc_holder/spell/aoe_turf/repulse
log_name = "RP"
/datum/spellbook_entry/smoke
name = "Smoke"
spell_type = /obj/effect/proc_holder/spell/targeted/smoke
log_name = "SM"
category = "Utility Spells"
/datum/spellbook_entry/blind
name = "Blind"
spell_type = /obj/effect/proc_holder/spell/targeted/trigger/blind
log_name = "BD"
/datum/spellbook_entry/mindswap
name = "Mindswap"
spell_type = /obj/effect/proc_holder/spell/targeted/mind_transfer
log_name = "MT"
category = "Utility Spells"
/datum/spellbook_entry/forcewall
name = "Force Wall"
spell_type = /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall
log_name = "FW"
category = "Utility Spells"
/datum/spellbook_entry/blink
name = "Blink"
spell_type = /obj/effect/proc_holder/spell/targeted/turf_teleport/blink
log_name = "BL"
category = "Utility Spells"
/datum/spellbook_entry/teleport
name = "Teleport"
spell_type = /obj/effect/proc_holder/spell/targeted/area_teleport/teleport
log_name = "TP"
category = "Utility Spells"
/datum/spellbook_entry/mutate
name = "Mutate"
spell_type = /obj/effect/proc_holder/spell/targeted/genetic/mutate
log_name = "MU"
category = "Utility Spells"
/datum/spellbook_entry/jaunt
name = "Ethereal Jaunt"
spell_type = /obj/effect/proc_holder/spell/targeted/ethereal_jaunt
log_name = "EJ"
category = "Utility Spells"
/datum/spellbook_entry/knock
name = "Knock"
spell_type = /obj/effect/proc_holder/spell/aoe_turf/knock
log_name = "KN"
category = "Utility Spells"
/datum/spellbook_entry/fleshtostone
name = "Flesh to Stone"
spell_type = /obj/effect/proc_holder/spell/targeted/inflict_handler/flesh_to_stone
log_name = "FS"
/datum/spellbook_entry/summonitem
name = "Summon Item"
spell_type = /obj/effect/proc_holder/spell/targeted/summonitem
log_name = "IS"
category = "Utility Spells"
/datum/spellbook_entry/lichdom
name = "Bind Soul"
spell_type = /obj/effect/proc_holder/spell/targeted/lichdom
log_name = "LD"
/datum/spellbook_entry/lightningbolt
name = "Lightning Bolt"
spell_type = /obj/effect/proc_holder/spell/targeted/lightning
log_name = "LB"
/datum/spellbook_entry/barnyard
name = "Barnyard Curse"
spell_type = /obj/effect/proc_holder/spell/targeted/barnyardcurse
log_name = "BC"
/datum/spellbook_entry/item
name = "Buy Item"
category = "Artifacts"
refundable = 0
buy_word = "Summon"
var/item_path= null
/datum/spellbook_entry/item/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
new item_path(get_turf(user))
feedback_add_details("wizard_spell_learned",log_name)
return 1
/datum/spellbook_entry/item/GetInfo()
var/dat =""
dat += "<b>[name]</b>"
dat += " Cost:[cost]<br>"
dat += "<i>[desc]</i><br>"
if(surplus>=0)
dat += "[surplus] left.<br>"
return dat
/datum/spellbook_entry/item/staffchange
name = "Staff of Change"
desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself."
item_path = /obj/item/weapon/gun/magic/staff/change
log_name = "ST"
/datum/spellbook_entry/item/staffanimation
name = "Staff of Animation"
desc = "An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines."
item_path = /obj/item/weapon/gun/magic/staff/animate
log_name = "SA"
/datum/spellbook_entry/item/staffchaos
name = "Staff of Chaos"
desc = "A caprious tool that can fire all sorts of magic without any rhyme or reason. Using it on people you care about is not recommended."
item_path = /obj/item/weapon/gun/magic/staff/chaos
log_name = "SC"
/datum/spellbook_entry/item/staffdoor
name = "Staff of Door Creation"
desc = "A particular staff that can mold solid metal into ornate wooden doors. Useful for getting around in the absence of other transportation. Does not work on glass."
item_path = /obj/item/weapon/gun/magic/staff/door
log_name = "SD"
/datum/spellbook_entry/item/scryingorb
name = "Scrying Orb"
desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision."
item_path = /obj/item/weapon/scrying
log_name = "SO"
/datum/spellbook_entry/item/scryingorb/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
if(..())
if (!(user.dna.check_mutation(XRAY)))
user.dna.add_mutation(XRAY)
return 1
/datum/spellbook_entry/item/soulstones
name = "Six Soul Stone Shards and the spell Artificer"
desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot."
item_path = /obj/item/weapon/storage/belt/soulstone/full
log_name = "SS"
/datum/spellbook_entry/item/soulstones/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
. =..()
if(.)
user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct(null))
return .
/datum/spellbook_entry/item/necrostone
name = "A Necromantic Stone"
desc = "A Necromantic stone is able to resurrect three dead individuals as skeletal thralls for you to command."
item_path = /obj/item/device/necromantic_stone
log_name = "NS"
/datum/spellbook_entry/item/wands
name = "Wand Assortment"
desc = "A collection of wands that allow for a wide variety of utility. Wands do not recharge, so be conservative in use. Comes in a handy belt."
item_path = /obj/item/weapon/storage/belt/wands/full
log_name = "WA"
/datum/spellbook_entry/item/armor
name = "Mastercrafted Armor Set"
desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space."
item_path = /obj/item/clothing/suit/space/hardsuit/wizard
log_name = "HS"
/datum/spellbook_entry/item/armor/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
. = ..()
if(.)
new /obj/item/clothing/shoes/sandal(get_turf(user)) //In case they've lost them.
new /obj/item/clothing/gloves/color/purple(get_turf(user))//To complete the outfit
/datum/spellbook_entry/item/contract
name = "Contract of Apprenticeship"
desc = "A magical contract binding an apprentice wizard to your service, using it will summon them to your side."
item_path = /obj/item/weapon/antag_spawner/contract
log_name = "CT"
/datum/spellbook_entry/item/bloodbottle
name = "Bottle of Blood"
desc = "A bottle of magically infused blood, the smell of which will attract extradimensional beings when broken. Be careful though, the kinds of creatures summoned by blood magic are indiscriminate in their killing, and you yourself may become a victim."
item_path = /obj/item/weapon/antag_spawner/slaughter_demon
log_name = "BB"
/datum/spellbook_entry/summon
name = "Summon Stuff"
category = "Rituals"
refundable = 0
buy_word = "Cast"
var/active = 0
/datum/spellbook_entry/summon/CanBuy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
return ..() && !active
/datum/spellbook_entry/summon/GetInfo()
var/dat =""
dat += "<b>[name]</b>"
if(cost>0)
dat += " Cost:[cost]<br>"
else
dat += " No Cost<br>"
dat += "<i>[desc]</i><br>"
if(active)
dat += "<b>Already cast!</b><br>"
return dat
/datum/spellbook_entry/summon/guns
name = "Summon Guns"
category = "Challenges"
desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long!"
cost = 0
log_name = "SG"
/datum/spellbook_entry/summon/guns/IsAvailible()
return !config.no_summon_guns
/datum/spellbook_entry/summon/guns/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
feedback_add_details("wizard_spell_learned",log_name)
rightandwrong(0, user, 0)
book.uses += 1
active = 1
playsound(get_turf(user),"sound/magic/CastSummon.ogg",50,1)
user << "<span class='notice'>You have cast summon guns and gained an extra charge for your spellbook.</span>"
return 1
/datum/spellbook_entry/summon/magic
name = "Summon Magic"
category = "Challenges"
desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time."
cost = 0
log_name = "SU"
/datum/spellbook_entry/summon/magic/IsAvailible()
return !config.no_summon_magic
/datum/spellbook_entry/summon/magic/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
feedback_add_details("wizard_spell_learned",log_name)
rightandwrong(1, user, 0)
book.uses += 1
active = 1
playsound(get_turf(user),"sound/magic/CastSummon.ogg",50,1)
user << "<span class='notice'>You have cast summon magic and gained an extra charge for your spellbook.</span>"
return 1
/datum/spellbook_entry/summon/events
name = "Summon Events"
desc = "Give Murphy's law a little push and replace all events with special wizard ones that will confound and confuse everyone. Multiple castings increase the rate of these events."
cost = 1
log_name = "SE"
var/times = 0
/datum/spellbook_entry/summon/events/IsAvailible()
return (ticker.mode.name != "ragin' mages" && !config.no_summon_events)
/datum/spellbook_entry/summon/events/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
feedback_add_details("wizard_spell_learned",log_name)
summonevents()
times++
playsound(get_turf(user),"sound/magic/CastSummon.ogg",50,1)
user << "<span class='notice'>You have cast summon events.</span>"
return 1
/datum/spellbook_entry/summon/events/GetInfo()
. = ..()
if(times>0)
. += "You cast it [times] times.<br>"
return .
/obj/item/weapon/spellbook
name = "spell book"
desc = "The legendary book of spells of the wizard."
@@ -8,11 +399,24 @@
w_class = 1.0
var/uses = 5
var/temp = null
var/max_uses = 5
var/op = 1
var/activepage
var/list/active_challenges = list()
var/tab = null
var/mob/living/carbon/human/owner
var/list/datum/spellbook_entry/entries = list()
var/list/categories = list()
/obj/item/weapon/spellbook/New()
..()
var/entry_types = typesof(/datum/spellbook_entry) - /datum/spellbook_entry - /datum/spellbook_entry/item - /datum/spellbook_entry/summon
for(var/T in entry_types)
var/datum/spellbook_entry/E = new T
if(E.IsAvailible())
entries |= E
categories |= E.category
else
del(E)
tab = categories[1]
/obj/item/weapon/spellbook/attackby(obj/item/O as obj, mob/user as mob, params)
if(istype(O, /obj/item/weapon/antag_spawner/contract))
@@ -21,12 +425,53 @@
user << "<span class='warning'>The contract has been used, you can't get your points back now!</span>"
else
user << "<span class='notice'>You feed the contract back into the spellbook, refunding your points.</span>"
src.max_uses++
src.uses++
qdel(O)
if(istype(O, /obj/item/weapon/antag_spawner/slaughter_demon))
user << "<span class='notice'>On second thought, maybe summoning a demon is a bad idea. You refund your points.</span>"
src.uses++
qdel(O)
/obj/item/weapon/spellbook/proc/GetCategoryHeader(var/category)
var/dat = ""
switch(category)
if("Offensive Spells")
dat += "Spells that can be reused endlessly.<BR>"
dat += "The number after the spell name is the cooldown time.<BR>"
dat += "You can reduce this number by spending more points on the spell.<BR>"
if("Utility Spells")
dat += "Spells that can be reused endlessly.<BR>"
dat += "The number after the spell name is the cooldown time.<BR>"
dat += "You can reduce this number by spending more points on the spell.<BR>"
if("Artifacts")
dat += "Powerful items imbued with eldritch magics. Summoning one will count towards your maximum number of uses.<BR>"
dat += "These items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.<BR>"
if("Challenges")
dat += "The Wizard Federation typically has hard limits on the potency and number of spells brought to the station based on risk.<BR>"
dat += "Arming the station against you will increases the risk, but will grant you one more charge for your spellbook.<BR>"
if("Rituals")
dat += "These powerful spells change the very fabric of reality. Not always in your favour.<BR>"
return dat
/obj/item/weapon/spellbook/proc/wrap(var/content)
var/dat = ""
dat +="<html><head><title>Spellbook</title></head>"
dat += {"
<head>
<style type="text/css">
body { font-size: 80%; font-family: 'Lucida Grande', Verdana, Arial, Sans-Serif; }
ul#tabs { list-style-type: none; margin: 30px 0 0 0; padding: 0 0 0.3em 0; }
ul#tabs li { display: inline; }
ul#tabs li a { color: #42454a; background-color: #dedbde; border: 1px solid #c9c3ba; border-bottom: none; padding: 0.3em; text-decoration: none; }
ul#tabs li a:hover { background-color: #f1f0ee; }
ul#tabs li a.selected { color: #000; background-color: #f1f0ee; font-weight: bold; padding: 0.7em 0.3em 0.38em 0.3em; }
div.tabContent { border: 1px solid #c9c3ba; padding: 0.5em; background-color: #f1f0ee; }
div.tabContent.hide { display: none; }
</style>
</head>
"}
dat += {"[content]</body></html>"}
return dat
/obj/item/weapon/spellbook/attack_self(mob/user as mob)
if(!owner)
@@ -37,159 +482,40 @@
user << "<span class='warning'>The [name] does not recognize you as it's owner and refuses to open!</span>"
return
user.set_machine(src)
var/dat
if(temp)
dat = "[temp]<BR><BR><A href='byond://?src=\ref[src];temp=1'>Clear</A>"
else if (!activepage || activepage == "return")
dat = "<B>The Book of Magic:</B><BR>"
dat += "Uses remaining: [uses]<BR>"
dat += "<HR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=spells'>Learn and Improve Magical Abilities</A><BR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=artifacts'>Summon Magical Tools and Weapons</A><BR>"
if(ticker.mode.name != "ragin' mages") // we totally need summon guns x100
dat += "<A href='byond://?src=\ref[src];spell_choice=challenge'>Raise The Stakes For More Power</A><BR>"
dat += "<HR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=rememorize'>Re-memorize Spells</A><BR>"
var/dat = ""
else if (activepage == "spells")
dat += "<B>Spells:</B><BR>"
dat += "Spells that can be reused endlessly. Unless stated otherwise all spells require full wizard garb as a focus.<BR>"
dat += "The number after the spell name is the cooldown time. You can reduce this number by spending more points on the spell.<BR>"
dat += "<ul id=\"tabs\">"
var/list/cat_dat = list()
for(var/category in categories)
cat_dat[category] = "<hr>"
dat += "<li><a [tab==category?"class=selected":""] href='byond://?src=\ref[src];page=[category]'>[category]</a></li>"
dat += "<HR>"
dat += "<li><a><b>Uses remaining : [uses]</b></a></li>"
dat += "</ul>"
dat += "<A href='byond://?src=\ref[src];spell_choice=magicmissile'>Magic Missile</A> (15)<BR>"
dat += "<I>This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage.</I><BR>"
var/datum/spellbook_entry/E
for(var/i=1,i<=entries.len,i++)
var/spell_info = ""
E = entries[i]
spell_info += E.GetInfo()
if(E.CanBuy(user,src))
spell_info+= "<a href='byond://?src=\ref[src];buy=[i]'>[E.buy_word]</A><br>"
else
spell_info+= "<span>Can't [E.buy_word]</span><br>"
if(E.CanRefund(user,src))
spell_info+= "<a href='byond://?src=\ref[src];refund=[i]'>Refund</A><br>"
spell_info += "<hr>"
if(cat_dat[E.category])
cat_dat[E.category] += spell_info
dat += "<A href='byond://?src=\ref[src];spell_choice=fireball'>Fireball</A> (10)<BR>"
dat += "<I>This spell fires a fireball in the direction you're facing and does not require wizard garb. Be careful not to fire it at people that are standing next to you.</I><BR>"
for(var/category in categories)
dat += "<div class=\"[tab==category?"tabContent":"tabContent hide"]\" id=\"[category]\">"
dat += GetCategoryHeader(category)
dat += cat_dat[category]
dat += "</div>"
dat += "<A href='byond://?src=\ref[src];spell_choice=disintegrate'>Disintegrate</A> (60)<BR>"
dat += "<I>This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown.</I><BR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=disabletech'>Disable Technology</A> (60)<BR>"
dat += "<I>This spell disables all weapons, cameras and most other technology in range.</I><BR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=repulse'>Repulse</A> (40)<BR>"
dat += "<I>This spell throws nearby objects away from you and knocks creatures down.</I><BR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=smoke'>Smoke</A> (10)<BR>"
dat += "<I>This spell spawns a cloud of choking smoke at your location and does not require wizard garb.</I><BR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=blind'>Blind</A> (30)<BR>"
dat += "<I>This spell temporarly blinds a single person and does not require wizard garb.</I><BR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=mindswap'>Mind Transfer</A> (60)<BR>"
dat += "<I>This spell allows the user to switch bodies with a target. Careful to not lose your memory in the process.</I><BR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=forcewall'>Forcewall</A> (10)<BR>"
dat += "<I>This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb.</I><BR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=blink'>Blink</A> (2)<BR>"
dat += "<I>This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience.</I><BR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=teleport'>Teleport</A> (60)<BR>"
dat += "<I>This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable.</I><BR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=mutate'>Mutate</A> (60)<BR>"
dat += "<I>This spell causes you to turn into a hulk and gain telekinesis for a short while.</I><BR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=etherealjaunt'>Ethereal Jaunt</A> (30)<BR>"
dat += "<I>This spell creates your ethereal form, temporarily making you invisible and able to pass through walls.</I><BR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=knock'>Knock</A> (10)<BR>"
dat += "<I>This spell opens nearby doors and does not require wizard garb.</I><BR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=barnyard'>Curse of the Barnyard</A> (15)<BR>"
dat += "<I> This Spell dooms any unlucky soul to the life of a barnyard animal. Well not exactly but you still get to laugh at them when they MOO!. It does not require a wizard garb.</I><BR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=fleshtostone'>Flesh to Stone</A> (60)<BR>"
dat += "<I>This spell will curse a person to immediately turn into an unmoving statue. The effect will eventually wear off if the statue is not destroyed.</I><BR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=lightningbolt'>Lightning Bolt</A> (30)<BR>"
dat += "<I>Charge up and throw lightning bolt at the nearby enemy. Classic. The longer you charge the more powerful the spell, beware of overcharge however!</I><BR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=summonitem'>Instant Summons</A> (10)<BR>"
dat += "<I>This spell can be used to bind a valuable item to you, bringing it to your hand at will. Using this spell while holding the bound item will allow you to unbind it. It does not require wizard garb.</I><BR>"
if(ticker.mode.name != "ragin' mages" && !config.no_summon_events) // we totally need summon greentext x100
dat += "<A href='byond://?src=\ref[src];spell_choice=summonevents'>Summon Events</A> (One time use, persistent global spell)<BR>"
dat += "<I>Give Murphy's law a little push and replace all events with special wizard ones that will confound and confuse everyone. Multiple castings increase the rate of these events.</I><BR>"
dat += "<HR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=return'><B>Return</B></A><BR>"
else if (activepage == "challenge")
dat += "<B>Challenges:</B><BR>"
dat += "The Wizard Federation typically has hard limits on the potency and number of spells brought to the station based on risk.<BR>"
dat += "Arming the station against you will increases the risk, but will grant you one more charge for your spellbook.<BR>"
dat += "<HR>"
if(!("summon guns" in active_challenges) && !config.no_summon_guns)
dat += "<A href='byond://?src=\ref[src];spell_choice=summonguns'>Summon Guns</A> (Single use only, global spell)<BR>"
dat += "<I>Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long!</I><BR>"
if(!("summon magic" in active_challenges) && !config.no_summon_magic)
dat += "<A href='byond://?src=\ref[src];spell_choice=summonmagic'>Summon Magic</A> (Single use only, global spell)<BR>"
dat += "<I>Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time.</I><BR>"
dat += "<HR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=return'><B>Return</B></A><BR>"
else if (activepage == "artifacts")
dat += "<B>Artifacts:</B><BR>"
dat += "Powerful items imbued with eldritch magics. Summoning one will count towards your maximum number of uses.<BR>"
dat += "These items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.<BR>"
dat += "<HR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=staffchange'>Staff of Change</A><BR>"
dat += "<I>An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself.</I><BR>"
dat += "<HR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=staffanimation'>Staff of Animation</A><BR>"
dat += "<I>An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines.</I><BR>"
dat += "<HR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=staffdoor'>Staff of Door Creation</A><BR>"
dat += "<I>A particular staff that can mold solid metal into ornate wooden doors. Useful for getting around in the absence of other transportation. Does not work on glass.</I><BR>"
dat += "<HR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=staffchaos'>Staff of Chaos</A><BR>"
dat += "<I>A caprious tool that can fire all sorts of magic without any rhyme or reason. Using it on people you care about is not recommended.</I><BR>"
dat += "<HR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=soulstone'>Six Soul Stone Shards and the spell Artificer</A><BR>"
dat += "<I>Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot.</I><BR>"
dat += "<HR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=necrostone'>A Necromantic Stone</A><BR>"
dat += "<I>A Necromantic stone is able to resurrect three dead individuals as skeletal thralls for you to command.</I>"
dat += "<HR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=wands'>Wand Assortment</A><BR>"
dat += "<I>A collection of wands that allow for a wide variety of utility. Wands do not recharge, so be conservative in use. Comes in a handy belt.</I><BR>"
dat += "<HR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=armor'>Mastercrafted Armor Set</A><BR>"
dat += "<I>An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space.</I><BR>"
dat += "<HR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=contract'>Contract of Apprenticeship</A><BR>"
dat += "<I>A magical contract binding an apprentice wizard to your service, using it will summon them to your side.</I><BR>"
dat += "<HR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=scrying'>Scrying Orb</A><BR>"
dat += "<I>An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision.</I><BR>"
dat += "<HR>"
dat += "<A href='byond://?src=\ref[src];spell_choice=return'><B>Return</B></A><BR>"
user << browse(dat, "window=radio")
onclose(user, "radio")
user << browse(wrap(dat), "window=spellbook;size=600x300")
onclose(user, "spellbook")
return
/obj/item/weapon/spellbook/Topic(href, href_list)
@@ -205,213 +531,23 @@
temp = "If you got caught sneaking a peak from your teacher's spellbook, you'd likely be expelled from the Wizard Academy. Better not."
return
var/datum/spellbook_entry/E = null
if(loc == H || (in_range(src, H) && istype(loc, /turf)))
H.set_machine(src)
if(href_list["spell_choice"])
if(href_list["spell_choice"] == "rememorize")
var/area/wizard_station/A = locate()
if(usr in A.contents)
uses = max_uses
H.spellremove(usr)
temp = "All spells have been removed. You may now memorize a new set of spells."
feedback_add_details("wizard_spell_learned","UM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
else
temp = "You may only re-memorize spells whilst located inside the wizard sanctuary."
else if(href_list["spell_choice"] == "spells" || href_list["spell_choice"] == "artifacts" || href_list["spell_choice"] == "challenge" || href_list["spell_choice"] == "return")
activepage = href_list["spell_choice"]
else if(uses >= 1 && max_uses >=1)
uses--
/*
*/
var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", repulse = "Repulse", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", barnyard = "Curse of the Barnyard", fleshtostone = "Flesh to Stone", summonitem = "Instant Summons", summonguns = "Summon Guns", summonmagic = "Summon Magic", summonevents = "Summon Events", staffchange = "Staff of Change", soulstone = "Six Soul Stone Shards and the spell Artificer", necrostone = "A Necromantic Stone", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", staffchaos = "Staff of Chaos", staffdoor = "Staff of Door Creation", wands = "Wand Assortment", lightningbolt = "Lightning Bolt")
var/already_knows = 0
for(var/obj/effect/proc_holder/spell/aspell in H.mind.spell_list)
if(available_spells[href_list["spell_choice"]] == initial(aspell.name))
already_knows = 1
if(aspell.spell_level >= aspell.level_max)
temp = "This spell cannot be improved further."
uses++
break
else
aspell.name = initial(aspell.name)
aspell.spell_level++
aspell.charge_max = round(initial(aspell.charge_max) - aspell.spell_level * (initial(aspell.charge_max) - aspell.cooldown_min)/ aspell.level_max)
if(aspell.charge_max < aspell.charge_counter)
aspell.charge_counter = aspell.charge_max
switch(aspell.spell_level)
if(1)
temp = "You have improved [aspell.name] into Efficient [aspell.name]."
aspell.name = "Efficient [aspell.name]"
if(2)
temp = "You have further improved [aspell.name] into Quickened [aspell.name]."
aspell.name = "Quickened [aspell.name]"
if(3)
temp = "You have further improved [aspell.name] into Free [aspell.name]."
aspell.name = "Free [aspell.name]"
if(4)
temp = "You have further improved [aspell.name] into Instant [aspell.name]."
aspell.name = "Instant [aspell.name]"
if(aspell.spell_level >= aspell.level_max)
temp += " This spell cannot be strengthened any further."
/*
*/
if(!already_knows)
switch(href_list["spell_choice"])
if("magicmissile")
feedback_add_details("wizard_spell_learned","MM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null))
temp = "You have learned magic missile."
if("fireball")
feedback_add_details("wizard_spell_learned","FB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball(null))
temp = "You have learned fireball."
if("disintegrate")
feedback_add_details("wizard_spell_learned","DG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/inflict_handler/disintegrate(null))
temp = "You have learned disintegrate."
if("disabletech")
feedback_add_details("wizard_spell_learned","DT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech(null))
temp = "You have learned disable technology."
if("repulse")
feedback_add_details("wizard_spell_learned","RP") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse(null))
temp = "You have learned repulse."
if("smoke")
feedback_add_details("wizard_spell_learned","SM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/smoke(null))
temp = "You have learned smoke."
if("blind")
feedback_add_details("wizard_spell_learned","BD") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/trigger/blind(null))
temp = "You have learned blind."
if("mindswap")
feedback_add_details("wizard_spell_learned","MT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null))
temp = "You have learned mindswap."
if("forcewall")
feedback_add_details("wizard_spell_learned","FW") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(null))
temp = "You have learned forcewall."
if("blink")
feedback_add_details("wizard_spell_learned","BL") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null))
temp = "You have learned blink."
if("teleport")
feedback_add_details("wizard_spell_learned","TP") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
temp = "You have learned teleport."
if("mutate")
feedback_add_details("wizard_spell_learned","MU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/genetic/mutate(null))
temp = "You have learned mutate."
if("etherealjaunt")
feedback_add_details("wizard_spell_learned","EJ") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
temp = "You have learned ethereal jaunt."
if("knock")
feedback_add_details("wizard_spell_learned","KN") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
temp = "You have learned knock."
if("fleshtostone")
feedback_add_details("wizard_spell_learned","FS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/inflict_handler/flesh_to_stone(null))
temp = "You have learned flesh to stone."
if("summonitem")
feedback_add_details("wizard_spell_learned","IS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/summonitem(null))
temp = "You have learned instant summons."
if("lightningbolt")
feedback_add_details("wizard_spell_learned","LB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lightning(null))
temp = "You have learned lightning bolt."
if("summonguns")
feedback_add_details("wizard_spell_learned","SG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
rightandwrong(0, H, 0)
max_uses++
uses = uses + 2 //refund plus a free point
active_challenges += "summon guns"
playsound(get_turf(H),"sound/magic/CastSummon.ogg",50,1)
temp = "You have cast summon guns and gained an extra charge for your spellbook."
if("summonmagic")
feedback_add_details("wizard_spell_learned","SU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
rightandwrong(1, H, 0)
max_uses++
uses = uses + 2 //refund plus a free point
active_challenges += "summon magic"
playsound(get_turf(H),"sound/magic/CastSummon.ogg",50,1)
temp = "You have cast summon magic and gained an extra charge for your spellbook."
if("summonevents")
feedback_add_details("wizard_spell_learned","SE") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
summonevents()
playsound(get_turf(H),"sound/magic/CastSummon.ogg",50,1)
max_uses--
temp = "You have cast summon events."
if("staffchange")
feedback_add_details("wizard_spell_learned","ST") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/gun/magic/staff/change(get_turf(H))
temp = "You have purchased a staff of change."
max_uses--
if("soulstone")
feedback_add_details("wizard_spell_learned","SS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/storage/belt/soulstone/full(get_turf(H))
H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct(null))
temp = "You have purchased a belt full of soulstones and have learned the artificer spell."
max_uses--
if("necrostone")
feedback_add_details("wizard_spell_learned","NS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/device/necromantic_stone(get_turf(H))
temp = "You have purchased a necromantic stone."
max_uses--
if("armor")
feedback_add_details("wizard_spell_learned","HS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/clothing/shoes/sandal(get_turf(H)) //In case they've lost them.
new /obj/item/clothing/gloves/color/purple(get_turf(H))//To complete the outfit
new /obj/item/clothing/suit/space/hardsuit/wizard(get_turf(H))
temp = "You have purchased a suit of wizard armor."
max_uses--
if("staffanimation")
feedback_add_details("wizard_spell_learned","SA") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/gun/magic/staff/animate(get_turf(H))
temp = "You have purchased a staff of animation."
max_uses--
if("staffchaos")
feedback_add_details("wizard_spell_learned","SC") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/gun/magic/staff/chaos(get_turf(H))
temp = "You have purchased a staff of chaos."
max_uses--
if("staffdoor")
feedback_add_details("wizard_spell_learned","SD") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/gun/magic/staff/door(get_turf(H))
temp = "You have purchased a staff of door creation."
max_uses--
if("barnyard")
feedback_add_details("wizard_spell_learned","BC") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/barnyardcurse(null))
temp = "You have learned the curse of the barnyard."
if("wands")
feedback_add_details("wizard_spell_learned","WA") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/storage/belt/wands/full(get_turf(H))
temp = "You have purchased an assortment of wands."
max_uses--
if("contract")
feedback_add_details("wizard_spell_learned","CT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/antag_spawner/contract(get_turf(H))
temp = "You have purchased a contract of apprenticeship."
max_uses--
if("scrying")
feedback_add_details("wizard_spell_learned","SO") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/scrying(get_turf(H))
if (!(H.dna.check_mutation(XRAY)))
H.dna.add_mutation(XRAY)
temp = "You have purchased a scrying orb, and gained x-ray vision."
max_uses--
else
if(href_list["temp"])
temp = null
activepage = null
attack_self(H)
if(href_list["buy"])
E = entries[text2num(href_list["buy"])]
if(E && E.CanBuy(H,src))
if(E.Buy(H,src))
uses -= E.cost
else if(href_list["refund"])
E = entries[text2num(href_list["refund"])]
if(E && E.refundable)
var/result = E.Refund(H,src)
if(result > 0)
uses += result
else if(href_list["page"])
tab = sanitize(href_list["page"])
attack_self(H)
return
//Single Use Spellbooks//
@@ -422,7 +558,6 @@
var/used = 0
name = "spellbook of "
uses = 1
max_uses = 1
desc = "This template spellbook was never meant for the eyes of man..."
/obj/item/weapon/spellbook/oneuse/New()
+2 -1
View File
@@ -18,7 +18,8 @@
var/list/injection_chems = list() //list of injectable chems except ephedrine, coz ephedrine is always avalible
var/list/possible_chems = list(list("morphine", "salbutamol", "salglu_solution"),
list("morphine", "salbutamol", "salglu_solution", "oculine"),
list("morphine", "salbutamol", "salglu_solution", "oculine", "charcoal", "mutadone", "mannitol", "pen_acid"))
list("morphine", "salbutamol", "salglu_solution", "oculine", "charcoal", "mutadone", "mannitol", "pen_acid"),
list("morphine", "salbutamol", "salglu_solution", "oculine", "charcoal", "mutadone", "mannitol", "omnizine"))
/obj/machinery/sleeper/New()
..()
component_parts = list()
+4 -8
View File
@@ -78,6 +78,7 @@
set_frequency(frequency)
/obj/machinery/air_sensor/Destroy()
SSair.atmos_machinery -= src
if(radio_controller)
radio_controller.remove_object(src,frequency)
..()
@@ -87,11 +88,10 @@
/////////////////////////////////////////////////////////////
/obj/machinery/computer/general_air_control
icon = 'icons/obj/computer.dmi'
icon_state = "tank"
icon_screen = "tank"
icon_keyboard = "atmos_key"
circuit = /obj/item/weapon/circuitboard/air_management
name = "computer"
var/frequency = 1439
var/list/sensors = list()
@@ -210,9 +210,6 @@
/////////////////////////////////////////////////////////////
/obj/machinery/computer/general_air_control/large_tank_control
icon = 'icons/obj/computer.dmi'
icon_state = "tank"
var/input_tag
var/output_tag
frequency = 1441
@@ -353,8 +350,7 @@ Rate: [volume_rate] L/sec<BR>"}
/////////////////////////////////////////////////////////////
/obj/machinery/computer/general_air_control/fuel_injection
icon = 'icons/obj/computer.dmi'
icon_state = "atmos"
icon_screen = "atmos"
var/device_tag
var/list/device_info
@@ -1,7 +1,8 @@
/obj/machinery/computer/area_atmos
name = "area air control computer"
desc = "A computer used to control the stationary scrubbers and pumps in the area."
icon_state = "area_atmos"
icon_screen = "area_atmos"
icon_keyboard = "atmos_key"
circuit = "/obj/item/weapon/circuitboard/area_atmos"
var/list/connectedscrubbers = new()
+5
View File
@@ -18,6 +18,11 @@
src.target = locate(/obj/machinery/atmospherics/pipe) in loc
return 1
/obj/machinery/meter/Destroy()
SSair.atmos_machinery -= src
src.target = null
..()
/obj/machinery/meter/initialize()
if (!target)
src.target = locate(/obj/machinery/atmospherics/pipe) in loc
+8
View File
@@ -9,6 +9,14 @@
var/on = 0
var/volume_rate = 800
/obj/machinery/zvent/New()
..()
SSair.atmos_machinery += src
/obj/machinery/zvent/Destroy()
SSair.atmos_machinery -= src
..()
/obj/machinery/zvent/process_atmos()
//all this object does, is make its turf share air with the ones above and below it, if they have a vent too.
+6 -6
View File
@@ -277,12 +277,12 @@
dat += "<b>Metal amount:</b> [src.m_amount] / [max_m_amount] cm<sup>3</sup><br>"
dat += "<b>Glass amount:</b> [src.g_amount] / [max_g_amount] cm<sup>3</sup>"
dat += "<form name='search' action='?src=\ref[src]'> \
<input type='hidden' name='src' value='\ref[src]'> \
<input type='hidden' name='search' value='to_search'> \
<input type='hidden' name='menu' value='[AUTOLATHE_SEARCH_MENU]'> \
<input type='text' name='to_search'> \
<input type='submit' value='Search'> \
dat += "<form name='search' action='?src=\ref[src]'>\
<input type='hidden' name='src' value='\ref[src]'>\
<input type='hidden' name='search' value='to_search'>\
<input type='hidden' name='menu' value='[AUTOLATHE_SEARCH_MENU]'>\
<input type='text' name='to_search'>\
<input type='submit' value='Search'>\
</form><hr>"
var/line_length = 1
+2 -2
View File
@@ -388,7 +388,7 @@ obj/machinery/bot/floorbot/process_scan(var/scan_target)
/obj/machinery/bot/floorbot/proc/eattile(var/obj/item/stack/tile/plasteel/T)
if(!istype(T, /obj/item/stack/tile/plasteel))
return
visible_message("<span class='notice'> [src] begins to collect tiles.</span>")
visible_message("<span class='notice'>[src] begins to collect tiles.</span>")
mode = BOT_REPAIRING
spawn(20)
if(isnull(T))
@@ -409,7 +409,7 @@ obj/machinery/bot/floorbot/process_scan(var/scan_target)
/obj/machinery/bot/floorbot/proc/maketile(var/obj/item/stack/sheet/metal/M)
if(!istype(M, /obj/item/stack/sheet/metal))
return
visible_message("<span class='notice'> [src] begins to create tiles.</span>")
visible_message("<span class='notice'>[src] begins to create tiles.</span>")
mode = BOT_REPAIRING
spawn(20)
if(isnull(M))
+3 -3
View File
@@ -117,14 +117,14 @@ obj/machinery/bot/mulebot/bot_reset()
"<span class='notice'>You repair [src].</span>"
)
else
user << "<span class='notice'> [src] does not need a repair!</span>"
user << "<span class='warning'>[src] does not need a repair!</span>"
else if(istype(I, /obj/item/device/multitool) || istype(I, /obj/item/weapon/wirecutters))
if(open)
attack_hand(usr)
else if(load && ismob(load)) // chance to knock off rider
if(prob(1+I.force * 2))
unload(0)
user.visible_message("<span class='danger'> [user] knocks [load] off [src] with \the [I]!</span>", "<span class='danger'> You knock [load] off [src] with \the [I]!</span>")
user.visible_message("<span class='danger'>[user] knocks [load] off [src] with \the [I]!</span>", "<span class='danger'>You knock [load] off [src] with \the [I]!</span>")
else
user << "<span class='warning'>You hit [src] with \the [I] but to no effect!</span>"
else
@@ -154,7 +154,7 @@ obj/machinery/bot/mulebot/bot_reset()
if(prob(50) && !isnull(load))
unload(0)
if(prob(25))
visible_message("<span class='danger'> Something shorts out inside [src]!</span>")
visible_message("<span class='danger'>Something shorts out inside [src]!</span>")
wires.RandomCut()
+2 -2
View File
@@ -156,7 +156,7 @@ Auto Patrol: []"},
if(open)
user << "<span class='danger'>Please close the access panel before locking it.</span>"
else
user << "<span class='danger'> Access denied.</span>"
user << "<span class='danger'>Access denied.</span>"
else
..()
if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") // Any intent but harm will heal, so we shouldn't get angry.
@@ -173,7 +173,7 @@ Auto Patrol: []"},
if(emagged == 2)
if(user)
user << "<span class='danger'> You short out [src]'s target assessment circuits.</span>"
user << "<span class='danger'>You short out [src]'s target assessment circuits.</span>"
oldtarget_name = user.name
audible_message("<span class='danger'>[src] buzzes oddly!</span>")
declare_arrests = 0
+77 -66
View File
@@ -8,12 +8,12 @@
active_power_usage = 10
layer = 5
var/datum/wires/camera/wires = null // Wires datum
var/health = 50
var/list/network = list("SS13")
var/c_tag = null
var/c_tag_order = 999
var/status = 1.0
anchored = 1.0
var/status = 1
anchored = 1
var/start_active = 0 //If it ignores the random chance to start broken on round start
var/invuln = null
var/obj/item/device/camera_bug/bug = null
@@ -30,8 +30,6 @@
var/emped = 0 //Number of consecutive EMP's on this camera
/obj/machinery/camera/New()
wires = new(src)
assembly = new(src)
assembly.state = 4
assembly.anchored = 1
@@ -59,20 +57,18 @@
if(bug.current == src)
bug.current = null
bug = null
qdel(wires)
cameranet.removeCamera(src) //Will handle removal from the camera network and the chunks, so we don't need to worry about that
..()
/obj/machinery/camera/emp_act(severity)
if(!isEmpProof())
if(prob(100/severity))
if(prob(150/severity))
icon_state = "[initial(icon_state)]emp"
var/list/previous_network = network
network = list()
cameranet.removeCamera(src)
stat |= EMPED
SetLuminosity(0)
triggerCameraAlarm()
emped = emped+1 //Increase the number of consecutive EMP's
var/thisemp = emped //Take note of which EMP this proc is for
spawn(900)
@@ -81,10 +77,12 @@
network = previous_network
icon_state = initial(icon_state)
stat &= ~EMPED
cancelCameraAlarm()
if(can_use())
cameranet.addCamera(src)
emped = 0 //Resets the consecutive EMP count
triggerCameraAlarm()
spawn(100)
cancelCameraAlarm()
for(var/mob/O in mob_list)
if (O.client && O.client.eye == src)
O.unset_machine()
@@ -117,66 +115,71 @@
if(!istype(user))
return
user.do_attack_animation(src)
status = 0
add_hiddenprint(user)
visible_message("<span class='warning'>\The [user] slashes at [src]!</span>")
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
icon_state = "[initial(icon_state)]1"
add_hiddenprint(user)
deactivate(user,0)
health = max(0, health - 30)
if(!health && status)
deactivate(user, 0)
/obj/machinery/camera/attackby(W as obj, mob/living/user as mob, params)
var/msg = "<span class='notice'>You attach [W] into the assembly inner circuits.</span>"
var/msg2 = "<span class='notice'>The camera already has that upgrade!</span>"
/obj/machinery/camera/attackby(obj/W, mob/living/user, params)
var/msg = "<span class='notice'>You attach [W] into the assembly's inner circuits.</span>"
var/msg2 = "<span class='notice'>[src] already has that upgrade!</span>"
// DECONSTRUCTION
if(istype(W, /obj/item/weapon/screwdriver))
//user << "<span class='notice'>You start to [panel_open ? "close" : "open"] the camera's panel.</span>"
//if(toggle_panel(user)) // No delay because no one likes screwdrivers trying to be hip and have a duration cooldown
panel_open = !panel_open
user.visible_message("[user] screws the camera's panel [panel_open ? "open" : "closed"]!",
"<span class='notice'>You screw the camera's panel [panel_open ? "open" : "closed"].</span>")
user << "<span class='notice'>You screw the camera's panel [panel_open ? "open" : "closed"].</span>"
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
return
else if((istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/multitool)) && panel_open)
wires.Interact(user)
if(panel_open)
if(istype(W, /obj/item/weapon/wirecutters)) //enable/disable the camera
deactivate(user, 1)
health = initial(health) //this is a pretty simplistic way to heal the camera, but there's no reason for this to be complex.
else if(istype(W, /obj/item/weapon/weldingtool) && wires.CanDeconstruct())
if(weld(W, user))
user << "<span class='notice'>You unweld the camera leaving it as just a frame screwed to the wall.</span>"
if(!assembly)
assembly = new()
assembly.loc = src.loc
assembly.state = 1
assembly.dir = src.dir
assembly.update_icon()
assembly = null
qdel(src)
return
else if(istype(W, /obj/item/device/analyzer) && panel_open) //XRay
if(!isXRay())
upgradeXRay()
qdel(W)
user << "[msg]"
else
user << "[msg2]"
else if(istype(W, /obj/item/device/multitool)) //change focus
setViewRange((view_range == initial(view_range)) ? short_range : initial(view_range))
user << "<span class='notice'>You [(view_range == initial(view_range)) ? "restore" : "mess up"] the camera's focus.</span>"
else if(istype(W, /obj/item/stack/sheet/mineral/plasma) && panel_open)
if(!isEmpProof())
upgradeEmpProof()
user << "[msg]"
qdel(W)
else
user << "[msg2]"
else if(istype(W, /obj/item/device/assembly/prox_sensor) && panel_open)
if(!isMotion())
upgradeMotion()
user << "[msg]"
qdel(W)
else
user << "[msg2]"
else if(istype(W, /obj/item/weapon/weldingtool))
if(weld(W, user))
visible_message("<span class='warning'>[user] unwelds [src], leaving it as just a frame screwed to the wall.</span>", "<span class='warning'>You unweld [src], leaving it as just a frame screwed to the wall</span>")
if(!assembly)
assembly = new()
assembly.loc = src.loc
assembly.state = 1
assembly.dir = src.dir
assembly.update_icon()
assembly = null
qdel(src)
return
else if(istype(W, /obj/item/device/analyzer))
if(!isXRay())
upgradeXRay()
qdel(W)
user << "[msg]"
else
user << "[msg2]"
else if(istype(W, /obj/item/stack/sheet/mineral/plasma))
if(!isEmpProof())
upgradeEmpProof()
user << "[msg]"
qdel(W)
else
user << "[msg2]"
else if(istype(W, /obj/item/device/assembly/prox_sensor))
if(!isMotion())
upgradeMotion()
user << "[msg]"
qdel(W)
else
user << "[msg2]"
// OTHER
else if ((istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/device/pda)) && isliving(user))
if((istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/device/pda)) && isliving(user))
var/mob/living/U = user
var/obj/item/weapon/paper/X = null
var/obj/item/device/pda/P = null
@@ -204,6 +207,7 @@
else if (O.client && O.client.eye == src)
O << "[U] holds \a [itemname] up to one of the cameras ..."
O << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", itemname, info), text("window=[]", itemname))
else if (istype(W, /obj/item/device/camera_bug))
if (!src.can_use())
user << "<span class='notice'>Camera non-functional.</span>"
@@ -216,23 +220,29 @@
user << "<span class='notice'>Camera bugged.</span>"
src.bug = W
src.bug.bugged_cameras[src.c_tag] = src
else if(istype(W, /obj/item/device/laser_pointer))
var/obj/item/device/laser_pointer/L = W
L.laser_act(src, user)
else
..()
if(W.force > 10) //fairly simplistic, but will do for now.
user.changeNext_move(CLICK_CD_MELEE)
visible_message("<span class='warning'>[user] hits [src] with [W]!</span>", "<span class='warning'>You hit [src] with [W]!</span>")
health = max(0, health - W.force)
if(!health && status)
deactivate(user, 1)
return
/obj/machinery/camera/proc/deactivate(user as mob, var/choice = 1)
if(choice==1)
status = !( src.status )
if (!(src.status))
/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(displaymessage)
status = !status
if(!status)
if(user)
visible_message("<span class='danger'>[user] deactivates [src]!</span>")
add_hiddenprint(user)
else
visible_message("<span class='danger'>\The [src] deactivates!</span>")
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
icon_state = "[initial(icon_state)]1"
else
@@ -241,8 +251,11 @@
add_hiddenprint(user)
else
visible_message("<span class='danger'>\The [src] reactivates!</span>")
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
triggerCameraAlarm()
icon_state = initial(icon_state)
spawn(100)
cancelCameraAlarm()
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
// now disconnect anyone using the camera
//Apparently, this will disconnect anyone even if the camera was re-activated.
@@ -308,7 +321,6 @@
return null
/proc/near_range_camera(var/mob/M)
for(var/obj/machinery/camera/C in range(4, M))
if(C.can_use()) // check if camera disabled
return C
@@ -317,7 +329,6 @@
return null
/obj/machinery/camera/proc/weld(var/obj/item/weapon/weldingtool/WT, var/mob/living/user)
if(busy)
return 0
if(!WT.remove_fuel(0, user))
@@ -347,4 +358,4 @@
/obj/machinery/camera/portable/process() //Updates whenever the camera is moved.
if(cameranet && get_turf(src) != prev_turf)
cameranet.updatePortableCamera(src)
prev_turf = get_turf(src)
prev_turf = get_turf(src)
+36 -58
View File
@@ -49,38 +49,13 @@
return list()
for(var/mob/living/M in mob_list)
// Easy checks first.
// Don't detect mobs on Centcom. Since the wizard den is on Centcom, we only need this.
var/turf/T = get_turf(M)
if(!T)
continue
if(T.z == ZLEVEL_CENTCOM)
continue
if(T.z >= ZLEVEL_SPACEMAX)
continue
if(M == usr)
continue
if(M.invisibility)//cloaked
continue
if(M.digitalcamo)
if(!M.can_track(usr))
continue
// Human check
var/human = 0
if(istype(M, /mob/living/carbon/human))
human = 1
var/mob/living/carbon/human/H = M
//Cameras can't track people wearing an agent card or a ninja hood.
if(H.wear_id && istype(H.wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
continue
if(istype(H.head, /obj/item/clothing/head))
var/obj/item/clothing/head/hat = H.head
if(hat.blockTracking)
continue
// Now, are they viewable by a camera? (This is last because it's the most intensive check)
if(!near_camera(M))
continue
var/name = M.name
if (name in track.names)
@@ -109,51 +84,54 @@
ai_actual_track(target)
/mob/living/silicon/ai/proc/ai_actual_track(mob/living/target as mob)
/mob/living/silicon/ai/proc/ai_actual_track(mob/living/target)
if(!istype(target)) return
var/mob/living/silicon/ai/U = usr
U.cameraFollow = target
//U << text("Now tracking [] on camera.", target.name)
//if (U.machine == null)
// U.machine = U
U << "Now tracking [target.get_visible_name()] on camera."
spawn (0)
U.cameraFollow = target
U.tracking = 1
U << "<span class='notice'>Attempting to track [target.get_visible_name()]...</span>"
sleep(min(30, get_dist(target, U.eyeobj) / 4))
spawn(15) //give the AI a grace period to stop moving.
U.tracking = 0
if(!target || !target.can_track(usr))
U << "<span class='warning'>Target is not near any active cameras.</span>"
U.cameraFollow = null
return
U << "<span class='notice'>Now tracking [target.get_visible_name()] on camera.</span>"
var/cameraticks = 0
spawn(0)
while (U.cameraFollow == target)
if (U.cameraFollow == null)
return
if (istype(target, /mob/living/carbon/human))
var/mob/living/carbon/human/H = target
if(H.wear_id && istype(H.wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
U << "Follow camera mode terminated."
U.cameraFollow = null
return
if(istype(H.head, /obj/item/clothing/head))
var/obj/item/clothing/head/hat = H.head
if(hat.blockTracking)
U << "Follow camera mode terminated."
U.cameraFollow = null
return
if(H.digitalcamo)
U << "Follow camera mode terminated."
U.cameraFollow = null
return
if(istype(target.loc,/obj/effect/dummy))
U << "Follow camera mode ended."
U.cameraFollow = null
return
if (!near_camera(target))
U << "Target is not near any active cameras."
sleep(100)
continue
if (!target.can_track(usr))
U.tracking = 1
U << "<span class='warning'>Target is not near any active cameras.</span>"
cameraticks++
if(cameraticks > 9)
U.cameraFollow = null
tracking = 0
return
else
continue
else
cameraticks = 0
U.tracking = 0
if(U.eyeobj)
U.eyeobj.setLoc(get_turf(target))
else
view_core()
U.cameraFollow = null
return
sleep(10)
/proc/near_camera(var/mob/living/M)
+4 -2
View File
@@ -44,6 +44,8 @@
for(var/obj/item/weapon/stock_parts/manipulator/P in component_parts)
speed_coeff += P.rating
heal_level = (efficiency * 15) + 10
if(heal_level > 100)
heal_level = 100
//The return of data disks?? Just for transferring between genetics machine/cloning machine.
//TO-DO: Make the genetics machine accept them.
@@ -122,7 +124,7 @@
//Clonepod
//Start growing a human clone in the pod!
/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/datum/species/mrace, var/mcolor, var/factions)
/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/datum/species/mrace, var/list/features, var/factions)
if(panel_open)
return 0
if(mess || attempting)
@@ -183,7 +185,7 @@
H.ckey = ckey
H << "<span class='notice'><b>Consciousness slowly creeps over you as your body regenerates.</b><br><i>So this is what cloning feels like?</i></span>"
hardset_dna(H, ui, se, null, null, mrace, mcolor)
hardset_dna(H, ui, se, null, null, mrace, features)
H.faction |= factions
H.set_cloned_appearance()
@@ -1,7 +1,8 @@
/obj/machinery/computer/HolodeckControl
name = "holodeck control console"
desc = "A computer used to control a nearby holodeck."
icon_state = "holocontrol"
icon_screen = "holocontrol"
icon_keyboard = "tech_key"
var/area/linkedholodeck = null
var/area/target = null
var/active = 0
@@ -308,11 +309,11 @@
if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
var/obj/item/weapon/grab/G = W
if(G.state < GRAB_AGGRESSIVE)
user << "<span class='warning'> You need a better grip to do that!</span>"
user << "<span class='warning'>You need a better grip to do that!</span>"
return
G.affecting.loc = src.loc
G.affecting.Weaken(5)
visible_message("<span class='danger'> [G.assailant] puts [G.affecting] on the table.</span>")
visible_message("<span class='danger'>[G.assailant] puts [G.affecting] on the table.</span>")
qdel(W)
return
@@ -435,7 +436,7 @@
return
else if (istype(W, /obj/item) && get_dist(src,user)<2)
user.drop_item(src)
visible_message("<span class='warning'> [user] dunks [W] into \the [src]!</span>", 3)
visible_message("<span class='warning'>[user] dunks [W] into \the [src]!</span>", 3)
return
/obj/structure/holohoop/CanPass(atom/movable/mover, turf/target, height=0)
@@ -445,9 +446,9 @@
return
if(prob(50))
I.loc = src.loc
visible_message("<span class='warning'> Swish! \the [I] lands in \the [src].</span>", 3)
visible_message("<span class='warning'>Swish! \the [I] lands in \the [src].</span>", 3)
else
visible_message("<span class='danger'> \the [I] bounces off of \the [src]'s rim!</span>", 3)
visible_message("<span class='danger'>\the [I] bounces off of \the [src]'s rim!</span>", 3)
return 0
else
return ..(mover, target, height)
+2 -3
View File
@@ -1,9 +1,8 @@
/obj/machinery/computer/operating
name = "operating computer"
desc = "Used to monitor the vitals of a patient during surgery."
icon_state = "operating"
density = 1
anchored = 1.0
icon_screen = "crew"
icon_keyboard = "med_key"
circuit = /obj/item/weapon/circuitboard/operating
var/mob/living/carbon/human/patient = null
var/obj/structure/optable/table = null
+10 -20
View File
@@ -1,17 +1,12 @@
/obj/machinery/computer/aifixer
name = "\improper AI system integrity restorer"
desc = "Used with intelliCards containing nonfunctioning AIs to restore them to working order."
icon = 'icons/obj/computer.dmi'
icon_state = "ai-fixer"
req_access = list(access_captain, access_robotics, access_heads)
var/mob/living/silicon/ai/occupier = null
var/active = 0
circuit = /obj/item/weapon/circuitboard/aifixer
/obj/machinery/computer/aifixer/New()
src.overlays += image('icons/obj/computer.dmi', "ai-fixer-empty")
..()
icon_keyboard = "tech_key"
icon_screen = "ai-fixer"
/obj/machinery/computer/aifixer/attackby(I as obj, user as mob, params)
if(occupier && istype(I, /obj/item/weapon/screwdriver))
@@ -101,7 +96,6 @@
return
if (href_list["fix"])
src.active = 1
src.overlays += image('icons/obj/computer.dmi', "ai-fixer-on")
while (src.occupier.health < 100)
src.occupier.adjustOxyLoss(-1)
src.occupier.adjustFireLoss(-1)
@@ -113,32 +107,28 @@
src.occupier.lying = 0
dead_mob_list -= src.occupier
living_mob_list += src.occupier
src.overlays -= image('icons/obj/computer.dmi', "ai-fixer-404")
src.overlays += image('icons/obj/computer.dmi', "ai-fixer-full")
src.updateUsrDialog()
update_icon()
sleep(10)
src.active = 0
src.overlays -= image('icons/obj/computer.dmi', "ai-fixer-on")
src.add_fingerprint(usr)
src.updateUsrDialog()
update_icon()
return
/obj/machinery/computer/aifixer/update_icon()
..()
// Broken / Unpowered
if((stat & BROKEN) || (stat & NOPOWER))
overlays.Cut()
// Working / Powered
return
else
if(active)
overlays += "ai-fixer-on"
if (occupier)
switch (occupier.stat)
if (0)
overlays += image('icons/obj/computer.dmi', "ai-fixer-full")
overlays += "ai-fixer-full"
if (2)
overlays += image('icons/obj/computer.dmi', "ai-fixer-404")
overlays += "ai-fixer-404"
else
overlays += image('icons/obj/computer.dmi', "ai-fixer-empty")
overlays += "ai-fixer-empty"
+14 -5
View File
@@ -1,8 +1,9 @@
/obj/machinery/computer/arcade/
name = "random arcade"
desc = "random arcade machine"
icon = 'icons/obj/computer.dmi'
icon_state = "arcade"
icon_keyboard = null
icon_screen = "invaders"
var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 2,
/obj/item/toy/AI = 2,
/obj/item/clothing/under/syndicate/tacticool = 2,
@@ -82,7 +83,6 @@
/obj/machinery/computer/arcade/battle
name = "arcade machine"
desc = "Does not support Pinball."
icon = 'icons/obj/computer.dmi'
icon_state = "arcade"
circuit = /obj/item/weapon/circuitboard/arcade/battle
var/enemy_name = "Space Villian"
@@ -101,10 +101,10 @@
var/name_part1
var/name_part2
name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ")
name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ", "Ban ")
name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Great ", "Duke ", "General ")
name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn")
name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn", "Bloopers")
src.enemy_name = replacetext((name_part1 + name_part2), "the ", "")
src.name = (name_action + name_part1 + name_part2)
@@ -145,6 +145,7 @@
src.blocked = 1
var/attackamt = rand(2,6)
src.temp = "You attack for [attackamt] damage!"
playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -3, falloff = 10)
src.updateUsrDialog()
if(turtle > 0)
turtle--
@@ -158,6 +159,7 @@
var/pointamt = rand(1,3)
var/healamt = rand(6,8)
src.temp = "You use [pointamt] magic to heal for [healamt] damage!"
playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -3, falloff = 10)
src.updateUsrDialog()
turtle++
@@ -172,6 +174,7 @@
src.blocked = 1
var/chargeamt = rand(4,7)
src.temp = "You regain [chargeamt] points"
playsound(src.loc, 'sound/arcade/Mana.ogg', 50, 1, extrarange = -3, falloff = 10)
src.player_mp += chargeamt
if(turtle > 0)
turtle--
@@ -206,6 +209,7 @@
if(!gameover)
src.gameover = 1
src.temp = "[src.enemy_name] has fallen! Rejoice!"
playsound(src.loc, 'sound/arcade/Win.ogg', 50, 1, extrarange = -3, falloff = 10)
if(emagged)
feedback_inc("arcade_win_emagged")
@@ -222,11 +226,13 @@
else if (emagged && (turtle >= 4))
var/boomamt = rand(5,10)
src.temp = "[src.enemy_name] throws a bomb, exploding you for [boomamt] damage!"
playsound(src.loc, 'sound/arcade/Boom.ogg', 50, 1, extrarange = -3, falloff = 10)
src.player_hp -= boomamt
else if ((src.enemy_mp <= 5) && (prob(70)))
var/stealamt = rand(2,3)
src.temp = "[src.enemy_name] steals [stealamt] of your power!"
playsound(src.loc, 'sound/arcade/Steal.ogg', 50, 1, extrarange = -3, falloff = 10)
src.player_mp -= stealamt
src.updateUsrDialog()
@@ -234,6 +240,7 @@
src.gameover = 1
sleep(10)
src.temp = "You have been drained! GAME OVER"
playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10)
if(emagged)
feedback_inc("arcade_loss_mana_emagged")
usr.gib()
@@ -242,17 +249,20 @@
else if ((src.enemy_hp <= 10) && (src.enemy_mp > 4))
src.temp = "[src.enemy_name] heals for 4 health!"
playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -3, falloff = 10)
src.enemy_hp += 4
src.enemy_mp -= 4
else
var/attackamt = rand(3,6)
src.temp = "[src.enemy_name] attacks for [attackamt] damage!"
playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -3, falloff = 10)
src.player_hp -= attackamt
if ((src.player_mp <= 0) || (src.player_hp <= 0))
src.gameover = 1
src.temp = "You have been crushed! GAME OVER"
playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10)
if(emagged)
feedback_inc("arcade_loss_hp_emagged")
usr.gib()
@@ -288,7 +298,6 @@
/obj/machinery/computer/arcade/orion_trail
name = "The Orion Trail"
desc = "Learn how our ancestors got to Orion, and have fun in the process!"
icon = 'icons/obj/computer.dmi'
icon_state = "arcade"
circuit = /obj/item/weapon/circuitboard/arcade/orion_trail
var/engine = 0
+6 -17
View File
@@ -5,7 +5,8 @@
name = "atmospheric alert console"
desc = "Used to access the station's atmospheric sensors."
circuit = /obj/item/weapon/circuitboard/atmos_alert
icon_state = "alert:0"
icon_screen = "alert:0"
icon_keyboard = "atmos_key"
var/list/priority_alarms = list()
var/list/minor_alarms = list()
var/receive_frequency = 1437
@@ -61,23 +62,11 @@
src.updateDialog()
/obj/machinery/computer/atmos_alert/update_icon()
SetLuminosity(brightness_on)
if(stat & BROKEN)
icon_state = "alert:b"
return
else if (stat & NOPOWER)
icon_state = "alert:O"
SetLuminosity(0)
return
else if(priority_alarms.len)
icon_state = "alert:2"
..()
if(priority_alarms.len)
overlays += "alert:2"
else if(minor_alarms.len)
icon_state = "alert:1"
else
icon_state = "alert:0"
return
overlays += "alert:1"
/obj/machinery/computer/atmos_alert/proc/return_text()
+7 -5
View File
@@ -1,7 +1,8 @@
/obj/machinery/computer/security
name = "security camera console"
desc = "Used to access the various cameras on the station."
icon_state = "cameras"
icon_screen = "cameras"
icon_keyboard = "security_key"
circuit = /obj/item/weapon/circuitboard/security
var/obj/machinery/camera/current = null
var/last_pic = 1.0
@@ -94,7 +95,6 @@
/obj/machinery/computer/security/telescreen/update_icon()
icon_state = initial(icon_state)
SetLuminosity(brightness_on)
if(stat & BROKEN)
icon_state += "b"
return
@@ -108,16 +108,18 @@
density = 0
circuit = null
/obj/machinery/computer/security/wooden_tv
name = "security camera monitor"
desc = "An old TV hooked into the stations camera network."
icon_state = "security_det"
icon_state = "television"
icon_keyboard = null
icon_screen = "detective_tv"
/obj/machinery/computer/security/mining
name = "outpost camera console"
desc = "Used to access the various cameras on the outpost."
icon_state = "miningcameras"
icon_screen = "mining"
icon_keyboard = "mining_key"
network = list("MINE")
circuit = "/obj/item/weapon/circuitboard/mining"
@@ -1,8 +1,8 @@
/obj/machinery/computer/camera_advanced
name = "advanced camera console"
desc = "Used to access the various cameras on the station."
icon_state = "cameras"
//circuit = /obj/item/weapon/circuitboard/security
icon_screen = "cameras"
icon_keyboard = "security_key"
var/mob/camera/aiEye/remote/eyeobj
var/mob/living/carbon/human/current_user = null
var/list/networks = list("SS13")
+2 -1
View File
@@ -7,7 +7,8 @@ var/time_last_changed_position = 0
/obj/machinery/computer/card
name = "identification console"
desc = "You can use this to change ID's."
icon_state = "id"
icon_screen = "id"
icon_keyboard = "id_key"
req_one_access = list(access_heads, access_change_ids)
circuit = /obj/item/weapon/circuitboard/card
var/obj/item/weapon/card/id/scan = null
+6 -19
View File
@@ -2,8 +2,8 @@
/obj/machinery/computer/cloning
name = "cloning console"
desc = "Used to clone people and manage DNA."
icon = 'icons/obj/computer.dmi'
icon_state = "dna"
icon_screen = "dna"
icon_keyboard = "med_key"
circuit = /obj/item/weapon/circuitboard/cloning
req_access = list(access_heads) //Only used for record deletion right now.
var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning.
@@ -35,7 +35,7 @@
if(!(pod1.occupant || pod1.mess) && (pod1.efficiency > 5))
for(var/datum/data/record/R in records)
if(!(pod1.occupant || pod1.mess))
if(pod1.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["mcolor"], R.fields["factions"]))
if(pod1.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"]))
records -= R
/obj/machinery/computer/cloning/proc/updatemodules()
@@ -329,7 +329,7 @@
temp = "<font class='bad'>Clonepod malfunction.</font>"
else if(!config.revival_cloning)
temp = "<font class='bad'>Unable to initiate cloning cycle.</font>"
else if(pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["mcolor"], C.fields["factions"]))
else if(pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["features"], C.fields["factions"]))
temp = "[C.fields["name"]] => <font class='good'>Cloning cycle in progress...</font>"
records.Remove(C)
if(active_record == C)
@@ -380,7 +380,7 @@
R.fields["UI"] = subject.dna.uni_identity
R.fields["SE"] = subject.dna.struc_enzymes
R.fields["blood_type"] = subject.dna.blood_type
R.fields["mcolor"] = subject.dna.mutant_color
R.fields["features"] = subject.dna.features
R.fields["factions"] = subject.faction
//Add an implant if needed
var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject)
@@ -396,17 +396,4 @@
R.fields["mind"] = "\ref[subject.mind]"
src.records += R
scantemp = "Subject successfully scanned."
/obj/machinery/computer/cloning/update_icon()
SetLuminosity(brightness_on)
if(stat & BROKEN)
icon_state = "commb"
else
if(stat & NOPOWER)
src.icon_state = "c_unpowered"
stat |= NOPOWER
SetLuminosity(0)
else
icon_state = initial(icon_state)
stat &= ~NOPOWER
scantemp = "Subject successfully scanned."
@@ -6,7 +6,8 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
/obj/machinery/computer/communications
name = "communications console"
desc = "This can be used for various important functions. Still under developement."
icon_state = "comm"
icon_screen = "comm"
icon_keyboard = "tech_key"
req_access = list(access_heads)
circuit = /obj/item/weapon/circuitboard/communications
var/authenticated = 0
+19 -16
View File
@@ -1,6 +1,7 @@
/obj/machinery/computer
name = "computer"
icon = 'icons/obj/computer.dmi'
icon_state = "computer"
density = 1
anchored = 1.0
use_power = 1
@@ -9,6 +10,8 @@
var/obj/item/weapon/circuitboard/circuit = null //if circuit==null, computer can't disassembly
var/processing = 0
var/brightness_on = 2
var/icon_keyboard = "generic_key"
var/icon_screen = "generic"
/obj/machinery/computer/New(location, obj/item/weapon/circuitboard/C)
..(location)
@@ -18,6 +21,7 @@
if(circuit)
circuit = new circuit(null)
power_change()
update_icon()
/obj/machinery/computer/initialize()
power_change()
@@ -68,23 +72,22 @@
density = 0
/obj/machinery/computer/update_icon()
..()
icon_state = initial(icon_state)
SetLuminosity(brightness_on)
// Broken
overlays.Cut()
if(stat & NOPOWER)
overlays += "[icon_keyboard]_off"
return
overlays += icon_keyboard
if(stat & BROKEN)
icon_state += "b"
// Unpowered
else if(stat & NOPOWER)
icon_state = initial(icon_state)
icon_state += "0"
SetLuminosity(0)
overlays += "[icon_state]_broken"
else
overlays += icon_screen
/obj/machinery/computer/power_change()
..()
if(stat & NOPOWER)
SetLuminosity(0)
else
SetLuminosity(brightness_on)
update_icon()
return
@@ -97,7 +100,7 @@
/obj/machinery/computer/attackby(I as obj, user as mob, params)
if(istype(I, /obj/item/weapon/screwdriver) && circuit)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
user << "<span class='notice'> You start to disconnect the monitor...</span>"
user << "<span class='notice'>You start to disconnect the monitor...</span>"
if(do_after(user, 20))
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
A.circuit = circuit
@@ -106,12 +109,12 @@
for (var/obj/C in src)
C.loc = src.loc
if (src.stat & BROKEN)
user << "<span class='notice'> The broken glass falls out.</span>"
user << "<span class='notice'>The broken glass falls out.</span>"
new /obj/item/weapon/shard( src.loc )
A.state = 3
A.icon_state = "3"
else
user << "<span class='notice'> You disconnect the monitor.</span>"
user << "<span class='notice'>You disconnect the monitor.</span>"
A.state = 4
A.icon_state = "4"
qdel(src)
+2 -1
View File
@@ -1,7 +1,8 @@
/obj/machinery/computer/crew
name = "crew monitoring console"
desc = "Used to monitor active health sensors built into most of the crew's uniforms."
icon_state = "crew"
icon_screen = "crew"
icon_keyboard = "med_key"
use_power = 1
idle_power_usage = 250
active_power_usage = 500
+1 -3
View File
@@ -2,7 +2,7 @@
/obj/machinery/computer/upload
var/mob/living/silicon/current = null //The target of future law uploads
icon_state = null //To make sure mappers understand THIS ISN'T A VALID TYPE
icon_screen = "command"
/obj/machinery/computer/upload/attackby(obj/item/O as obj, mob/user as mob, params)
if(istype(O, /obj/item/weapon/aiModule))
@@ -33,7 +33,6 @@
/obj/machinery/computer/upload/ai
name = "\improper AI upload console"
desc = "Used to upload laws to the AI."
icon_state = "command"
circuit = /obj/item/weapon/circuitboard/aiupload
/obj/machinery/computer/upload/ai/attack_hand(var/mob/user as mob)
@@ -58,7 +57,6 @@
/obj/machinery/computer/upload/borg
name = "cyborg upload console"
desc = "Used to upload laws to Cyborgs."
icon_state = "command"
circuit = /obj/item/weapon/circuitboard/borgupload
/obj/machinery/computer/upload/borg/attack_hand(var/mob/user as mob)
+5 -2
View File
@@ -3,7 +3,8 @@
/obj/machinery/computer/med_data//TODO:SANITY
name = "medical records console"
desc = "This can be used to check medical records."
icon_state = "medcomp"
icon_screen = "medcomp"
icon_keyboard = "med_key"
req_one_access = list(access_medical, access_forensics_lockers)
circuit = /obj/item/weapon/circuitboard/med_data
var/obj/item/weapon/card/id/scan = null
@@ -590,4 +591,6 @@
/obj/machinery/computer/med_data/laptop
name = "medical laptop"
desc = "A cheap Nanotrasen medical laptop, it functions as a medical records computer. It's bolted to the table."
icon_state = "medlaptop"
icon_state = "laptop"
icon_screen = "medlaptop"
icon_keyboard = "laptop_key"
+1 -16
View File
@@ -7,9 +7,7 @@
/obj/machinery/computer/message_monitor
name = "message monitor console"
desc = "Used to Monitor the crew's messages, that are sent via PDA. Can also be used to view Request Console messages."
icon_state = "comm_logs"
var/hack_icon = "comm_logsc"
var/normal_icon = "comm_logs"
icon_screen = "comm_logs"
circuit = /obj/item/weapon/circuitboard/message_monitor
//Server linked to.
var/obj/machinery/message_server/linkedServer = null
@@ -42,7 +40,6 @@
/obj/machinery/computer/message_monitor/emag_act(user as mob)
if(!emagged)
if(!isnull(src.linkedServer))
icon_state = hack_icon // An error screen I made in the computers.dmi
emagged = 1
screen = 2
spark_system.set_up(5, 0, src)
@@ -56,15 +53,6 @@
else
user << "<span class='notice'>A no server error appears on the screen.</span>"
/obj/machinery/computer/message_monitor/update_icon()
..()
if(stat & (NOPOWER|BROKEN))
return
if(emagged || hacking)
icon_state = hack_icon
else
icon_state = normal_icon
/obj/machinery/computer/message_monitor/initialize()
//Is the server isn't linked to a server, and there's a server available, default it to the first one in the list.
if(!linkedServer)
@@ -263,11 +251,9 @@
var/currentKey = src.linkedServer.decryptkey
user << "<span class='warning'>Brute-force completed! The key is '[currentKey]'.</span>"
src.hacking = 0
src.icon_state = normal_icon
src.screen = 0 // Return the screen back to normal
/obj/machinery/computer/message_monitor/proc/UnmagConsole()
src.icon_state = normal_icon
src.emagged = 0
/obj/machinery/computer/message_monitor/proc/ResetMessage()
@@ -365,7 +351,6 @@
if(issilicon(usr) && is_special_character(usr))
src.hacking = 1
src.screen = 2
src.icon_state = hack_icon
//Time it takes to bruteforce is dependant on the password length.
spawn(100*length(src.linkedServer.decryptkey))
if(src && src.linkedServer && usr)
+3 -2
View File
@@ -1,7 +1,6 @@
/obj/machinery/computer/pod
name = "mass driver launch control"
desc = "A combined blastdoor and mass driver control unit."
icon_state = "computer_generic"
var/obj/machinery/mass_driver/connected = null
var/title = "Mass Driver Controls"
var/id = 1
@@ -120,9 +119,11 @@
/obj/machinery/computer/pod/old
icon_state = "old"
name = "\improper DoorMex control console"
title = "Door Controls"
icon_state = "oldcomp"
icon_screen = "library"
icon_keyboard = null
/obj/machinery/computer/pod/old/syndicate
+2 -4
View File
@@ -3,10 +3,8 @@
/obj/machinery/computer/monitor
name = "power monitoring console"
desc = "It monitors power levels across the station."
icon = 'icons/obj/computer.dmi'
icon_state = "power"
density = 1
anchored = 1
icon_screen = "power"
icon_keyboard = "power_key"
use_power = 2
idle_power_usage = 20
active_power_usage = 80
+2 -2
View File
@@ -1,8 +1,8 @@
/obj/machinery/computer/prisoner
name = "prisoner management console"
desc = "Used to manage tracking implants placed inside criminals."
icon = 'icons/obj/computer.dmi'
icon_state = "explosive"
icon_screen = "explosive"
icon_keyboard = "security_key"
req_access = list(access_brig)
circuit = "/obj/item/weapon/circuitboard/prisoner"
var/id = 0.0
+2 -2
View File
@@ -4,8 +4,8 @@
/obj/machinery/computer/robotics
name = "robotics control console"
desc = "Used to remotely lockdown or detonate linked Cyborgs."
icon = 'icons/obj/computer.dmi'
icon_state = "robot"
icon_screen = "robot"
icon_keyboard = "rd_key"
req_access = list(access_robotics)
circuit = /obj/item/weapon/circuitboard/robotics
var/temp = null
+2 -5
View File
@@ -3,7 +3,8 @@
/obj/machinery/computer/secure_data//TODO:SANITY
name = "security records console"
desc = "Used to view and edit personnel's security records"
icon_state = "security"
icon_screen = "security"
icon_keyboard = "security_key"
req_one_access = list(access_security, access_forensics_lockers)
circuit = /obj/item/weapon/circuitboard/secure_data
var/obj/item/weapon/card/id/scan = null
@@ -743,7 +744,3 @@ What a mess.*/
if(!record2 || record2 == active2)
return 1
return 0
/obj/machinery/computer/secure_data/detective_computer
icon = 'icons/obj/computer.dmi'
icon_state = "messyfiles"
+4 -5
View File
@@ -1,7 +1,8 @@
/obj/machinery/computer/emergency_shuttle
name = "emergency shuttle console"
desc = "For shuttle control."
icon_state = "shuttle"
icon_screen = "shuttle"
icon_keyboard = "tech_key"
var/auth_need = 3.0
var/list/authorized = list()
@@ -128,8 +129,7 @@
/obj/machinery/computer/supplycomp
name = "supply shuttle console"
desc = "Used to order supplies."
icon = 'icons/obj/computer.dmi'
icon_state = "supply"
icon_screen = "supply"
req_access = list(access_cargo)
circuit = /obj/item/weapon/circuitboard/supplycomp
verb_say = "flashes"
@@ -150,8 +150,7 @@
/obj/machinery/computer/ordercomp
name = "supply ordering console"
desc = "Used to order supplies from cargo staff."
icon = 'icons/obj/computer.dmi'
icon_state = "request"
icon_screen = "request"
circuit = /obj/item/weapon/circuitboard/ordercomp
verb_say = "flashes"
verb_ask = "flashes"
+5 -15
View File
@@ -2,13 +2,11 @@
/obj/machinery/computer/station_alert
name = "station alert console"
desc = "Used to access the station's automated alert system."
icon_state = "alert:0"
icon_screen = "alert:0"
icon_keyboard = "atmos_key"
circuit = /obj/item/weapon/circuitboard/stationalert
var/alarms = list("Fire"=list(), "Atmosphere"=list(), "Power"=list())
/obj/machinery/computer/station_alert/attack_hand(mob/user)
if(..())
return
@@ -99,20 +97,12 @@
return
/obj/machinery/computer/station_alert/update_icon()
SetLuminosity(brightness_on)
if(stat & BROKEN)
icon_state = "alert:b"
return
else if (stat & NOPOWER)
icon_state = "alert:O"
SetLuminosity(0)
return
..()
var/active_alarms = 0
for (var/cat in src.alarms)
var/list/L = src.alarms[cat]
if(L.len) active_alarms = 1
if(active_alarms)
icon_state = "alert:2"
overlays += "alert:2"
else
icon_state = "alert:0"
return
overlays += "alert:0"
@@ -1,8 +1,8 @@
/obj/machinery/computer/shuttle/syndicate
name = "syndicate shuttle terminal"
icon_state = "syndishuttle"
icon_screen = "syndishuttle"
icon_keyboard = "syndie_key"
req_access = list(access_syndicate)
shuttleId = "syndicate"
possible_destinations = "syndicate_away;syndicate_z5;syndicate_z3;syndicate_z4;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s"
@@ -12,7 +12,8 @@
/obj/machinery/computer/shuttle/syndicate/whiteship
name = "ship control terminal"
icon_state = "shuttle"
icon_screen = "shuttle"
icon_keyboard = "tech_key"
shuttleId = "whiteship"
req_access = list( )
possible_destinations = "whiteship_ss13;whiteship_home;whiteship_z4"
@@ -7,13 +7,14 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
name = "\improper Telecrystal assignment station"
desc = "A device used to manage telecrystals during group operations. You shouldn't be looking at this particular one..."
icon_state = "tcstation"
icon_keyboard = "tcstation_key"
icon_screen = "syndie"
/////////////////////////////////////////////
/obj/machinery/computer/telecrystals/uplinker
name = "\improper Telecrystal upload/receive station"
desc = "A device used to manage telecrystals during group operations. To use, simply insert your uplink. With your uplink installed \
you can upload your telecrystals to the group's pool using the console, or be assigned additional telecrystals by your lieutenant."
icon_state = "tcstation"
var/obj/item/uplinkholder = null
var/obj/machinery/computer/telecrystals/boss/linkedboss = null
@@ -50,7 +51,7 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
/obj/machinery/computer/telecrystals/uplinker/update_icon()
overlays.Cut()
..()
if(uplinkholder)
overlays += "[initial(icon_state)]-closed"
@@ -126,7 +127,9 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
desc = "A device used to manage telecrystals during group operations. To use, simply initialize the machine by scanning for nearby uplink stations. \
Once the consoles are linked up, you can assign any telecrystals amongst your operatives; be they donated by your agents or rationed to the squad \
based on the danger rating of the mission."
icon_state = "tcboss"
icon_state = "computer"
icon_screen = "tcboss"
icon_keyboard = "syndie_key"
var/virgin = 1
var/scanrange = 10
var/storedcrystals = 0
@@ -265,6 +265,15 @@ to destroy them and players will be able to make replacements.
/obj/item/weapon/stock_parts/cell = 5,
/obj/item/weapon/stock_parts/capacitor = 1)
/obj/item/weapon/circuitboard/emitter
name = "circuit board (Emitter)"
build_path = /obj/machinery/power/emitter
board_type = "machine"
origin_tech = "programming=4;powerstorage=5;engineering=5"
req_components = list(
/obj/item/weapon/stock_parts/micro_laser = 1,
/obj/item/weapon/stock_parts/manipulator = 1)
/obj/item/weapon/circuitboard/power_compressor
name = "circuit board (Power Compressor)"
build_path = /obj/machinery/power/compressor
@@ -384,6 +393,7 @@ to destroy them and players will be able to make replacements.
origin_tech = "programming=1;biotech=1"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 2,
/obj/item/weapon/stock_parts/manipulator = 1,
/obj/item/weapon/stock_parts/console_screen = 1)
/obj/item/weapon/circuitboard/microwave
@@ -393,9 +403,71 @@ to destroy them and players will be able to make replacements.
origin_tech = "programming=1"
req_components = list(
/obj/item/weapon/stock_parts/micro_laser = 1,
/obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/stack/cable_coil = 2,
/obj/item/weapon/stock_parts/console_screen = 1)
/obj/item/weapon/circuitboard/gibber
name = "circuit board (Gibber)"
build_path = /obj/machinery/gibber
board_type = "machine"
origin_tech = "programming=1"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/weapon/stock_parts/manipulator = 1)
/obj/item/weapon/circuitboard/processor
name = "circuit board (Food processor)"
build_path = /obj/machinery/processor
board_type = "machine"
origin_tech = "programming=1"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/weapon/stock_parts/manipulator = 1)
/obj/item/weapon/circuitboard/recycler
name = "circuit board (Recycler)"
build_path = /obj/machinery/recycler
board_type = "machine"
origin_tech = "programming=1"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/weapon/stock_parts/manipulator = 1)
/obj/item/weapon/circuitboard/seed_extractor
name = "circuit board (Seed Extractor)"
build_path = /obj/machinery/seed_extractor
board_type = "machine"
origin_tech = "programming=1"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/weapon/stock_parts/manipulator = 1)
/obj/item/weapon/circuitboard/smartfridge
name = "circuit board (Smartfridge)"
build_path = /obj/machinery/smartfridge
board_type = "machine"
origin_tech = "programming=1"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 1)
/obj/item/weapon/circuitboard/monkey_recycler
name = "circuit board (Monkey Recycler)"
build_path = /obj/machinery/monkey_recycler
board_type = "machine"
origin_tech = "programming=1"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/weapon/stock_parts/manipulator = 1)
/obj/item/weapon/circuitboard/holopad
name = "circuit board (AI Holopad)"
build_path = /obj/machinery/hologram/holopad
board_type = "machine"
origin_tech = "programming=1"
req_components = list(
/obj/item/weapon/stock_parts/capacitor = 1)
/obj/item/weapon/circuitboard/chem_dispenser
name = "circuit board (Portable Chem Dispenser)"
build_path = /obj/machinery/chem_dispenser/constructable
@@ -639,6 +711,8 @@ obj/item/weapon/circuitboard/rdserver
req_components = list(
/obj/item/weapon/stock_parts/console_screen = 1,
/obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/weapon/stock_parts/micro_laser = 1,
/obj/item/weapon/stock_parts/manipulator = 1,
/obj/item/device/assembly/igniter = 1)
/obj/item/weapon/circuitboard/mining_equipment_vendor
+9 -6
View File
@@ -49,6 +49,8 @@
var/turf/sabotageTurf = null //The turf that will go boom
var/detonated = 0
explosion_block = 1
/obj/machinery/door/airlock/command
icon = 'icons/obj/doors/Doorcom.dmi'
doortype = /obj/structure/door_assembly/door_assembly_com
@@ -271,6 +273,7 @@
name = "high tech security airlock"
icon = 'icons/obj/doors/hightechsecurity.dmi'
doortype = /obj/structure/door_assembly/door_assembly_highsecurity
explosion_block = 2
/obj/machinery/door/airlock/shuttle
name = "shuttle airlock"
@@ -570,16 +573,16 @@ About the new airlock wires panel:
if(src.isWireCut(AIRLOCK_WIRE_SAFETY))
t1 += text("Door force sensors not responding.</a><br>\n")
else if(src.safe)
t1 += text("Door safeties operating normally. <A href='?src=\ref[];aiDisable=8'> Override?</a><br>\n",src)
t1 += text("Door safeties operating normally. <A href='?src=\ref[];aiDisable=8'>Override?</a><br>\n",src)
else
t1 += text("Danger. Door safeties disabled. <A href='?src=\ref[];aiEnable=8'> Restore?</a><br>\n",src)
t1 += text("Danger. Door safeties disabled. <A href='?src=\ref[];aiEnable=8'>Restore?</a><br>\n",src)
if(src.isWireCut(AIRLOCK_WIRE_SPEED))
t1 += text("Door timing circuitry not responding.</a><br>\n")
else if(src.normalspeed)
t1 += text("Door timing circuitry operating normally. <A href='?src=\ref[];aiDisable=9'> Override?</a><br>\n",src)
t1 += text("Door timing circuitry operating normally. <A href='?src=\ref[];aiDisable=9'>Override?</a><br>\n",src)
else
t1 += text("Warning. Door timing circuitry operating abnormally. <A href='?src=\ref[];aiEnable=9'> Restore?</a><br>\n",src)
t1 += text("Warning. Door timing circuitry operating abnormally. <A href='?src=\ref[];aiEnable=9'>Restore?</a><br>\n",src)
@@ -981,9 +984,9 @@ About the new airlock wires panel:
qdel(src)
return
else if(hasPower())
user << "<span class='warning'> The airlock's motors resist your efforts to force it!</span>"
user << "<span class='warning'>The airlock's motors resist your efforts to force it!</span>"
else if(locked)
user << "<span class='warning'> The airlock's bolts prevent it from being forced!</span>"
user << "<span class='warning'>The airlock's bolts prevent it from being forced!</span>"
else if( !welded && !operating)
if(density)
if(beingcrowbarred == 0) //being fireaxe'd
+23 -313
View File
@@ -6,6 +6,7 @@
var/id = 1
var/auto_close = 0 // Time in seconds to automatically close when opened, 0 if it doesn't.
sub_door = 1
explosion_block = 3
heat_proof = 1
/obj/machinery/door/poddoor/preopen
@@ -87,318 +88,27 @@
operating = 0
//"BLAST" doors are obviously stronger than regular doors when it comes to BLASTS.
/obj/machinery/door/poddoor/ex_act(severity, target)
switch(severity)
if(1.0)
if(prob(80))
qdel(src)
else
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 1, src)
s.start()
if(2.0)
if(prob(20))
qdel(src)
else
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 1, src)
s.start()
if(3.0)
if(prob(80))
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 1, src)
s.start()
/*
/obj/machinery/door/poddoor/two_tile_hor/open()
if (src.operating == 1) //doors can still open when emag-disabled
return
if (!ticker)
return 0
if(!src.operating) //in case of emag
src.operating = 1
flick("pdoorc0", src)
src.icon_state = "pdoor0"
src.SetOpacity(0)
f1.SetOpacity(0)
f2.SetOpacity(0)
sleep(10)
src.density = 0
f1.density = 0
f2.density = 0
update_nearby_tiles()
if(operating == 1) //emag again
src.operating = 0
if(autoclose)
spawn(150)
autoclose()
return 1
/obj/machinery/door/poddoor/two_tile_hor/close()
if (src.operating)
return
src.operating = 1
flick("pdoorc1", src)
src.icon_state = "pdoor1"
src.density = 1
f1.density = 1
f2.density = 1
sleep(10)
src.SetOpacity(initial(opacity))
f1.SetOpacity(initial(opacity))
f2.SetOpacity(initial(opacity))
update_nearby_tiles()
src.operating = 0
return
/obj/machinery/door/poddoor/four_tile_hor/open()
if (src.operating == 1) //doors can still open when emag-disabled
return
if (!ticker)
return 0
if(!src.operating) //in case of emag
src.operating = 1
flick("pdoorc0", src)
src.icon_state = "pdoor0"
sleep(10)
src.density = 0
src.sd_SetOpacity(0)
f1.density = 0
f1.sd_SetOpacity(0)
f2.density = 0
f2.sd_SetOpacity(0)
f3.density = 0
f3.sd_SetOpacity(0)
f4.density = 0
f4.sd_SetOpacity(0)
update_nearby_tiles()
if(operating == 1) //emag again
src.operating = 0
if(autoclose)
spawn(150)
autoclose()
return 1
/obj/machinery/door/poddoor/four_tile_hor/close()
if (src.operating)
return
src.operating = 1
flick("pdoorc1", src)
src.icon_state = "pdoor1"
src.density = 1
f1.density = 1
f1.sd_SetOpacity(1)
f2.density = 1
f2.sd_SetOpacity(1)
f3.density = 1
f3.sd_SetOpacity(1)
f4.density = 1
f4.sd_SetOpacity(1)
if (src.visible)
src.sd_SetOpacity(1)
update_nearby_tiles()
sleep(10)
src.operating = 0
return
/obj/machinery/door/poddoor/two_tile_ver/open()
if (src.operating == 1) //doors can still open when emag-disabled
return
if (!ticker)
return 0
if(!src.operating) //in case of emag
src.operating = 1
flick("pdoorc0", src)
src.icon_state = "pdoor0"
sleep(10)
src.density = 0
src.sd_SetOpacity(0)
f1.density = 0
f1.sd_SetOpacity(0)
f2.density = 0
f2.sd_SetOpacity(0)
update_nearby_tiles()
if(operating == 1) //emag again
src.operating = 0
if(autoclose)
spawn(150)
autoclose()
return 1
/obj/machinery/door/poddoor/two_tile_ver/close()
if (src.operating)
return
src.operating = 1
flick("pdoorc1", src)
src.icon_state = "pdoor1"
src.density = 1
f1.density = 1
f1.sd_SetOpacity(1)
f2.density = 1
f2.sd_SetOpacity(1)
if (src.visible)
src.sd_SetOpacity(1)
update_nearby_tiles()
sleep(10)
src.operating = 0
return
/obj/machinery/door/poddoor/four_tile_ver/open()
if (src.operating == 1) //doors can still open when emag-disabled
return
if (!ticker)
return 0
if(!src.operating) //in case of emag
src.operating = 1
flick("pdoorc0", src)
src.icon_state = "pdoor0"
sleep(10)
src.density = 0
src.sd_SetOpacity(0)
f1.density = 0
f1.sd_SetOpacity(0)
f2.density = 0
f2.sd_SetOpacity(0)
f3.density = 0
f3.sd_SetOpacity(0)
f4.density = 0
f4.sd_SetOpacity(0)
update_nearby_tiles()
if(operating == 1) //emag again
src.operating = 0
if(autoclose)
spawn(150)
autoclose()
return 1
/obj/machinery/door/poddoor/four_tile_ver/close()
if (src.operating)
return
src.operating = 1
flick("pdoorc1", src)
src.icon_state = "pdoor1"
src.density = 1
f1.density = 1
f1.sd_SetOpacity(1)
f2.density = 1
f2.sd_SetOpacity(1)
f3.density = 1
f3.sd_SetOpacity(1)
f4.density = 1
f4.sd_SetOpacity(1)
if (src.visible)
src.sd_SetOpacity(1)
update_nearby_tiles()
sleep(10)
src.operating = 0
return
/obj/machinery/door/poddoor/two_tile_hor
var/obj/machinery/door/poddoor/filler_object/f1
var/obj/machinery/door/poddoor/filler_object/f2
icon = 'icons/obj/doors/1x2blast_hor.dmi'
New()
..()
f1 = new/obj/machinery/door/poddoor/filler_object (src.loc)
f2 = new/obj/machinery/door/poddoor/filler_object (get_step(src,EAST))
f1.density = density
f2.density = density
f1.sd_SetOpacity(opacity)
f2.sd_SetOpacity(opacity)
Destroy()
qdel(f1)
qdel(f2)
..()
/obj/machinery/door/poddoor/two_tile_ver
var/obj/machinery/door/poddoor/filler_object/f1
var/obj/machinery/door/poddoor/filler_object/f2
icon = 'icons/obj/doors/1x2blast_vert.dmi'
New()
..()
f1 = new/obj/machinery/door/poddoor/filler_object (src.loc)
f2 = new/obj/machinery/door/poddoor/filler_object (get_step(src,NORTH))
f1.density = density
f2.density = density
f1.sd_SetOpacity(opacity)
f2.sd_SetOpacity(opacity)
Destroy()
qdel(f1)
qdel(f2)
..()
/obj/machinery/door/poddoor/four_tile_hor
var/obj/machinery/door/poddoor/filler_object/f1
var/obj/machinery/door/poddoor/filler_object/f2
var/obj/machinery/door/poddoor/filler_object/f3
var/obj/machinery/door/poddoor/filler_object/f4
icon = 'icons/obj/doors/1x4blast_hor.dmi'
New()
..()
f1 = new/obj/machinery/door/poddoor/filler_object (src.loc)
f2 = new/obj/machinery/door/poddoor/filler_object (get_step(f1,EAST))
f3 = new/obj/machinery/door/poddoor/filler_object (get_step(f2,EAST))
f4 = new/obj/machinery/door/poddoor/filler_object (get_step(f3,EAST))
f1.density = density
f2.density = density
f3.density = density
f4.density = density
f1.sd_SetOpacity(opacity)
f2.sd_SetOpacity(opacity)
f4.sd_SetOpacity(opacity)
f3.sd_SetOpacity(opacity)
Destroy()
qdel(f1)
qdel(f2)
qdel(f3)
qdel(f4)
..()
/obj/machinery/door/poddoor/four_tile_ver
var/obj/machinery/door/poddoor/filler_object/f1
var/obj/machinery/door/poddoor/filler_object/f2
var/obj/machinery/door/poddoor/filler_object/f3
var/obj/machinery/door/poddoor/filler_object/f4
icon = 'icons/obj/doors/1x4blast_vert.dmi'
New()
..()
f1 = new/obj/machinery/door/poddoor/filler_object (src.loc)
f2 = new/obj/machinery/door/poddoor/filler_object (get_step(f1,NORTH))
f3 = new/obj/machinery/door/poddoor/filler_object (get_step(f2,NORTH))
f4 = new/obj/machinery/door/poddoor/filler_object (get_step(f3,NORTH))
f1.density = density
f2.density = density
f3.density = density
f4.density = density
f1.sd_SetOpacity(opacity)
f2.sd_SetOpacity(opacity)
f4.sd_SetOpacity(opacity)
f3.sd_SetOpacity(opacity)
Destroy()
qdel(f1)
qdel(f2)
qdel(f3)
qdel(f4)
..()
/obj/machinery/door/poddoor/filler_object
name = ""
icon_state = ""
*/
+2 -1
View File
@@ -21,4 +21,5 @@
name = "door"
icon_state = "door1"
opacity = 1
density = 1
density = 1
explosion_block = 1
@@ -283,10 +283,10 @@
<div class='statusDisplay'>
<div class='line'><div class='statusLabel'>Current Status:</div><div class='statusValue'>[current_status]</div></div>
<div class='line'>&nbsp;</div>
<div class='line'><div class='statusLabel'> \> Chamber Pressure:</div><div class='statusValue'>[sensor_pressure] kPa</div></div>
<div class='line'><div class='statusLabel'> \> Control Pump:</div><div class='statusValue'>[pump_status]</div></div>
<div class='line'><div class='statusLabel'> \> Interior Door:</div><div class='statusValue'>[interior_status]</div></div>
<div class='line'><div class='statusLabel'> \> Exterior Door:</div><div class='statusValue'>[exterior_status]</div></div>
<div class='line'><div class='statusLabel'>\> Chamber Pressure:</div><div class='statusValue'>[sensor_pressure] kPa</div></div>
<div class='line'><div class='statusLabel'>\> Control Pump:</div><div class='statusValue'>[pump_status]</div></div>
<div class='line'><div class='statusLabel'>\> Interior Door:</div><div class='statusValue'>[interior_status]</div></div>
<div class='line'><div class='statusLabel'>\> Exterior Door:</div><div class='statusValue'>[exterior_status]</div></div>
</div>
[state_options]"}
+29
View File
@@ -42,6 +42,35 @@ var/const/HOLOPAD_MODE = RANGE_BASED
var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating.
var/temp = ""
/obj/machinery/hologram/holopad/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/holopad(null)
component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
RefreshParts()
/obj/machinery/hologram/holopad/RefreshParts()
var/holograph_range = 4
for(var/obj/item/weapon/stock_parts/capacitor/B in component_parts)
holograph_range += 1 * B.rating
holo_range = holograph_range
/obj/machinery/hologram/holopad/attackby(obj/item/P as obj, mob/user as mob, params)
if(default_deconstruction_screwdriver(user, "holopad_open", "holopad0", P))
return
if(exchange_parts(user, P))
return
if(default_pry_open(P))
return
if(default_unfasten_wrench(user, P))
return
default_deconstruction_crowbar(P)
/obj/machinery/hologram/holopad/attack_hand(var/mob/living/carbon/human/user) //Carn: Hologram requests.
if(!istype(user))
return
+4 -4
View File
@@ -93,7 +93,7 @@
return PROCESS_KILL
if(!(get_dist(src, attached) <= 1 && isturf(attached.loc)))
attached << "<span class='warning'>The IV drip needle is ripped out of you, doesn't that hurt?</span>"
attached << "<span class='userdanger'>The IV drip needle is ripped out of you!</span>"
attached.apply_damage(3, BRUTE, pick("r_arm", "l_arm"))
attached = null
update_icon()
@@ -103,10 +103,10 @@
// Give blood
if(mode)
if(beaker.volume > 0)
var/transfer_amount = REAGENTS_METABOLISM
var/transfer_amount = 5
if(istype(beaker, /obj/item/weapon/reagent_containers/blood))
// speed up transfer on blood packs
transfer_amount = 4
transfer_amount = 10
beaker.reagents.reaction(attached, INGEST, 1,0) //make reagents reacts, but don't spam messages
beaker.reagents.trans_to(attached, transfer_amount)
update_icon()
@@ -205,4 +205,4 @@
else
usr << "<span class='notice'>No chemicals are attached.</span>"
usr << "<span class='notice'>[attached ? attached : "No one"] is attached.</span>"
usr << "<span class='notice'>[attached ? attached : "No one"] is attached.</span>"
+8 -3
View File
@@ -97,6 +97,7 @@ Class Procs:
name = "machinery"
icon = 'icons/obj/stationobjs.dmi'
verb_yell = "blares"
pressure_resistance = 10
var/stat = 0
var/emagged = 0
var/use_power = 1
@@ -323,7 +324,7 @@ Class Procs:
. = !(state_open || panel_open || is_operational()) && istype(C)
if(.)
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
visible_message("<span class = 'notice'>[usr] pry open \the [src].</span>", "<span class = 'notice'>You pry open \the [src].</span>")
visible_message("<span class='notice'>[usr] pry open \the [src].</span>", "<span class='notice'>You pry open \the [src].</span>")
open_machine()
return 1
@@ -376,9 +377,13 @@ Class Procs:
/obj/machinery/proc/exchange_parts(mob/user, obj/item/weapon/storage/part_replacer/W)
var/shouldplaysound = 0
if(istype(W) && component_parts)
if(panel_open)
if(panel_open || W.works_from_distance)
var/obj/item/weapon/circuitboard/CB = locate(/obj/item/weapon/circuitboard) in component_parts
var/P
if(W.works_from_distance)
user << "<span class='notice'>Following parts detected in the machine:</span>"
for(var/var/obj/item/C in component_parts)
user << "<span class='notice'> [C.name]</span>"
for(var/obj/item/weapon/stock_parts/A in component_parts)
for(var/D in CB.req_components)
if(ispath(A.type, D))
@@ -399,7 +404,7 @@ Class Procs:
else
user << "<span class='notice'>Following parts detected in the machine:</span>"
for(var/var/obj/item/C in component_parts)
user << "<span class='notice'> [C.name]</span>"
user << "<span class='notice'> [C.name]</span>"
if(shouldplaysound)
W.play_rped_sound()
return 1
+1 -1
View File
@@ -141,7 +141,7 @@ Transponder Codes:<UL>"}
t += "<LI>[key] ... [codes[key]]"
t += " <A href='byond://?src=\ref[src];edit=1;code=[key]'>Edit</A>"
t += " <A href='byond://?src=\ref[src];delete=1;code=[key]'>Delete</A><BR>"
t += " <A href='byond://?src=\ref[src];add=1;'> Add New</A><BR>"
t += " <A href='byond://?src=\ref[src];add=1;'>Add New</A><BR>"
t+= "<UL></TT>"
var/datum/browser/popup = new(user, "navbeacon", "Navigation Beacon", 300, 400)
+2 -2
View File
@@ -478,9 +478,9 @@ var/list/obj/machinery/newscaster/allCasters = list()
dat+="<A href='?src=\ref[src];set_wanted_desc=1'>Description</A>: [msg] <BR>"
dat+="<A href='?src=\ref[src];set_attachment=1'>Attach Photo</A>: [(photo ? "Photo Attached" : "No Photo")]</BR>"
if(wanted_already)
dat+="<B>Wanted Issue created by:</B><FONT COLOR='green'> [news_network.wanted_issue.scannedUser]</FONT><BR>"
dat+="<B>Wanted Issue created by:</B><FONT COLOR='green'>[news_network.wanted_issue.scannedUser]</FONT><BR>"
else
dat+="<B>Wanted Issue will be created under prosecutor:</B><FONT COLOR='green'> [scanned_user]</FONT><BR>"
dat+="<B>Wanted Issue will be created under prosecutor:</B><FONT COLOR='green'>[scanned_user]</FONT><BR>"
dat+="<BR><A href='?src=\ref[src];submit_wanted=[end_param]'>[(wanted_already) ? ("Edit Issue") : ("Submit")]</A>"
if(wanted_already)
dat+="<BR><A href='?src=\ref[src];cancel_wanted=1'>Take down Issue</A>"
+73 -22
View File
@@ -13,12 +13,38 @@ var/const/SAFETY_COOLDOWN = 100
var/icon_name = "grinder-o"
var/blood = 0
var/eat_dir = WEST
var/amount_produced = 1
var/probability_mod = 1
var/extra_materials = 0
var/list/blacklist = list(/obj/item/pipe, /obj/item/pipe_meter, /obj/structure/disposalconstruct, /obj/item/weapon/reagent_containers, /obj/item/weapon/paper, /obj/item/stack/, /obj/item/weapon/pen, /obj/item/weapon/storage/, /obj/item/clothing/mask/cigarette) // Don't allow us to grind things we can poop out at 200 a second for free.
/obj/machinery/recycler/New()
// On us
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/recycler(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
RefreshParts()
update_icon()
/obj/machinery/recycler/RefreshParts()
var/amt_made = 0
var/prob_mod = 0
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
amt_made = 1 * B.rating
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
if(M.rating > 1)
prob_mod = 2 * M.rating
else
prob_mod = 1 * M.rating
if(M.rating >= 3)
extra_materials = 1
else
extra_materials = 0
probability_mod = prob_mod
amount_produced = amt_made
/obj/machinery/recycler/examine(mob/user)
..()
user << "The power light is [(stat & NOPOWER) ? "off" : "on"]."
@@ -31,15 +57,22 @@ var/const/SAFETY_COOLDOWN = 100
/obj/machinery/recycler/attackby(var/obj/item/I, var/mob/user, params)
if(istype(I, /obj/item/weapon/screwdriver))
if(emagged)
emagged = 0
update_icon()
user << "<span class='notice'>You reset the crusher to its default factory settings.</span>"
else
..()
if(default_deconstruction_screwdriver(user, "grinder-oOpen", "grinder-o0", I))
return
if(exchange_parts(user, I))
return
if(default_pry_open(I))
return
if(default_unfasten_wrench(user, I))
return
default_deconstruction_crowbar(I)
..()
add_fingerprint(user)
return
/obj/machinery/recycler/emag_act(user as mob)
if(!emagged)
@@ -70,13 +103,6 @@ var/const/SAFETY_COOLDOWN = 100
return
if(safety_mode)
return
// If we're not already grinding something.
if(!grinding)
grinding = 1
spawn(1)
grinding = 0
else
return
var/move_dir = get_dir(loc, AM.loc)
if(move_dir == eat_dir)
@@ -93,15 +119,40 @@ var/const/SAFETY_COOLDOWN = 100
/obj/machinery/recycler/proc/recycle(var/obj/item/I, var/sound = 1)
I.loc = src.loc
if(is_type_in_list(I, blacklist))
qdel(I)
if(sound)
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
return
qdel(I)
if(prob(15))
new /obj/item/stack/sheet/metal(loc)
if(prob(10))
new /obj/item/stack/sheet/glass(loc)
if(prob(2))
new /obj/item/stack/sheet/plasteel(loc)
if(prob(1))
new /obj/item/stack/sheet/rglass(loc)
if(prob(15 + probability_mod))
var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(loc)
M.amount = amount_produced
if(prob(10 + probability_mod))
var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(loc)
G.amount = amount_produced
if(prob(2 + probability_mod))
var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel(loc)
P.amount = amount_produced
if(prob(1 + probability_mod))
var/obj/item/stack/sheet/rglass/R = new /obj/item/stack/sheet/rglass(loc)
R.amount = amount_produced
if(extra_materials)
if(prob(4 + probability_mod))
var/obj/item/stack/sheet/mineral/plasma/PS = new /obj/item/stack/sheet/mineral/plasma(loc)
PS.amount = amount_produced
if(prob(3 + probability_mod))
var/obj/item/stack/sheet/mineral/gold/GS = new /obj/item/stack/sheet/mineral/gold(loc)
GS.amount = amount_produced
if(prob(2 + probability_mod))
var/obj/item/stack/sheet/mineral/silver/S = new /obj/item/stack/sheet/mineral/silver(loc)
S.amount = amount_produced
if(prob(1 + probability_mod))
var/obj/item/stack/sheet/mineral/bananium/B = new /obj/item/stack/sheet/mineral/bananium(loc)
B.amount = amount_produced
if(prob(1 + probability_mod))
var/obj/item/stack/sheet/mineral/diamond/D = new /obj/item/stack/sheet/mineral/diamond(loc)
D.amount = amount_produced
if(sound)
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
+3 -3
View File
@@ -263,13 +263,13 @@
return
if(!anchored && !isinspace())
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
user << "<span class='notice'> You secure \the [src] to the floor!</span>"
user << "<span class='notice'>You secure \the [src] to the floor!</span>"
anchored = 1
else if(anchored)
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
user << "<span class='notice'> You unsecure \the [src] from the floor!</span>"
user << "<span class='notice'>You unsecure \the [src] from the floor!</span>"
if(active)
user << "<span class='notice'> \The [src] shuts off!</span>"
user << "<span class='notice'>\The [src] shuts off!</span>"
src.shields_down()
anchored = 0
+2 -2
View File
@@ -293,14 +293,14 @@
return amount
/obj/machinery/computer/slot_machine/proc/dispense(amount = 0, cointype = /obj/item/weapon/coin/silver, mob/living/target, throw = 0)
/obj/machinery/computer/slot_machine/proc/dispense(amount = 0, cointype = /obj/item/weapon/coin/silver, mob/living/target, throwit = 0)
var/value = coinvalues["[cointype]"]
while(amount >= value)
var/obj/item/weapon/coin/C = new cointype(loc) //DOUBLE THE PAIN
amount -= value
if(throw && target)
if(throwit && target)
C.throw_at(target, 3, 10)
else
random_step(C, 2, 40)
+1 -1
View File
@@ -168,7 +168,7 @@
dat+= "<HEAD><TITLE>Suit storage unit: Maintenance panel</TITLE></HEAD>"
dat+= "<B>Maintenance panel controls</B><HR>"
dat+= "The panel is ridden with controls, button and meters, labeled in strange signs and symbols that <BR>you cannot understand. Probably the manufactoring world's language.<BR> Among other things, a few controls catch your eye.<BR><BR>"
dat+= text("A small dial with a \"ë\" symbol embroidded on it. It's pointing towards a gauge that reads [].<BR> <A href='?src=\ref[];toggleUV=1'> Turn towards []</A><BR>",(src.issuperUV ? "15nm" : "185nm"),src,(src.issuperUV ? "185nm" : "15nm") )
dat+= text("A small dial with a \"ë\" symbol embroidded on it. It's pointing towards a gauge that reads [].<BR> <A href='?src=\ref[];toggleUV=1'>Turn towards []</A><BR>",(src.issuperUV ? "15nm" : "185nm"),src,(src.issuperUV ? "185nm" : "15nm") )
dat+= text("A thick old-style button, with 2 grimy LED lights next to it. The [] LED is on.<BR><A href='?src=\ref[];togglesafeties=1'>Press button</a>",(src.safetieson? "<font color='green'><B>GREEN</B></font>" : "<font color='red'><B>RED</B></font>"),src)
dat+= text("<HR><BR><A href='?src=\ref[];mach_close=suit_storage_unit'>Close panel</A>", user)
//user << browse(dat, "window=ssu_m_panel;size=400x500")
@@ -2,7 +2,7 @@
/obj/machinery/computer/telecomms/server
name = "telecommunications server monitoring console"
icon_state = "comm_logs"
icon_screen = "comm_logs"
var/screen = 0 // the screen number:
var/list/servers = list() // the servers located by the computer

Some files were not shown because too many files have changed in this diff Show More