mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-25 14:08:31 +01:00
Merge remote-tracking branch 'remotes/upstream/master' into thaw
This commit is contained in:
+2
-2
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
@@ -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 <)
|
||||
|
||||
// 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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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]'"
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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>"
|
||||
|
||||
|
||||
@@ -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 = ""
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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]"
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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()
|
||||
|
||||
+118
-46
@@ -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>"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = ""
|
||||
|
||||
*/
|
||||
@@ -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'> </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]"}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user