mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-24 20:47:10 +01:00
Merge pull request #2337 from Baystation12/bleeding-edge-freeze
Update staging
This commit is contained in:
+12
-269
@@ -5,274 +5,6 @@
|
||||
// END_INTERNALS
|
||||
// BEGIN_FILE_DIR
|
||||
#define FILE_DIR .
|
||||
#define FILE_DIR "code"
|
||||
#define FILE_DIR "code/__HELPERS"
|
||||
#define FILE_DIR "code/ATMOSPHERICS"
|
||||
#define FILE_DIR "code/ATMOSPHERICS/components"
|
||||
#define FILE_DIR "code/ATMOSPHERICS/components/binary_devices"
|
||||
#define FILE_DIR "code/ATMOSPHERICS/components/trinary_devices"
|
||||
#define FILE_DIR "code/ATMOSPHERICS/components/unary"
|
||||
#define FILE_DIR "code/controllers"
|
||||
#define FILE_DIR "code/datums"
|
||||
#define FILE_DIR "code/datums/diseases"
|
||||
#define FILE_DIR "code/datums/diseases/advance"
|
||||
#define FILE_DIR "code/datums/diseases/advance/symptoms"
|
||||
#define FILE_DIR "code/datums/helper_datums"
|
||||
#define FILE_DIR "code/datums/organs"
|
||||
#define FILE_DIR "code/datums/spells"
|
||||
#define FILE_DIR "code/defines"
|
||||
#define FILE_DIR "code/defines/obj"
|
||||
#define FILE_DIR "code/defines/procs"
|
||||
#define FILE_DIR "code/FEA"
|
||||
#define FILE_DIR "code/game"
|
||||
#define FILE_DIR "code/game/area"
|
||||
#define FILE_DIR "code/game/events"
|
||||
#define FILE_DIR "code/game/events/EventProcs"
|
||||
#define FILE_DIR "code/game/events/Events"
|
||||
#define FILE_DIR "code/game/gamemodes"
|
||||
#define FILE_DIR "code/game/gamemodes/autotraitor"
|
||||
#define FILE_DIR "code/game/gamemodes/blob"
|
||||
#define FILE_DIR "code/game/gamemodes/blob/blobs"
|
||||
#define FILE_DIR "code/game/gamemodes/changeling"
|
||||
#define FILE_DIR "code/game/gamemodes/cult"
|
||||
#define FILE_DIR "code/game/gamemodes/epidemic"
|
||||
#define FILE_DIR "code/game/gamemodes/events"
|
||||
#define FILE_DIR "code/game/gamemodes/events/holidays"
|
||||
#define FILE_DIR "code/game/gamemodes/extended"
|
||||
#define FILE_DIR "code/game/gamemodes/malfunction"
|
||||
#define FILE_DIR "code/game/gamemodes/meme"
|
||||
#define FILE_DIR "code/game/gamemodes/meteor"
|
||||
#define FILE_DIR "code/game/gamemodes/nuclear"
|
||||
#define FILE_DIR "code/game/gamemodes/revolution"
|
||||
#define FILE_DIR "code/game/gamemodes/sandbox"
|
||||
#define FILE_DIR "code/game/gamemodes/traitor"
|
||||
#define FILE_DIR "code/game/gamemodes/wizard"
|
||||
#define FILE_DIR "code/game/jobs"
|
||||
#define FILE_DIR "code/game/jobs/job"
|
||||
#define FILE_DIR "code/game/machinery"
|
||||
#define FILE_DIR "code/game/machinery/atmoalter"
|
||||
#define FILE_DIR "code/game/machinery/bots"
|
||||
#define FILE_DIR "code/game/machinery/camera"
|
||||
#define FILE_DIR "code/game/machinery/computer"
|
||||
#define FILE_DIR "code/game/machinery/doors"
|
||||
#define FILE_DIR "code/game/machinery/embedded_controller"
|
||||
#define FILE_DIR "code/game/machinery/kitchen"
|
||||
#define FILE_DIR "code/game/machinery/pipe"
|
||||
#define FILE_DIR "code/game/machinery/telecomms"
|
||||
#define FILE_DIR "code/game/magic"
|
||||
#define FILE_DIR "code/game/mecha"
|
||||
#define FILE_DIR "code/game/mecha/combat"
|
||||
#define FILE_DIR "code/game/mecha/equipment"
|
||||
#define FILE_DIR "code/game/mecha/equipment/tools"
|
||||
#define FILE_DIR "code/game/mecha/equipment/weapons"
|
||||
#define FILE_DIR "code/game/mecha/medical"
|
||||
#define FILE_DIR "code/game/mecha/working"
|
||||
#define FILE_DIR "code/game/objects"
|
||||
#define FILE_DIR "code/game/objects/closets"
|
||||
#define FILE_DIR "code/game/objects/closets/secure"
|
||||
#define FILE_DIR "code/game/objects/effects"
|
||||
#define FILE_DIR "code/game/objects/effects/decals"
|
||||
#define FILE_DIR "code/game/objects/effects/decals/Cleanable"
|
||||
#define FILE_DIR "code/game/objects/effects/spawners"
|
||||
#define FILE_DIR "code/game/objects/items"
|
||||
#define FILE_DIR "code/game/objects/items/devices"
|
||||
#define FILE_DIR "code/game/objects/items/devices/PDA"
|
||||
#define FILE_DIR "code/game/objects/items/devices/radio"
|
||||
#define FILE_DIR "code/game/objects/items/robot"
|
||||
#define FILE_DIR "code/game/objects/items/stacks"
|
||||
#define FILE_DIR "code/game/objects/items/stacks/sheets"
|
||||
#define FILE_DIR "code/game/objects/items/stacks/tiles"
|
||||
#define FILE_DIR "code/game/objects/items/weapons"
|
||||
#define FILE_DIR "code/game/objects/items/weapons/grenades"
|
||||
#define FILE_DIR "code/game/objects/items/weapons/implants"
|
||||
#define FILE_DIR "code/game/objects/items/weapons/melee"
|
||||
#define FILE_DIR "code/game/objects/items/weapons/storage"
|
||||
#define FILE_DIR "code/game/objects/items/weapons/tanks"
|
||||
#define FILE_DIR "code/game/objects/storage"
|
||||
#define FILE_DIR "code/game/objects/structures"
|
||||
#define FILE_DIR "code/game/objects/structures/crates_lockers"
|
||||
#define FILE_DIR "code/game/objects/structures/crates_lockers/closets"
|
||||
#define FILE_DIR "code/game/objects/structures/crates_lockers/closets/secure"
|
||||
#define FILE_DIR "code/game/objects/structures/stool_bed_chair_nest"
|
||||
#define FILE_DIR "code/game/structure"
|
||||
#define FILE_DIR "code/game/turfs"
|
||||
#define FILE_DIR "code/game/turfs/simulated"
|
||||
#define FILE_DIR "code/game/turfs/space"
|
||||
#define FILE_DIR "code/game/turfs/unsimulated"
|
||||
#define FILE_DIR "code/game/vehicles"
|
||||
#define FILE_DIR "code/game/verbs"
|
||||
#define FILE_DIR "code/js"
|
||||
#define FILE_DIR "code/modules"
|
||||
#define FILE_DIR "code/modules/admin"
|
||||
#define FILE_DIR "code/modules/admin/DB ban"
|
||||
#define FILE_DIR "code/modules/admin/permissionverbs"
|
||||
#define FILE_DIR "code/modules/admin/verbs"
|
||||
#define FILE_DIR "code/modules/assembly"
|
||||
#define FILE_DIR "code/modules/awaymissions"
|
||||
#define FILE_DIR "code/modules/awaymissions/maploader"
|
||||
#define FILE_DIR "code/modules/client"
|
||||
#define FILE_DIR "code/modules/clothing"
|
||||
#define FILE_DIR "code/modules/clothing/glasses"
|
||||
#define FILE_DIR "code/modules/clothing/gloves"
|
||||
#define FILE_DIR "code/modules/clothing/head"
|
||||
#define FILE_DIR "code/modules/clothing/masks"
|
||||
#define FILE_DIR "code/modules/clothing/shoes"
|
||||
#define FILE_DIR "code/modules/clothing/spacesuits"
|
||||
#define FILE_DIR "code/modules/clothing/suits"
|
||||
#define FILE_DIR "code/modules/clothing/under"
|
||||
#define FILE_DIR "code/modules/clothing/under/jobs"
|
||||
#define FILE_DIR "code/modules/customitems"
|
||||
#define FILE_DIR "code/modules/destilery"
|
||||
#define FILE_DIR "code/modules/DetectiveWork"
|
||||
#define FILE_DIR "code/modules/events"
|
||||
#define FILE_DIR "code/modules/flufftext"
|
||||
#define FILE_DIR "code/modules/food"
|
||||
#define FILE_DIR "code/modules/genetics"
|
||||
#define FILE_DIR "code/modules/icon generation"
|
||||
#define FILE_DIR "code/modules/library"
|
||||
#define FILE_DIR "code/modules/liquid"
|
||||
#define FILE_DIR "code/modules/maps"
|
||||
#define FILE_DIR "code/modules/mining"
|
||||
#define FILE_DIR "code/modules/mob"
|
||||
#define FILE_DIR "code/modules/mob/dead"
|
||||
#define FILE_DIR "code/modules/mob/dead/observer"
|
||||
#define FILE_DIR "code/modules/mob/living"
|
||||
#define FILE_DIR "code/modules/mob/living/blob"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/alien"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid/caste"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/alien/larva"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/alien/special"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/brain"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/human"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/metroid"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/monkey"
|
||||
#define FILE_DIR "code/modules/mob/living/silicon"
|
||||
#define FILE_DIR "code/modules/mob/living/silicon/ai"
|
||||
#define FILE_DIR "code/modules/mob/living/silicon/ai/freelook"
|
||||
#define FILE_DIR "code/modules/mob/living/silicon/decoy"
|
||||
#define FILE_DIR "code/modules/mob/living/silicon/pai"
|
||||
#define FILE_DIR "code/modules/mob/living/silicon/robot"
|
||||
#define FILE_DIR "code/modules/mob/living/simple_animal"
|
||||
#define FILE_DIR "code/modules/mob/living/simple_animal/friendly"
|
||||
#define FILE_DIR "code/modules/mob/living/simple_animal/hostile"
|
||||
#define FILE_DIR "code/modules/mob/living/simple_animal/hostile/retaliate"
|
||||
#define FILE_DIR "code/modules/mob/new_player"
|
||||
#define FILE_DIR "code/modules/paperwork"
|
||||
#define FILE_DIR "code/modules/power"
|
||||
#define FILE_DIR "code/modules/power/antimatter"
|
||||
#define FILE_DIR "code/modules/power/singularity"
|
||||
#define FILE_DIR "code/modules/power/singularity/particle_accelerator"
|
||||
#define FILE_DIR "code/modules/projectiles"
|
||||
#define FILE_DIR "code/modules/projectiles/ammunition"
|
||||
#define FILE_DIR "code/modules/projectiles/guns"
|
||||
#define FILE_DIR "code/modules/projectiles/guns/energy"
|
||||
#define FILE_DIR "code/modules/projectiles/guns/projectile"
|
||||
#define FILE_DIR "code/modules/projectiles/projectile"
|
||||
#define FILE_DIR "code/modules/reagents"
|
||||
#define FILE_DIR "code/modules/reagents/reagent_containers"
|
||||
#define FILE_DIR "code/modules/reagents/reagent_containers/food"
|
||||
#define FILE_DIR "code/modules/reagents/reagent_containers/food/drinks"
|
||||
#define FILE_DIR "code/modules/reagents/reagent_containers/food/drinks/bottle"
|
||||
#define FILE_DIR "code/modules/reagents/reagent_containers/food/snacks"
|
||||
#define FILE_DIR "code/modules/reagents/reagent_containers/glass"
|
||||
#define FILE_DIR "code/modules/reagents/reagent_containers/glass/bottle"
|
||||
#define FILE_DIR "code/modules/recycling"
|
||||
#define FILE_DIR "code/modules/research"
|
||||
#define FILE_DIR "code/modules/research/xenoarchaeology"
|
||||
#define FILE_DIR "code/modules/scripting"
|
||||
#define FILE_DIR "code/modules/scripting/AST"
|
||||
#define FILE_DIR "code/modules/scripting/AST/Operators"
|
||||
#define FILE_DIR "code/modules/scripting/Implementations"
|
||||
#define FILE_DIR "code/modules/scripting/Interpreter"
|
||||
#define FILE_DIR "code/modules/scripting/Parser"
|
||||
#define FILE_DIR "code/modules/scripting/Scanner"
|
||||
#define FILE_DIR "code/modules/security levels"
|
||||
#define FILE_DIR "code/modules/surgery"
|
||||
#define FILE_DIR "code/TriDimension"
|
||||
#define FILE_DIR "code/unused"
|
||||
#define FILE_DIR "code/unused/beast"
|
||||
#define FILE_DIR "code/unused/computer2"
|
||||
#define FILE_DIR "code/unused/disease2"
|
||||
#define FILE_DIR "code/unused/gamemodes"
|
||||
#define FILE_DIR "code/unused/hivebot"
|
||||
#define FILE_DIR "code/unused/mining"
|
||||
#define FILE_DIR "code/unused/optics"
|
||||
#define FILE_DIR "code/unused/pda2"
|
||||
#define FILE_DIR "code/unused/powerarmor"
|
||||
#define FILE_DIR "code/unused/spacecraft"
|
||||
#define FILE_DIR "code/WorkInProgress"
|
||||
#define FILE_DIR "code/WorkInProgress/AI_Visibility"
|
||||
#define FILE_DIR "code/WorkInProgress/animusstation"
|
||||
#define FILE_DIR "code/WorkInProgress/Apples"
|
||||
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn"
|
||||
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Economy"
|
||||
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Jungle"
|
||||
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust"
|
||||
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Supermatter"
|
||||
#define FILE_DIR "code/WorkInProgress/carn"
|
||||
#define FILE_DIR "code/WorkInProgress/Chinsky"
|
||||
#define FILE_DIR "code/WorkInProgress/Cib"
|
||||
#define FILE_DIR "code/WorkInProgress/Cib/amorph"
|
||||
#define FILE_DIR "code/WorkInProgress/Mini"
|
||||
#define FILE_DIR "code/WorkInProgress/Mloc"
|
||||
#define FILE_DIR "code/WorkInProgress/organs"
|
||||
#define FILE_DIR "code/WorkInProgress/Ported"
|
||||
#define FILE_DIR "code/WorkInProgress/Ported/Abi79"
|
||||
#define FILE_DIR "code/WorkInProgress/Ported/Bureaucracy"
|
||||
#define FILE_DIR "code/WorkInProgress/Ported/Spawners"
|
||||
#define FILE_DIR "code/WorkInProgress/Sigyn"
|
||||
#define FILE_DIR "code/WorkInProgress/Sigyn/Department Sec"
|
||||
#define FILE_DIR "code/WorkInProgress/Sigyn/Softcurity"
|
||||
#define FILE_DIR "code/WorkInProgress/SkyMarshal"
|
||||
#define FILE_DIR "code/WorkInProgress/Susan"
|
||||
#define FILE_DIR "code/WorkInProgress/Tastyfish"
|
||||
#define FILE_DIR "code/WorkInProgress/virus2"
|
||||
#define FILE_DIR "code/WorkInProgress/virus2/Disease2"
|
||||
#define FILE_DIR "code/WorkInProgress/Wrongnumber"
|
||||
#define FILE_DIR "code/ZAS"
|
||||
#define FILE_DIR "html"
|
||||
#define FILE_DIR "icons"
|
||||
#define FILE_DIR "icons/48x48"
|
||||
#define FILE_DIR "icons/effects"
|
||||
#define FILE_DIR "icons/mecha"
|
||||
#define FILE_DIR "icons/misc"
|
||||
#define FILE_DIR "icons/mob"
|
||||
#define FILE_DIR "icons/mob/human_races"
|
||||
#define FILE_DIR "icons/obj"
|
||||
#define FILE_DIR "icons/obj/assemblies"
|
||||
#define FILE_DIR "icons/obj/atmospherics"
|
||||
#define FILE_DIR "icons/obj/clothing"
|
||||
#define FILE_DIR "icons/obj/doors"
|
||||
#define FILE_DIR "icons/obj/flora"
|
||||
#define FILE_DIR "icons/obj/machines"
|
||||
#define FILE_DIR "icons/obj/pipes"
|
||||
#define FILE_DIR "icons/pda_icons"
|
||||
#define FILE_DIR "icons/spideros_icons"
|
||||
#define FILE_DIR "icons/Testing"
|
||||
#define FILE_DIR "icons/turf"
|
||||
#define FILE_DIR "icons/vending_icons"
|
||||
#define FILE_DIR "interface"
|
||||
#define FILE_DIR "maps"
|
||||
#define FILE_DIR "maps/RandomZLevels"
|
||||
#define FILE_DIR "sound"
|
||||
#define FILE_DIR "sound/AI"
|
||||
#define FILE_DIR "sound/ambience"
|
||||
#define FILE_DIR "sound/effects"
|
||||
#define FILE_DIR "sound/effects/wind"
|
||||
#define FILE_DIR "sound/hallucinations"
|
||||
#define FILE_DIR "sound/items"
|
||||
#define FILE_DIR "sound/machines"
|
||||
#define FILE_DIR "sound/mecha"
|
||||
#define FILE_DIR "sound/misc"
|
||||
#define FILE_DIR "sound/music"
|
||||
#define FILE_DIR "sound/piano"
|
||||
#define FILE_DIR "sound/violin"
|
||||
#define FILE_DIR "sound/voice"
|
||||
#define FILE_DIR "sound/weapons"
|
||||
#define FILE_DIR "tools"
|
||||
#define FILE_DIR "tools/Redirector"
|
||||
// END_FILE_DIR
|
||||
// BEGIN_PREFERENCES
|
||||
#define DEBUG
|
||||
@@ -463,6 +195,7 @@
|
||||
#include "code\game\gamemodes\events\miniblob.dm"
|
||||
#include "code\game\gamemodes\events\ninja_abilities.dm"
|
||||
#include "code\game\gamemodes\events\ninja_equipment.dm"
|
||||
#include "code\game\gamemodes\events\power_failure.dm"
|
||||
#include "code\game\gamemodes\events\space_ninja.dm"
|
||||
#include "code\game\gamemodes\events\spacevines.dm"
|
||||
#include "code\game\gamemodes\events\wormholes.dm"
|
||||
@@ -659,6 +392,7 @@
|
||||
#include "code\game\objects\weapons.dm"
|
||||
#include "code\game\objects\closets\walllocker.dm"
|
||||
#include "code\game\objects\effects\aliens.dm"
|
||||
#include "code\game\objects\effects\barsign.dm"
|
||||
#include "code\game\objects\effects\bump_teleporter.dm"
|
||||
#include "code\game\objects\effects\effect_system.dm"
|
||||
#include "code\game\objects\effects\gibs.dm"
|
||||
@@ -1005,18 +739,26 @@
|
||||
#include "code\modules\events\blob.dm"
|
||||
#include "code\modules\events\brand_intelligence.dm"
|
||||
#include "code\modules\events\carp_migration.dm"
|
||||
#include "code\modules\events\comms_blackout.dm"
|
||||
#include "code\modules\events\communications_blackout.dm"
|
||||
#include "code\modules\events\disease_outbreak.dm"
|
||||
#include "code\modules\events\electrical_storm.dm"
|
||||
#include "code\modules\events\event.dm"
|
||||
#include "code\modules\events\event_dynamic.dm"
|
||||
#include "code\modules\events\event_manager.dm"
|
||||
#include "code\modules\events\grid_check.dm"
|
||||
#include "code\modules\events\infestation.dm"
|
||||
#include "code\modules\events\ion_storm.dm"
|
||||
#include "code\modules\events\meteor_wave.dm"
|
||||
#include "code\modules\events\meteors.dm"
|
||||
#include "code\modules\events\prison_break.dm"
|
||||
#include "code\modules\events\radiation_storm.dm"
|
||||
#include "code\modules\events\rogue_drones.dm"
|
||||
#include "code\modules\events\space_ninja.dm"
|
||||
#include "code\modules\events\spacevine.dm"
|
||||
#include "code\modules\events\spider_infestation.dm"
|
||||
#include "code\modules\events\spontaneous_appendicitis.dm"
|
||||
#include "code\modules\events\viral_infection.dm"
|
||||
#include "code\modules\events\viral_outbreak.dm"
|
||||
#include "code\modules\flufftext\Dreaming.dm"
|
||||
#include "code\modules\flufftext\Hallucination.dm"
|
||||
#include "code\modules\flufftext\TextFilters.dm"
|
||||
@@ -1220,6 +962,7 @@
|
||||
#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\tree.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm"
|
||||
#include "code\modules\mob\new_player\hud.dm"
|
||||
#include "code\modules\mob\new_player\login.dm"
|
||||
|
||||
@@ -109,6 +109,8 @@
|
||||
var/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt
|
||||
var/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database
|
||||
|
||||
var/simultaneous_pm_warning_timeout = 100
|
||||
|
||||
var/use_recursive_explosions //Defines whether the server uses recursive or circular explosions.
|
||||
|
||||
var/assistant_maint = 0 //Do assistants get maint access?
|
||||
|
||||
@@ -62,6 +62,7 @@ datum/controller/game_controller/proc/setup()
|
||||
setup_objects()
|
||||
setupgenetics()
|
||||
setupfactions()
|
||||
setup_economy()
|
||||
|
||||
for(var/i=0, i<max_secret_rooms, i++)
|
||||
make_mining_asteroid_secret()
|
||||
@@ -190,6 +191,7 @@ datum/controller/game_controller/proc/process()
|
||||
|
||||
//EVENTS
|
||||
timer = world.timeofday
|
||||
process_events()
|
||||
events_cost = (world.timeofday - timer) / 10
|
||||
|
||||
//TICKER
|
||||
@@ -277,6 +279,18 @@ datum/controller/game_controller/proc/process_powernets()
|
||||
continue
|
||||
powernets.Cut(i,i+1)
|
||||
|
||||
datum/controller/game_controller/proc/process_events()
|
||||
last_thing_processed = /datum/event
|
||||
var/i = 1
|
||||
while(i<=events.len)
|
||||
var/datum/event/Event = events[i]
|
||||
if(Event)
|
||||
Event.process()
|
||||
i++
|
||||
continue
|
||||
events.Cut(i,i+1)
|
||||
checkEvent()
|
||||
|
||||
datum/controller/game_controller/proc/Recover() //Mostly a placeholder for now.
|
||||
var/msg = "## DEBUG: [time2text(world.timeofday)] MC restarted. Reports:\n"
|
||||
for(var/varname in master_controller.vars)
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
/datum/event
|
||||
|
||||
var/Lifetime = 0
|
||||
var/ActiveFor = 0
|
||||
|
||||
New()
|
||||
..()
|
||||
if(!Lifetime)
|
||||
Lifetime = rand(30, 120)
|
||||
|
||||
proc
|
||||
Announce()
|
||||
|
||||
Tick()
|
||||
|
||||
Die()
|
||||
|
||||
LongTerm()
|
||||
LongTermEvent = ActiveEvent
|
||||
ActiveEvent = null
|
||||
@@ -1,88 +0,0 @@
|
||||
/obj/effect/bhole
|
||||
name = "black hole"
|
||||
icon = 'objects.dmi'
|
||||
desc = "FUCK FUCK FUCK AAAHHH"
|
||||
icon_state = "bhole3"
|
||||
opacity = 1
|
||||
unacidable = 1
|
||||
density = 0
|
||||
anchored = 1
|
||||
|
||||
/obj/effect/bhole/New()
|
||||
spawn(4)
|
||||
controller()
|
||||
|
||||
/obj/effect/bhole/proc/controller()
|
||||
while(src)
|
||||
|
||||
if(!isturf(loc))
|
||||
del(src)
|
||||
return
|
||||
|
||||
//DESTROYING STUFF AT THE EPICENTER
|
||||
for(var/mob/living/M in orange(1,src))
|
||||
del(M)
|
||||
for(var/obj/O in orange(1,src))
|
||||
del(O)
|
||||
for(var/turf/simulated/ST in orange(1,src))
|
||||
ST.ReplaceWithSpace()
|
||||
|
||||
sleep(6)
|
||||
grav(10, 4, 10, 0 )
|
||||
sleep(6)
|
||||
grav( 8, 4, 10, 0 )
|
||||
sleep(6)
|
||||
grav( 9, 4, 10, 0 )
|
||||
sleep(6)
|
||||
grav( 7, 3, 40, 1 )
|
||||
sleep(6)
|
||||
grav( 5, 3, 40, 1 )
|
||||
sleep(6)
|
||||
grav( 6, 3, 40, 1 )
|
||||
sleep(6)
|
||||
grav( 4, 2, 50, 6 )
|
||||
sleep(6)
|
||||
grav( 3, 2, 50, 6 )
|
||||
sleep(6)
|
||||
grav( 2, 2, 75,25 )
|
||||
sleep(6)
|
||||
|
||||
|
||||
|
||||
//MOVEMENT
|
||||
if( prob(50) )
|
||||
src.anchored = 0
|
||||
step(src,pick(alldirs))
|
||||
src.anchored = 1
|
||||
|
||||
/obj/effect/bhole/proc/grav(var/r, var/ex_act_force, var/pull_chance, var/turf_removal_chance)
|
||||
if(!isturf(loc)) //blackhole cannot be contained inside anything. Weird stuff might happen
|
||||
del(src)
|
||||
return
|
||||
for(var/t = -r, t < r, t++)
|
||||
affect_coord(x+t, y-r, ex_act_force, pull_chance, turf_removal_chance)
|
||||
affect_coord(x-t, y+r, ex_act_force, pull_chance, turf_removal_chance)
|
||||
affect_coord(x+r, y+t, ex_act_force, pull_chance, turf_removal_chance)
|
||||
affect_coord(x-r, y-t, ex_act_force, pull_chance, turf_removal_chance)
|
||||
return
|
||||
|
||||
/obj/effect/bhole/proc/affect_coord(var/x, var/y, var/ex_act_force, var/pull_chance, var/turf_removal_chance)
|
||||
//Get turf at coordinate
|
||||
var/turf/T = locate(x, y, z)
|
||||
if(isnull(T)) return
|
||||
|
||||
//Pulling and/or ex_act-ing movable atoms in that turf
|
||||
if( prob(pull_chance) )
|
||||
for(var/obj/O in T.contents)
|
||||
if(O.anchored)
|
||||
O.ex_act(ex_act_force)
|
||||
else
|
||||
step_towards(O,src)
|
||||
for(var/mob/living/M in T.contents)
|
||||
step_towards(M,src)
|
||||
|
||||
//Destroying the turf
|
||||
if( T && istype(T,/turf/simulated) && prob(turf_removal_chance) )
|
||||
var/turf/simulated/ST = T
|
||||
ST.ReplaceWithSpace()
|
||||
return
|
||||
@@ -1,89 +0,0 @@
|
||||
/*
|
||||
Immovable rod random event.
|
||||
The rod will spawn at some location outside the station, and travel in a straight line to the opposite side of the station
|
||||
Everything solid in the way will be ex_act()'d
|
||||
In my current plan for it, 'solid' will be defined as anything with density == 1
|
||||
|
||||
--NEOFite
|
||||
*/
|
||||
|
||||
/obj/effect/immovablerod
|
||||
name = "Immovable Rod"
|
||||
desc = "What the fuck is that?"
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "immrod"
|
||||
throwforce = 100
|
||||
density = 1
|
||||
anchored = 1
|
||||
|
||||
Bump(atom/clong)
|
||||
if(istype(clong, /turf/simulated/shuttle)) //Skip shuttles without actually deleting the rod
|
||||
return
|
||||
|
||||
else if (istype(clong, /turf) && !istype(clong, /turf/unsimulated))
|
||||
if(clong.density)
|
||||
clong.ex_act(2)
|
||||
for (var/mob/O in hearers(src, null))
|
||||
O.show_message("CLANG", 2)
|
||||
|
||||
else if (istype(clong, /obj))
|
||||
if(clong.density)
|
||||
clong.ex_act(2)
|
||||
for (var/mob/O in hearers(src, null))
|
||||
O.show_message("CLANG", 2)
|
||||
|
||||
else if (istype(clong, /mob))
|
||||
if(clong.density || prob(10))
|
||||
clong.meteorhit(src)
|
||||
else
|
||||
del(src)
|
||||
|
||||
if(clong && prob(25))
|
||||
src.loc = clong.loc
|
||||
|
||||
/proc/immovablerod()
|
||||
var/startx = 0
|
||||
var/starty = 0
|
||||
var/endy = 0
|
||||
var/endx = 0
|
||||
var/startside = pick(cardinal)
|
||||
|
||||
switch(startside)
|
||||
if(NORTH)
|
||||
starty = 187
|
||||
startx = rand(41, 199)
|
||||
endy = 38
|
||||
endx = rand(41, 199)
|
||||
if(EAST)
|
||||
starty = rand(38, 187)
|
||||
startx = 199
|
||||
endy = rand(38, 187)
|
||||
endx = 41
|
||||
if(SOUTH)
|
||||
starty = 38
|
||||
startx = rand(41, 199)
|
||||
endy = 187
|
||||
endx = rand(41, 199)
|
||||
if(WEST)
|
||||
starty = rand(38, 187)
|
||||
startx = 41
|
||||
endy = rand(38, 187)
|
||||
endx = 199
|
||||
|
||||
//rod time!
|
||||
var/obj/effect/immovablerod/immrod = new /obj/effect/immovablerod(locate(startx, starty, 1))
|
||||
// world << "Rod in play, starting at [start.loc.x],[start.loc.y] and going to [end.loc.x],[end.loc.y]"
|
||||
var/end = locate(endx, endy, 1)
|
||||
spawn(0)
|
||||
walk_towards(immrod, end,1)
|
||||
sleep(1)
|
||||
while (immrod)
|
||||
if (immrod.z != 1)
|
||||
immrod.z = 1
|
||||
if(immrod.loc == end)
|
||||
del(immrod)
|
||||
sleep(10)
|
||||
for(var/obj/effect/immovablerod/imm in world)
|
||||
return
|
||||
sleep(50)
|
||||
command_alert("What the fuck was that?!", "General Alert")
|
||||
@@ -1,122 +0,0 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
|
||||
|
||||
/*
|
||||
Space dust
|
||||
Commonish random event that causes small clumps of "space dust" to hit the station at high speeds.
|
||||
No command report on the common version of this event.
|
||||
The "dust" will damage the hull of the station causin minor hull breaches.
|
||||
*/
|
||||
|
||||
/proc/dust_swarm(var/strength = "weak")
|
||||
var/numbers = 1
|
||||
switch(strength)
|
||||
if("weak")
|
||||
numbers = rand(2,4)
|
||||
for(var/i = 0 to numbers)
|
||||
new/obj/effect/space_dust/weak()
|
||||
if("norm")
|
||||
numbers = rand(5,10)
|
||||
for(var/i = 0 to numbers)
|
||||
new/obj/effect/space_dust()
|
||||
if("strong")
|
||||
numbers = rand(10,15)
|
||||
for(var/i = 0 to numbers)
|
||||
new/obj/effect/space_dust/strong()
|
||||
if("super")
|
||||
numbers = rand(15,25)
|
||||
for(var/i = 0 to numbers)
|
||||
new/obj/effect/space_dust/super()
|
||||
return
|
||||
|
||||
|
||||
/obj/effect/space_dust
|
||||
name = "Space Dust"
|
||||
desc = "Dust in space."
|
||||
icon = 'icons/obj/meteor.dmi'
|
||||
icon_state = "space_dust"
|
||||
density = 1
|
||||
anchored = 1
|
||||
var/strength = 2 //ex_act severity number
|
||||
var/life = 2 //how many things we hit before del(src)
|
||||
|
||||
weak
|
||||
strength = 3
|
||||
life = 1
|
||||
|
||||
strong
|
||||
strength = 1
|
||||
life = 6
|
||||
|
||||
super
|
||||
strength = 1
|
||||
life = 40
|
||||
|
||||
|
||||
New()
|
||||
var/startx = 0
|
||||
var/starty = 0
|
||||
var/endy = 0
|
||||
var/endx = 0
|
||||
var/startside = pick(cardinal)
|
||||
|
||||
switch(startside)
|
||||
if(NORTH)
|
||||
starty = world.maxy-(TRANSITIONEDGE+1)
|
||||
startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1))
|
||||
endy = TRANSITIONEDGE
|
||||
endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE)
|
||||
if(EAST)
|
||||
starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1))
|
||||
startx = world.maxx-(TRANSITIONEDGE+1)
|
||||
endy = rand(TRANSITIONEDGE, world.maxy-TRANSITIONEDGE)
|
||||
endx = TRANSITIONEDGE
|
||||
if(SOUTH)
|
||||
starty = (TRANSITIONEDGE+1)
|
||||
startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1))
|
||||
endy = world.maxy-TRANSITIONEDGE
|
||||
endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE)
|
||||
if(WEST)
|
||||
starty = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1))
|
||||
startx = (TRANSITIONEDGE+1)
|
||||
endy = rand(TRANSITIONEDGE,world.maxy-TRANSITIONEDGE)
|
||||
endx = world.maxx-TRANSITIONEDGE
|
||||
var/goal = locate(endx, endy, 1)
|
||||
src.x = startx
|
||||
src.y = starty
|
||||
src.z = 1
|
||||
spawn(0)
|
||||
walk_towards(src, goal, 1)
|
||||
return
|
||||
|
||||
|
||||
Bump(atom/A)
|
||||
spawn(0)
|
||||
if(prob(50))
|
||||
for(var/mob/M in range(10, src))
|
||||
if(!M.stat && !istype(M, /mob/living/silicon/ai))
|
||||
shake_camera(M, 3, 1)
|
||||
if (A)
|
||||
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
|
||||
|
||||
if(ismob(A))
|
||||
A.meteorhit(src)//This should work for now I guess
|
||||
else if(!istype(A,/obj/machinery/emitter) && !istype(A,/obj/machinery/field_generator)) //Protect the singularity from getting released every round!
|
||||
A.ex_act(strength) //Changing emitter/field gen ex_act would make it immune to bombs and C4
|
||||
|
||||
life--
|
||||
if(life <= 0)
|
||||
walk(src,0)
|
||||
spawn(1)
|
||||
del(src)
|
||||
return 0
|
||||
return
|
||||
|
||||
|
||||
Bumped(atom/A)
|
||||
Bump(A)
|
||||
return
|
||||
|
||||
|
||||
ex_act(severity)
|
||||
del(src)
|
||||
return
|
||||
@@ -1,37 +0,0 @@
|
||||
/proc/mini_blob_event()
|
||||
|
||||
var/turf/T = pick(blobstart)
|
||||
if(istype(T, /turf/simulated/wall))
|
||||
T.ReplaceWithPlating()
|
||||
for(var/atom/A in T)
|
||||
if(A.density)
|
||||
del(A)
|
||||
var/obj/effect/blob/bl = new /obj/effect/blob( T, 30 )
|
||||
spawn(0)
|
||||
bl.Life()
|
||||
bl.Life()
|
||||
bl.Life()
|
||||
bl.Life()
|
||||
bl.blobdebug = 1
|
||||
bl.Life()
|
||||
blobevent = 1
|
||||
spawn(0)
|
||||
dotheblobbaby()
|
||||
spawn(15000)
|
||||
blobevent = 0
|
||||
spawn(rand(600, 1800)) //Delayed announcements to keep the crew on their toes.
|
||||
command_alert("Confirmed outbreak of level 5 biohazard aboard [station_name()].", "Biohazard Alert")
|
||||
world << sound('outbreak5.ogg')
|
||||
|
||||
/proc/dotheblobbaby()
|
||||
if (blobevent)
|
||||
if(blobs.len)
|
||||
for(var/i = 1 to 10)
|
||||
sleep(-1)
|
||||
if(!blobs.len) break
|
||||
var/obj/effect/blob/B = pick(blobs)
|
||||
if(B.z != 1)
|
||||
continue
|
||||
B.Life()
|
||||
spawn(150)
|
||||
dotheblobbaby()
|
||||
@@ -1,429 +0,0 @@
|
||||
/*
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
+++++++++++++++++++++++++++++++++// //++++++++++++++++++++++++++++++++++
|
||||
==================================SPACE NINJA ABILITIES====================================
|
||||
___________________________________________________________________________________________
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*/
|
||||
|
||||
//=======//SAFETY CHECK//=======//
|
||||
/*
|
||||
X is optional, tells the proc to check for specific stuff. C is also optional.
|
||||
All the procs here assume that the character is wearing the ninja suit if they are using the procs.
|
||||
They should, as I have made every effort for that to be the case.
|
||||
In the case that they are not, I imagine the game will run-time error like crazy.
|
||||
s_cooldown ticks off each second based on the suit recharge proc, in seconds. Default of 1 seconds. Some abilities have no cool down.
|
||||
*/
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjacost(C = 0,X = 0)
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
if( (U.stat||U.incorporeal_move)&&X!=3 )//Will not return if user is using an adrenaline booster since you can use them when stat==1.
|
||||
U << "\red You must be conscious and solid to do this."//It's not a problem of stat==2 since the ninja will explode anyway if they die.
|
||||
return 1
|
||||
else if(C&&cell.charge<C*10)
|
||||
U << "\red Not enough energy."
|
||||
return 1
|
||||
switch(X)
|
||||
if(1)
|
||||
cancel_stealth()//Get rid of it.
|
||||
if(2)
|
||||
if(s_bombs<=0)
|
||||
U << "\red There are no more smoke bombs remaining."
|
||||
return 1
|
||||
if(3)
|
||||
if(a_boost<=0)
|
||||
U << "\red You do not have any more adrenaline boosters."
|
||||
return 1
|
||||
return (s_coold)//Returns the value of the variable which counts down to zero.
|
||||
|
||||
//=======//TELEPORT GRAB CHECK//=======//
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/handle_teleport_grab(turf/T, mob/living/U)
|
||||
if(istype(U.get_active_hand(),/obj/item/weapon/grab))//Handles grabbed persons.
|
||||
var/obj/item/weapon/grab/G = U.get_active_hand()
|
||||
G.affecting.loc = locate(T.x+rand(-1,1),T.y+rand(-1,1),T.z)//variation of position.
|
||||
if(istype(U.get_inactive_hand(),/obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = U.get_inactive_hand()
|
||||
G.affecting.loc = locate(T.x+rand(-1,1),T.y+rand(-1,1),T.z)//variation of position.
|
||||
return
|
||||
|
||||
//=======//SMOKE//=======//
|
||||
/*Summons smoke in radius of user.
|
||||
Not sure why this would be useful (it's not) but whatever. Ninjas need their smoke bombs.*/
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke()
|
||||
set name = "Smoke Bomb"
|
||||
set desc = "Blind your enemies momentarily with a well-placed smoke bomb."
|
||||
set category = "Ninja Ability"
|
||||
set popup_menu = 0//Will not see it when right clicking.
|
||||
|
||||
if(!ninjacost(,2))
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
U << "\blue There are <B>[s_bombs]</B> smoke bombs remaining."
|
||||
var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread()
|
||||
smoke.set_up(10, 0, U.loc)
|
||||
smoke.start()
|
||||
playsound(U.loc, 'sound/effects/bamf.ogg', 50, 2)
|
||||
s_bombs--
|
||||
s_coold = 1
|
||||
return
|
||||
|
||||
//=======//9-8 TILE TELEPORT//=======//
|
||||
//Click to to teleport 9-10 tiles in direction facing.
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt()
|
||||
set name = "Phase Jaunt (10E)"
|
||||
set desc = "Utilizes the internal VOID-shift device to rapidly transit in direction facing."
|
||||
set category = "Ninja Ability"
|
||||
set popup_menu = 0
|
||||
|
||||
var/C = 100
|
||||
if(!ninjacost(C,1))
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
var/turf/destination = get_teleport_loc(U.loc,U,9,1,3,1,0,1)
|
||||
var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below.
|
||||
if(destination&&istype(mobloc, /turf))//The turf check prevents unusual behavior. Like teleporting out of cryo pods, cloners, mechs, etc.
|
||||
spawn(0)
|
||||
playsound(U.loc, "sparks", 50, 1)
|
||||
anim(mobloc,src,'icons/mob/mob.dmi',,"phaseout",,U.dir)
|
||||
|
||||
handle_teleport_grab(destination, U)
|
||||
U.loc = destination
|
||||
|
||||
spawn(0)
|
||||
spark_system.start()
|
||||
playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1)
|
||||
playsound(U.loc, "sparks", 50, 1)
|
||||
anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir)
|
||||
|
||||
spawn(0)
|
||||
destination.kill_creatures(U)//Any living mobs in teleport area are gibbed. Check turf procs for how it does it.
|
||||
s_coold = 1
|
||||
cell.charge-=(C*10)
|
||||
else
|
||||
U << "\red The VOID-shift device is malfunctioning, <B>teleportation failed</B>."
|
||||
return
|
||||
|
||||
//=======//RIGHT CLICK TELEPORT//=======//
|
||||
//Right click to teleport somewhere, almost exactly like admin jump to turf.
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjashift(turf/T in oview())
|
||||
set name = "Phase Shift (20E)"
|
||||
set desc = "Utilizes the internal VOID-shift device to rapidly transit to a destination in view."
|
||||
set category = null//So it does not show up on the panel but can still be right-clicked.
|
||||
set src = usr.contents//Fixes verbs not attaching properly for objects. Praise the DM reference guide!
|
||||
|
||||
var/C = 200
|
||||
if(!ninjacost(C,1))
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below.
|
||||
if((!T.density)&&istype(mobloc, /turf))
|
||||
spawn(0)
|
||||
playsound(U.loc, 'sound/effects/sparks4.ogg', 50, 1)
|
||||
anim(mobloc,src,'icons/mob/mob.dmi',,"phaseout",,U.dir)
|
||||
|
||||
handle_teleport_grab(T, U)
|
||||
U.loc = T
|
||||
|
||||
spawn(0)
|
||||
spark_system.start()
|
||||
playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1)
|
||||
playsound(U.loc, 'sound/effects/sparks2.ogg', 50, 1)
|
||||
anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir)
|
||||
|
||||
spawn(0)//Any living mobs in teleport area are gibbed.
|
||||
T.kill_creatures(U)
|
||||
s_coold = 1
|
||||
cell.charge-=(C*10)
|
||||
else
|
||||
U << "\red You cannot teleport into solid walls or from solid matter"
|
||||
return
|
||||
|
||||
//=======//EM PULSE//=======//
|
||||
//Disables nearby tech equipment.
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjapulse()
|
||||
set name = "EM Burst (25E)"
|
||||
set desc = "Disable any nearby technology with a electro-magnetic pulse."
|
||||
set category = "Ninja Ability"
|
||||
set popup_menu = 0
|
||||
|
||||
var/C = 250
|
||||
if(!ninjacost(C,1))
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
playsound(U.loc, 'sound/effects/EMPulse.ogg', 60, 2)
|
||||
empulse(U, 4, 6) //Procs sure are nice. Slightly weaker than wizard's disable tch.
|
||||
s_coold = 2
|
||||
cell.charge-=(C*10)
|
||||
return
|
||||
|
||||
//=======//ENERGY BLADE//=======//
|
||||
//Summons a blade of energy in active hand.
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjablade()
|
||||
set name = "Energy Blade (5E)"
|
||||
set desc = "Create a focused beam of energy in your active hand."
|
||||
set category = "Ninja Ability"
|
||||
set popup_menu = 0
|
||||
|
||||
var/C = 50
|
||||
if(!ninjacost(C))
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
if(!kamikaze)
|
||||
if(!U.get_active_hand()&&!istype(U.get_inactive_hand(), /obj/item/weapon/melee/energy/blade))
|
||||
var/obj/item/weapon/melee/energy/blade/W = new()
|
||||
spark_system.start()
|
||||
playsound(U.loc, "sparks", 50, 1)
|
||||
U.put_in_hands(W)
|
||||
cell.charge-=(C*10)
|
||||
else
|
||||
U << "\red You can only summon one blade. Try dropping an item first."
|
||||
else//Else you can run around with TWO energy blades. I don't know why you'd want to but cool factor remains.
|
||||
if(!U.get_active_hand())
|
||||
var/obj/item/weapon/melee/energy/blade/W = new()
|
||||
U.put_in_hands(W)
|
||||
if(!U.get_inactive_hand())
|
||||
var/obj/item/weapon/melee/energy/blade/W = new()
|
||||
U.put_in_inactive_hand(W)
|
||||
spark_system.start()
|
||||
playsound(U.loc, "sparks", 50, 1)
|
||||
s_coold = 1
|
||||
return
|
||||
|
||||
//=======//NINJA STARS//=======//
|
||||
/*Shoots ninja stars at random people.
|
||||
This could be a lot better but I'm too tired atm.*/
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjastar()
|
||||
set name = "Energy Star (5E)"
|
||||
set desc = "Launches an energy star at a random living target."
|
||||
set category = "Ninja Ability"
|
||||
set popup_menu = 0
|
||||
|
||||
var/C = 50
|
||||
if(!ninjacost(C))
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
var/targets[] = list()//So yo can shoot while yo throw dawg
|
||||
for(var/mob/living/M in oview(loc))
|
||||
if(M.stat) continue//Doesn't target corpses or paralyzed persons.
|
||||
targets.Add(M)
|
||||
if(targets.len)
|
||||
var/mob/living/target=pick(targets)//The point here is to pick a random, living mob in oview to shoot stuff at.
|
||||
|
||||
var/turf/curloc = U.loc
|
||||
var/atom/targloc = get_turf(target)
|
||||
if (!targloc || !istype(targloc, /turf) || !curloc)
|
||||
return
|
||||
if (targloc == curloc)
|
||||
return
|
||||
var/obj/item/projectile/energy/dart/A = new /obj/item/projectile/energy/dart(U.loc)
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
cell.charge-=(C*10)
|
||||
A.process()
|
||||
else
|
||||
U << "\red There are no targets in view."
|
||||
return
|
||||
|
||||
//=======//ENERGY NET//=======//
|
||||
/*Allows the ninja to capture people, I guess.
|
||||
Must right click on a mob to activate.*/
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjanet(mob/living/carbon/M in oview())//Only living carbon mobs.
|
||||
set name = "Energy Net (20E)"
|
||||
set desc = "Captures a fallen opponent in a net of energy. Will teleport them to a holding facility after 30 seconds."
|
||||
set category = null
|
||||
set src = usr.contents
|
||||
|
||||
var/C = 200
|
||||
if(!ninjacost(C,1)&&iscarbon(M))
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
if(M.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
|
||||
//if(M)//DEBUG
|
||||
if(!locate(/obj/effect/energy_net) in M.loc)//Check if they are already being affected by an energy net.
|
||||
for(var/turf/T in getline(U.loc, M.loc))
|
||||
if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy.
|
||||
U << "You may not use an energy net through solid obstacles!"
|
||||
return
|
||||
spawn(0)
|
||||
U.Beam(M,"n_beam",,15)
|
||||
M.anchored = 1//Anchors them so they can't move.
|
||||
U.say("Get over here!")
|
||||
var/obj/effect/energy_net/E = new /obj/effect/energy_net(M.loc)
|
||||
E.layer = M.layer+1//To have it appear one layer above the mob.
|
||||
for(var/mob/O in viewers(U, 3))
|
||||
O.show_message(text("\red [] caught [] with an energy net!", U, M), 1)
|
||||
E.affecting = M
|
||||
E.master = U
|
||||
spawn(0)//Parallel processing.
|
||||
E.process(M)
|
||||
cell.charge-=(C*10)
|
||||
else
|
||||
U << "They are already trapped inside an energy net."
|
||||
else
|
||||
U << "They will bring no honor to your Clan!"
|
||||
return
|
||||
|
||||
//=======//ADRENALINE BOOST//=======//
|
||||
/*Wakes the user so they are able to do their thing. Also injects a decent dose of radium.
|
||||
Movement impairing would indicate drugs and the like.*/
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjaboost()
|
||||
set name = "Adrenaline Boost"
|
||||
set desc = "Inject a secret chemical that will counteract all movement-impairing effect."
|
||||
set category = "Ninja Ability"
|
||||
set popup_menu = 0
|
||||
|
||||
if(!ninjacost(,3))//Have to make sure stat is not counted for this ability.
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
//Wouldn't need to track adrenaline boosters if there was a miracle injection to get rid of paralysis and the like instantly.
|
||||
//For now, adrenaline boosters ARE the miracle injection. Well, radium, really.
|
||||
U.SetParalysis(0)
|
||||
U.SetStunned(0)
|
||||
U.SetWeakened(0)
|
||||
/*
|
||||
Due to lag, it was possible to adrenaline boost but remain helpless while life.dm resets player stat.
|
||||
This lead to me and others spamming adrenaline boosters because they failed to kick in on time.
|
||||
It's technically possible to come back from crit with this but it is very temporary.
|
||||
Life.dm will kick the player back into unconsciosness the next process loop.
|
||||
*/
|
||||
U.stat = 0//At least now you should be able to teleport away or shoot ninja stars.
|
||||
spawn(30)//Slight delay so the enemy does not immedietly know the ability was used. Due to lag, this often came before waking up.
|
||||
U.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!"))
|
||||
spawn(70)
|
||||
reagents.reaction(U, 2)
|
||||
reagents.trans_id_to(U, "radium", a_transfer)
|
||||
U << "\red You are beginning to feel the after-effect of the injection."
|
||||
a_boost--
|
||||
s_coold = 3
|
||||
return
|
||||
|
||||
/*
|
||||
===================================================================================
|
||||
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<KAMIKAZE MODE>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
===================================================================================
|
||||
Or otherwise known as anime mode. Which also happens to be ridiculously powerful.
|
||||
*/
|
||||
|
||||
//=======//NINJA MOVEMENT//=======//
|
||||
//Also makes you move like you're on crack.
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjawalk()
|
||||
set name = "Shadow Walk"
|
||||
set desc = "Combines the VOID-shift and CLOAK-tech devices to freely move between solid matter. Toggle on or off."
|
||||
set category = "Ninja Ability"
|
||||
set popup_menu = 0
|
||||
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
if(!U.incorporeal_move)
|
||||
U.incorporeal_move = 2
|
||||
U << "\blue You will now phase through solid matter."
|
||||
else
|
||||
U.incorporeal_move = 0
|
||||
U << "\blue You will no-longer phase through solid matter."
|
||||
return
|
||||
|
||||
//=======//5 TILE TELEPORT/GIB//=======//
|
||||
//Allows to gib up to five squares in a straight line. Seriously.
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjaslayer()
|
||||
set name = "Phase Slayer"
|
||||
set desc = "Utilizes the internal VOID-shift device to mutilate creatures in a straight line."
|
||||
set category = "Ninja Ability"
|
||||
set popup_menu = 0
|
||||
|
||||
if(!ninjacost())
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
var/turf/destination = get_teleport_loc(U.loc,U,5)
|
||||
var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below.
|
||||
if(destination&&istype(mobloc, /turf))
|
||||
U.say("Ai Satsugai!")
|
||||
spawn(0)
|
||||
playsound(U.loc, "sparks", 50, 1)
|
||||
anim(mobloc,U,'icons/mob/mob.dmi',,"phaseout",,U.dir)
|
||||
|
||||
spawn(0)
|
||||
for(var/turf/T in getline(mobloc, destination))
|
||||
spawn(0)
|
||||
T.kill_creatures(U)
|
||||
if(T==mobloc||T==destination) continue
|
||||
spawn(0)
|
||||
anim(T,U,'icons/mob/mob.dmi',,"phasein",,U.dir)
|
||||
|
||||
handle_teleport_grab(destination, U)
|
||||
U.loc = destination
|
||||
|
||||
spawn(0)
|
||||
spark_system.start()
|
||||
playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1)
|
||||
playsound(U.loc, "sparks", 50, 1)
|
||||
anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir)
|
||||
s_coold = 1
|
||||
else
|
||||
U << "\red The VOID-shift device is malfunctioning, <B>teleportation failed</B>."
|
||||
return
|
||||
|
||||
//=======//TELEPORT BEHIND MOB//=======//
|
||||
/*Appear behind a randomly chosen mob while a few decoy teleports appear.
|
||||
This is so anime it hurts. But that's the point.*/
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjamirage()
|
||||
set name = "Spider Mirage"
|
||||
set desc = "Utilizes the internal VOID-shift device to create decoys and teleport behind a random target."
|
||||
set category = "Ninja Ability"
|
||||
set popup_menu = 0
|
||||
|
||||
if(!ninjacost())//Simply checks for stat.
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
var/targets[]
|
||||
targets = new()
|
||||
for(var/mob/living/M in oview(6))
|
||||
if(M.stat) continue//Doesn't target corpses or paralyzed people.
|
||||
targets.Add(M)
|
||||
if(targets.len)
|
||||
var/mob/living/target=pick(targets)
|
||||
var/locx
|
||||
var/locy
|
||||
var/turf/mobloc = get_turf(target.loc)
|
||||
var/safety = 0
|
||||
switch(target.dir)
|
||||
if(NORTH)
|
||||
locx = mobloc.x
|
||||
locy = (mobloc.y-1)
|
||||
if(locy<1)
|
||||
safety = 1
|
||||
if(SOUTH)
|
||||
locx = mobloc.x
|
||||
locy = (mobloc.y+1)
|
||||
if(locy>world.maxy)
|
||||
safety = 1
|
||||
if(EAST)
|
||||
locy = mobloc.y
|
||||
locx = (mobloc.x-1)
|
||||
if(locx<1)
|
||||
safety = 1
|
||||
if(WEST)
|
||||
locy = mobloc.y
|
||||
locx = (mobloc.x+1)
|
||||
if(locx>world.maxx)
|
||||
safety = 1
|
||||
else safety=1
|
||||
if(!safety&&istype(mobloc, /turf))
|
||||
U.say("Kumo no Shinkiro!")
|
||||
var/turf/picked = locate(locx,locy,mobloc.z)
|
||||
spawn(0)
|
||||
playsound(U.loc, "sparks", 50, 1)
|
||||
anim(mobloc,U,'icons/mob/mob.dmi',,"phaseout",,U.dir)
|
||||
|
||||
spawn(0)
|
||||
var/limit = 4
|
||||
for(var/turf/T in oview(5))
|
||||
if(prob(20))
|
||||
spawn(0)
|
||||
anim(T,U,'icons/mob/mob.dmi',,"phasein",,U.dir)
|
||||
limit--
|
||||
if(limit<=0) break
|
||||
|
||||
handle_teleport_grab(picked, U)
|
||||
U.loc = picked
|
||||
U.dir = target.dir
|
||||
|
||||
spawn(0)
|
||||
spark_system.start()
|
||||
playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1)
|
||||
playsound(U.loc, "sparks", 50, 1)
|
||||
anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir)
|
||||
s_coold = 1
|
||||
else
|
||||
U << "\red The VOID-shift device is malfunctioning, <B>teleportation failed</B>."
|
||||
else
|
||||
U << "\red There are no targets in view."
|
||||
return
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,996 +0,0 @@
|
||||
/*
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
+++++++++++++++++++++++++++++++++++++// //++++++++++++++++++++++++++++++++++
|
||||
======================================SPACE NINJA SETUP====================================
|
||||
___________________________________________________________________________________________
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*/
|
||||
|
||||
/*
|
||||
README:
|
||||
|
||||
Data:
|
||||
|
||||
>> space_ninja.dm << is this file. It contains a variety of procs related to either spawning space ninjas,
|
||||
modifying their verbs, various help procs, testing debug-related content, or storing unused procs for later.
|
||||
Similar functions should go into this file, along with anything else that may not have an explicit category.
|
||||
IMPORTANT: actual ninja suit, gloves, etc, are stored under the appropriate clothing files. If you need to change
|
||||
variables or look them up, look there. Easiest way is through the map file browser.
|
||||
|
||||
>> ninja_abilities.dm << contains all the ninja-related powers. Spawning energy swords, teleporting, and the like.
|
||||
If more powers are added, or perhaps something related to powers, it should go there. Make sure to describe
|
||||
what an ability/power does so it's easier to reference later without looking at the code.
|
||||
IMPORTANT: verbs are still somewhat funky to work with. If an argument is specified but is not referenced in a way
|
||||
BYOND likes, in the code content, the verb will fail to trigger. Nothing will happen, literally, when clicked.
|
||||
This can be bypassed by either referencing the argument properly, or linking to another proc with the argument
|
||||
attached. The latter is what I like to do for certain cases--sometimes it's necessary to do that regardless.
|
||||
|
||||
>> ninja_equipment.dm << deals with all the equipment-related procs for a ninja. Primarily it has the suit, gloves,
|
||||
and mask. The suit is by far the largest section of code out of the three and includes a lot of code that ties in
|
||||
to other functions. This file has gotten kind of large so breaking it up may be in order. I use section hearders.
|
||||
IMPORTANT: not much to say here. Follow along with the comments and adding new functions should be a breeze. Also
|
||||
know that certain equipment pieces are linked in other files. The energy blade, for example, has special
|
||||
functions defined in the appropriate files (airlock, securestorage, etc).
|
||||
|
||||
General Notes:
|
||||
|
||||
I created space ninjas with the expressed purpose of spicing up boring rounds. That is, ninjas are to xenos as marauders are to
|
||||
death squads. Ninjas are stealthy, tech-savvy, and powerful. Not to say marauders are all of those things, but a clever ninja
|
||||
should have little problem murderampaging their way through just about anything. Short of admin wizards maybe.
|
||||
HOWEVER!
|
||||
Ninjas also have a fairly great weakness as they require energy to use abilities. If, theoretically, there is a game
|
||||
mode based around space ninjas, make sure to account for their energy needs.
|
||||
|
||||
Admin Notes:
|
||||
|
||||
Ninjas are not admin PCs--please do not use them for that purpose. They are another way to participate in the game post-death,
|
||||
like pais, xenos, death squads, and cyborgs.
|
||||
I'm currently looking for feedback from regular players since beta testing is largely done. I would appreciate if
|
||||
you spawned regular players as ninjas when rounds are boring. Or exciting, it's all good as long as there is feedback.
|
||||
You can also spawn ninja gear manually if you want to.
|
||||
|
||||
How to do that:
|
||||
Make sure your character has a mind.
|
||||
Change their assigned_role to "MODE", no quotes. Otherwise, the suit won't initialize.
|
||||
Change their special_role to "Space Ninja", no quotes. Otherwise, the character will be gibbed.
|
||||
Spawn ninja gear, put it on, hit initialize. Let the suit do the rest. You are now a space ninja.
|
||||
I don't recommend messing with suit variables unless you really know what you're doing.
|
||||
|
||||
Miscellaneous Notes:
|
||||
|
||||
Potential Upgrade Tree:
|
||||
Energy Shield:
|
||||
Extra Ability
|
||||
Syndicate Shield device?
|
||||
Works like the force wall spell, except can be kept indefinitely as long as energy remains. Toggled on or off.
|
||||
Would block bullets and the like.
|
||||
Phase Shift
|
||||
Extra Ability
|
||||
Advanced Sensors?
|
||||
Instead of being unlocked at the start, Phase Shieft would become available once requirements are met.
|
||||
Uranium-based Recharger:
|
||||
Suit Upgrade
|
||||
Unsure
|
||||
Instead of losing energy each second, the suit would regain the same amount of energy.
|
||||
This would not count in activating stealth and similar.
|
||||
Extended Battery Life:
|
||||
Suit Upgrade
|
||||
Battery of higher capacity
|
||||
Already implemented. Replace current battery with one of higher capacity.
|
||||
Advanced Cloak-Tech device.
|
||||
Suit Upgrade
|
||||
Syndicate Cloaking Device?
|
||||
Remove cloak failure rate.
|
||||
*/
|
||||
|
||||
//=======//RANDOM EVENT//=======//
|
||||
/*
|
||||
Also a dynamic ninja mission generator.
|
||||
I decided to scrap round-specific objectives since keeping track of them would require some form of tracking.
|
||||
When I already created about 4 new objectives, this doesn't seem terribly important or needed.
|
||||
*/
|
||||
|
||||
/var/global/toggle_space_ninja = 0//If ninjas can spawn or not.
|
||||
/var/global/sent_ninja_to_station = 0//If a ninja is already on the station.
|
||||
|
||||
/proc/space_ninja_arrival()
|
||||
|
||||
var/datum/game_mode/current_mode = ticker.mode
|
||||
var/datum/mind/current_mind
|
||||
|
||||
/*Is the ninja playing for the good or bad guys? Is the ninja helping or hurting the station?
|
||||
Their directives also influence behavior. At least in theory.*/
|
||||
var/side = pick("face","heel")
|
||||
|
||||
var/antagonist_list[] = list()//The main bad guys. Evil minds that plot destruction.
|
||||
var/protagonist_list[] = current_mode.get_living_heads()//The good guys. Mostly Heads. Who are alive.
|
||||
|
||||
var/xeno_list[] = list()//Aliens.
|
||||
var/commando_list[] = list()//Commandos.
|
||||
|
||||
//We want the ninja to appear only in certain modes.
|
||||
// var/acceptable_modes_list[] = list("traitor","revolution","cult","wizard","changeling","traitorchan","nuclear","malfunction","monkey") // Commented out for both testing and ninjas
|
||||
// if(!(current_mode.config_tag in acceptable_modes_list))
|
||||
// return
|
||||
|
||||
/*No longer need to determine what mode it is since bad guys are basically universal.
|
||||
And there is now a mode with two types of bad guys.*/
|
||||
|
||||
var/possible_bad_dudes[] = list(current_mode.traitors,current_mode.head_revolutionaries,current_mode.head_revolutionaries,
|
||||
current_mode.cult,current_mode.wizards,current_mode.changelings,current_mode.syndicates)
|
||||
for(var/list in possible_bad_dudes)//For every possible antagonist type.
|
||||
for(current_mind in list)//For each mind in that list.
|
||||
if(current_mind.current&¤t_mind.current.stat!=2)//If they are not destroyed and not dead.
|
||||
antagonist_list += current_mind//Add them.
|
||||
|
||||
if(protagonist_list.len)//If the mind is both a protagonist and antagonist.
|
||||
for(current_mind in protagonist_list)
|
||||
if(current_mind in antagonist_list)
|
||||
protagonist_list -= current_mind//We only want it in one list.
|
||||
/*
|
||||
Malf AIs/silicons aren't added. Monkeys aren't added. Messes with objective completion. Only humans are added.
|
||||
*/
|
||||
|
||||
//Here we pick a location and spawn the ninja.
|
||||
var/list/spawn_list = list()
|
||||
for(var/obj/effect/landmark/L in world)
|
||||
if(L.name == "carpspawn")
|
||||
spawn_list.Add(L)
|
||||
|
||||
|
||||
var/list/candidates = list() //list of candidate keys
|
||||
for(var/mob/dead/observer/G in player_list)
|
||||
if(!G.client.holder && ((G.client.inactivity/10)/60) <= 5)
|
||||
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||
candidates += G.key
|
||||
if(!candidates.len) return
|
||||
|
||||
|
||||
//The ninja will be created on the right spawn point or at late join.
|
||||
var/mob/living/carbon/human/new_ninja = create_space_ninja(pick(spawn_list.len ? spawn_list : latejoin ))
|
||||
new_ninja.key = pick(candidates)
|
||||
new_ninja.wear_suit:randomize_param()//Give them a random set of suit parameters.
|
||||
new_ninja.internal = new_ninja.s_store //So the poor ninja has something to breath when they spawn in spess.
|
||||
new_ninja.internals.icon_state = "internal1"
|
||||
|
||||
//Now for the rest of the stuff.
|
||||
|
||||
var/datum/mind/ninja_mind = new_ninja.mind//For easier reference.
|
||||
var/mission_set = 0//To determine if we need to do further processing.
|
||||
//Xenos and deathsquads take precedence over everything else.
|
||||
|
||||
//Unless the xenos are hiding in a locker somewhere, this'll find em.
|
||||
for(var/mob/living/carbon/alien/humanoid/xeno in player_list)
|
||||
if(istype(xeno))
|
||||
xeno_list += xeno
|
||||
|
||||
if(xeno_list.len>3)//If there are more than three humanoid xenos on the station, time to get dangerous.
|
||||
//Here we want the ninja to murder all the queens. The other aliens don't really matter.
|
||||
var/xeno_queen_list[] = list()
|
||||
for(var/mob/living/carbon/alien/humanoid/queen/xeno_queen in xeno_list)
|
||||
if(xeno_queen.mind&&xeno_queen.stat!=2)
|
||||
xeno_queen_list += xeno_queen
|
||||
if(xeno_queen_list.len&&side=="face")//If there are queen about and the probability is 50.
|
||||
for(var/mob/living/carbon/alien/humanoid/queen/xeno_queen in xeno_queen_list)
|
||||
var/datum/objective/assassinate/ninja_objective = new
|
||||
//We'll do some manual overrides to properly set it up.
|
||||
ninja_objective.owner = ninja_mind
|
||||
ninja_objective.target = xeno_queen.mind
|
||||
ninja_objective.explanation_text = "Kill \the [xeno_queen]."
|
||||
ninja_mind.objectives += ninja_objective
|
||||
mission_set = 1
|
||||
|
||||
if(sent_strike_team&&side=="heel"&&antagonist_list.len)//If a strike team was sent, murder them all like a champ.
|
||||
for(current_mind in antagonist_list)//Search and destroy. Since we already have an antagonist list, they should appear there.
|
||||
if(current_mind && current_mind.special_role=="Death Commando")
|
||||
commando_list += current_mind
|
||||
if(commando_list.len)//If there are living commandos still in play.
|
||||
for(var/mob/living/carbon/human/commando in commando_list)
|
||||
var/datum/objective/assassinate/ninja_objective = new
|
||||
ninja_objective.owner = ninja_mind
|
||||
ninja_objective.find_target_by_role(commando.mind.special_role,1)
|
||||
ninja_mind.objectives += ninja_objective
|
||||
mission_set = 1
|
||||
/*
|
||||
If there are no antogonists left it could mean one of two things:
|
||||
A) The round is about to end. No harm in spawning the ninja here.
|
||||
B) The round is still going and ghosts are probably rioting for something to happen.
|
||||
In either case, it's a good idea to spawn the ninja with a semi-random set of objectives.
|
||||
*/
|
||||
if(!mission_set)//If mission was not set.
|
||||
|
||||
var/current_minds[]//List being looked on in the following code.
|
||||
var/side_list = side=="face" ? 2 : 1//For logic gating.
|
||||
var/hostile_targets[] = list()//The guys actually picked for the assassination or whatever.
|
||||
var/friendly_targets[] = list()//The guys the ninja must protect.
|
||||
|
||||
for(var/i=2,i>0,i--)//Two lists.
|
||||
current_minds = i==2 ? antagonist_list : protagonist_list//Which list are we looking at?
|
||||
for(var/t=3,(current_minds.len&&t>0),t--)//While the list is not empty and targets remain. Also, 3 targets is good.
|
||||
current_mind = pick(current_minds)//Pick a random person.
|
||||
/*I'm creating a logic gate here based on the ninja affiliation that compares the list being
|
||||
looked at to the affiliation. Affiliation is just a number used to compare. Meaning comes from the logic involved.
|
||||
If the list being looked at is equal to the ninja's affiliation, add the mind to hostiles.
|
||||
If not, add the mind to friendlies. Since it can't be both, it will be added only to one or the other.*/
|
||||
hostile_targets += i==side_list ? current_mind : null//Adding null doesn't add anything.
|
||||
friendly_targets += i!=side_list ? current_mind : null
|
||||
current_minds -= current_mind//Remove the mind so it's not picked again.
|
||||
|
||||
var/objective_list[] = list(1,2,3,4,5,6)//To remove later.
|
||||
for(var/i=rand(1,3),i>0,i--)//Want to get a few random objectives. Currently up to 3.
|
||||
if(!hostile_targets.len)//Remove appropriate choices from switch list if the target lists are empty.
|
||||
objective_list -= 1
|
||||
objective_list -= 4
|
||||
if(!friendly_targets.len)
|
||||
objective_list -= 3
|
||||
switch(pick(objective_list))
|
||||
if(1)//kill
|
||||
current_mind = pick(hostile_targets)
|
||||
|
||||
if(current_mind)
|
||||
var/datum/objective/assassinate/ninja_objective = new
|
||||
ninja_objective.owner = ninja_mind
|
||||
ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0))//If they have a special role, use that instead to find em.
|
||||
ninja_mind.objectives += ninja_objective
|
||||
|
||||
else
|
||||
i++
|
||||
|
||||
hostile_targets -= current_mind//Remove them from the list.
|
||||
if(2)//Steal
|
||||
var/datum/objective/steal/ninja_objective = new
|
||||
var/target_item = pick(ninja_objective.possible_items_special)
|
||||
ninja_objective.set_target(target_item)
|
||||
ninja_mind.objectives += ninja_objective
|
||||
|
||||
objective_list -= 2
|
||||
if(3)//Protect. Keeping people alive can be pretty difficult.
|
||||
current_mind = pick(friendly_targets)
|
||||
|
||||
if(current_mind)
|
||||
|
||||
var/datum/objective/protect/ninja_objective = new
|
||||
ninja_objective.owner = ninja_mind
|
||||
ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0))
|
||||
ninja_mind.objectives += ninja_objective
|
||||
|
||||
else
|
||||
i++
|
||||
|
||||
friendly_targets -= current_mind
|
||||
if(4)//Debrain
|
||||
current_mind = pick(hostile_targets)
|
||||
|
||||
if(current_mind)
|
||||
|
||||
var/datum/objective/debrain/ninja_objective = new
|
||||
ninja_objective.owner = ninja_mind
|
||||
ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0))
|
||||
ninja_mind.objectives += ninja_objective
|
||||
|
||||
else
|
||||
i++
|
||||
|
||||
hostile_targets -= current_mind//Remove them from the list.
|
||||
if(5)//Download research
|
||||
var/datum/objective/download/ninja_objective = new
|
||||
ninja_objective.gen_amount_goal()
|
||||
ninja_mind.objectives += ninja_objective
|
||||
|
||||
objective_list -= 5
|
||||
if(6)//Capture
|
||||
var/datum/objective/capture/ninja_objective = new
|
||||
ninja_objective.gen_amount_goal()
|
||||
ninja_mind.objectives += ninja_objective
|
||||
|
||||
objective_list -= 6
|
||||
|
||||
if(ninja_mind.objectives.len)//If they got some objectives out of that.
|
||||
mission_set = 1
|
||||
|
||||
if(!ninja_mind.objectives.len||!mission_set)//If they somehow did not get an objective at this point, time to destroy the station.
|
||||
var/nuke_code
|
||||
var/temp_code
|
||||
for(var/obj/machinery/nuclearbomb/N in world)
|
||||
temp_code = text2num(N.r_code)
|
||||
if(temp_code)//if it's actually a number. It won't convert any non-numericals.
|
||||
nuke_code = N.r_code
|
||||
break
|
||||
if(nuke_code)//If there is a nuke device in world and we got the code.
|
||||
var/datum/objective/nuclear/ninja_objective = new//Fun.
|
||||
ninja_objective.owner = ninja_mind
|
||||
ninja_objective.explanation_text = "Destroy the station with a nuclear device. The code is [nuke_code]." //Let them know what the code is.
|
||||
|
||||
//Finally add a survival objective since it's usually broad enough for any round type.
|
||||
var/datum/objective/survive/ninja_objective = new
|
||||
ninja_objective.owner = ninja_mind
|
||||
ninja_mind.objectives += ninja_objective
|
||||
|
||||
var/directive = generate_ninja_directive(side)
|
||||
new_ninja << "\blue \nYou are an elite mercenary assassin of the Spider Clan, [new_ninja.real_name]. The dreaded \red <B>SPACE NINJA</B>!\blue You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor. Remember your training (initialize your suit by right clicking on it)! \nYour current directive is: \red <B>[directive]</B>"
|
||||
new_ninja.mind.store_memory("<B>Directive:</B> \red [directive]<br>")
|
||||
|
||||
var/obj_count = 1
|
||||
new_ninja << "\blue Your current objectives:"
|
||||
for(var/datum/objective/objective in ninja_mind.objectives)
|
||||
new_ninja << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
|
||||
obj_count++
|
||||
|
||||
sent_ninja_to_station = 1//And we're done.
|
||||
return new_ninja//Return the ninja in case we need to reference them later.
|
||||
|
||||
/*
|
||||
This proc will give the ninja a directive to follow. They are not obligated to do so but it's a fun roleplay reminder.
|
||||
Making this random or semi-random will probably not work without it also being incredibly silly.
|
||||
As such, it's hard-coded for now. No reason for it not to be, really.
|
||||
*/
|
||||
/proc/generate_ninja_directive(side)
|
||||
var/directive = "[side=="face"?"Nanotrasen":"The Syndicate"] is your employer. "//Let them know which side they're on.
|
||||
switch(rand(1,13))
|
||||
if(1)
|
||||
directive += "The Spider Clan must not be linked to this operation. Remain as hidden and covert as possible."
|
||||
if(2)
|
||||
directive += "[station_name] is financed by an enemy of the Spider Clan. Cause as much structural damage as possible."
|
||||
if(3)
|
||||
directive += "A wealthy animal rights activist has made a request we cannot refuse. Prioritize saving animal lives whenever possible."
|
||||
if(4)
|
||||
directive += "The Spider Clan absolutely cannot be linked to this operation. Eliminate all witnesses using most extreme prejudice."
|
||||
if(5)
|
||||
directive += "We are currently negotiating with Nanotrasen command. Prioritize saving human lives over ending them."
|
||||
if(6)
|
||||
directive += "We are engaged in a legal dispute over [station_name]. If a laywer is present on board, force their cooperation in the matter."
|
||||
if(7)
|
||||
directive += "A financial backer has made an offer we cannot refuse. Implicate Syndicate involvement in the operation."
|
||||
if(8)
|
||||
directive += "Let no one question the mercy of the Spider Clan. Ensure the safety of all non-essential personnel you encounter."
|
||||
if(9)
|
||||
directive += "A free agent has proposed a lucrative business deal. Implicate Nanotrasen involvement in the operation."
|
||||
if(10)
|
||||
directive += "Our reputation is on the line. Harm as few civilians or innocents as possible."
|
||||
if(11)
|
||||
directive += "Our honor is on the line. Utilize only honorable tactics when dealing with opponents."
|
||||
if(12)
|
||||
directive += "We are currently negotiating with a Syndicate leader. Disguise assassinations as suicide or another natural cause."
|
||||
else
|
||||
directive += "There are no special supplemental instructions at this time."
|
||||
return directive
|
||||
|
||||
//=======//CURRENT PLAYER VERB//=======//
|
||||
|
||||
/client/proc/cmd_admin_ninjafy(var/mob/M in player_list)
|
||||
set category = null
|
||||
set name = "Make Space Ninja"
|
||||
|
||||
if(!ticker)
|
||||
alert("Wait until the game starts")
|
||||
return
|
||||
if(!toggle_space_ninja)
|
||||
alert("Space Ninjas spawning is disabled.")
|
||||
return
|
||||
|
||||
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
|
||||
if(confirm != "Yes") return
|
||||
|
||||
if(ishuman(M))
|
||||
log_admin("[key_name(src)] turned [M.key] into a Space Ninja.")
|
||||
spawn(10)
|
||||
M:create_mind_space_ninja()
|
||||
M:equip_space_ninja(1)
|
||||
if(istype(M:wear_suit, /obj/item/clothing/suit/space/space_ninja))
|
||||
M:wear_suit:randomize_param()
|
||||
spawn(0)
|
||||
M:wear_suit:ninitialize(10,M)
|
||||
else
|
||||
alert("Invalid mob")
|
||||
|
||||
//=======//CURRENT GHOST VERB//=======//
|
||||
|
||||
/client/proc/send_space_ninja()
|
||||
set category = "Fun"
|
||||
set name = "Spawn Space Ninja"
|
||||
set desc = "Spawns a space ninja for when you need a teenager with attitude."
|
||||
set popup_menu = 0
|
||||
|
||||
if(!holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
if(!ticker.mode)
|
||||
alert("The game hasn't started yet!")
|
||||
return
|
||||
if(!toggle_space_ninja)
|
||||
alert("Space Ninjas spawning is disabled.")
|
||||
return
|
||||
if(alert("Are you sure you want to send in a space ninja?",,"Yes","No")=="No")
|
||||
return
|
||||
|
||||
var/mission
|
||||
while(!mission)
|
||||
mission = copytext(sanitize(input(src, "Please specify which mission the space ninja shall undertake.", "Specify Mission", "")),1,MAX_MESSAGE_LEN)
|
||||
if(!mission)
|
||||
if(alert("Error, no mission set. Do you want to exit the setup process?",,"Yes","No")=="Yes")
|
||||
return
|
||||
|
||||
var/list/spawn_list = list()
|
||||
for(var/obj/effect/landmark/L in world)
|
||||
if (L.name == "carpspawn")
|
||||
spawn_list.Add(L)
|
||||
|
||||
|
||||
var/input = ckey(input("Pick character to spawn as the Space Ninja", "Key", ""))
|
||||
if(!input)
|
||||
return
|
||||
|
||||
var/mob/dead/observer/G
|
||||
for(var/mob/dead/observer/G_find in player_list)
|
||||
if(G_find.ckey == input)
|
||||
G = G_find
|
||||
break
|
||||
|
||||
if(!G)//If a ghost was not found.
|
||||
alert("There is no active key like that in the game or the person is not currently a ghost. Aborting command.")
|
||||
return
|
||||
|
||||
var/admin_name = src
|
||||
var/mob/living/carbon/human/new_ninja = create_space_ninja(pick(spawn_list.len ? spawn_list : latejoin ))
|
||||
new_ninja.wear_suit:randomize_param()
|
||||
|
||||
new_ninja.key = G.key
|
||||
new_ninja.mind.store_memory("<B>Mission:</B> \red [mission].<br>")
|
||||
|
||||
new_ninja.internal = new_ninja.s_store //So the poor ninja has something to breath when they spawn in spess.
|
||||
new_ninja.internals.icon_state = "internal1"
|
||||
spawn(0)//Parallel process. Will speed things up a bit.
|
||||
new_ninja.wear_suit:ninitialize(10,new_ninja)//If you're wondering why I'm passing the argument to the proc when the default should suffice,
|
||||
//I'm also wondering that same thing. This makes sure it does not run time error though.
|
||||
|
||||
new_ninja << "\blue \nYou are an elite mercenary assassin of the Spider Clan, [new_ninja.real_name]. The dreaded \red <B>SPACE NINJA</B>!\blue You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor. Remember your training! \nYour current mission is: \red <B>[mission]</B>"
|
||||
|
||||
message_admins("\blue [admin_name] has spawned [new_ninja.key] as a Space Ninja. Hide yo children! \nTheir <b>mission</b> is: [mission]", 1)
|
||||
log_admin("[admin_name] used Spawn Space Ninja.")
|
||||
|
||||
return
|
||||
|
||||
//=======//NINJA CREATION PROCS//=======//
|
||||
|
||||
/proc/create_space_ninja(obj/spawn_point)
|
||||
var/mob/living/carbon/human/new_ninja = new(spawn_point.loc)
|
||||
var/ninja_title = pick(ninja_titles)
|
||||
var/ninja_name = pick(ninja_names)
|
||||
new_ninja.gender = pick(MALE, FEMALE)
|
||||
|
||||
var/datum/preferences/A = new()//Randomize appearance for the ninja.
|
||||
A.randomize_appearance_for(new_ninja)
|
||||
new_ninja.real_name = "[ninja_title] [ninja_name]"
|
||||
new_ninja.dna.ready_dna(new_ninja)
|
||||
new_ninja.create_mind_space_ninja()
|
||||
new_ninja.equip_space_ninja()
|
||||
return new_ninja
|
||||
|
||||
/mob/living/carbon/human/proc/create_mind_space_ninja()
|
||||
mind_initialize()
|
||||
mind.assigned_role = "MODE"
|
||||
mind.special_role = "Space Ninja"
|
||||
|
||||
//Adds them to current traitor list. Which is really the extra antagonist list.
|
||||
ticker.mode.traitors |= mind
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/equip_space_ninja(safety=0)//Safety in case you need to unequip stuff for existing characters.
|
||||
if(safety)
|
||||
del(w_uniform)
|
||||
del(wear_suit)
|
||||
del(wear_mask)
|
||||
del(head)
|
||||
del(shoes)
|
||||
del(gloves)
|
||||
|
||||
var/obj/item/device/radio/R = new /obj/item/device/radio/headset(src)
|
||||
equip_to_slot_or_del(R, slot_ears)
|
||||
if(gender==FEMALE)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/under/color/blackf(src), slot_w_uniform)
|
||||
else
|
||||
equip_to_slot_or_del(new /obj/item/clothing/under/color/black(src), slot_w_uniform)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/shoes/space_ninja(src), slot_shoes)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/suit/space/space_ninja(src), slot_wear_suit)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/gloves/space_ninja(src), slot_gloves)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/space_ninja(src), slot_head)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/voice/space_ninja(src), slot_wear_mask)
|
||||
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_belt)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_r_store)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_l_store)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen(src), slot_s_store)
|
||||
resistances += "alien_embryo"
|
||||
return 1
|
||||
|
||||
//=======//HELPER PROCS//=======//
|
||||
|
||||
//Randomizes suit parameters.
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/randomize_param()
|
||||
s_cost = rand(1,20)
|
||||
s_acost = rand(20,100)
|
||||
k_cost = rand(100,500)
|
||||
k_damage = rand(1,20)
|
||||
s_delay = rand(10,100)
|
||||
s_bombs = rand(5,20)
|
||||
a_boost = rand(1,7)
|
||||
|
||||
//This proc prevents the suit from being taken off.
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/lock_suit(mob/living/carbon/U, X = 0)
|
||||
if(X)//If you want to check for icons.
|
||||
icon_state = U.gender==FEMALE ? "s-ninjanf" : "s-ninjan"
|
||||
U:gloves.icon_state = "s-ninjan"
|
||||
U:gloves.item_state = "s-ninjan"
|
||||
else
|
||||
if(U.mind.special_role!="Space Ninja")
|
||||
U << "\red <B>fÄTaL ÈÈRRoR</B>: 382200-*#00CÖDE <B>RED</B>\nUNAU†HORIZED USÈ DETÈC†††eD\nCoMMÈNCING SUB-R0U†IN3 13...\nTÈRMInATING U-U-USÈR..."
|
||||
U.gib()
|
||||
return 0
|
||||
if(!istype(U:head, /obj/item/clothing/head/helmet/space/space_ninja))
|
||||
U << "\red <B>ERROR</B>: 100113 \black UNABLE TO LOCATE HEAD GEAR\nABORTING..."
|
||||
return 0
|
||||
if(!istype(U:shoes, /obj/item/clothing/shoes/space_ninja))
|
||||
U << "\red <B>ERROR</B>: 122011 \black UNABLE TO LOCATE FOOT GEAR\nABORTING..."
|
||||
return 0
|
||||
if(!istype(U:gloves, /obj/item/clothing/gloves/space_ninja))
|
||||
U << "\red <B>ERROR</B>: 110223 \black UNABLE TO LOCATE HAND GEAR\nABORTING..."
|
||||
return 0
|
||||
|
||||
affecting = U
|
||||
canremove = 0
|
||||
slowdown = 0
|
||||
n_hood = U:head
|
||||
n_hood.canremove=0
|
||||
n_shoes = U:shoes
|
||||
n_shoes.canremove=0
|
||||
n_shoes.slowdown--
|
||||
n_gloves = U:gloves
|
||||
n_gloves.canremove=0
|
||||
|
||||
return 1
|
||||
|
||||
//This proc allows the suit to be taken off.
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/unlock_suit()
|
||||
affecting = null
|
||||
canremove = 1
|
||||
slowdown = 1
|
||||
icon_state = "s-ninja"
|
||||
if(n_hood)//Should be attached, might not be attached.
|
||||
n_hood.canremove=1
|
||||
if(n_shoes)
|
||||
n_shoes.canremove=1
|
||||
n_shoes.slowdown++
|
||||
if(n_gloves)
|
||||
n_gloves.icon_state = "s-ninja"
|
||||
n_gloves.item_state = "s-ninja"
|
||||
n_gloves.canremove=1
|
||||
n_gloves.candrain=0
|
||||
n_gloves.draining=0
|
||||
|
||||
//Allows the mob to grab a stealth icon.
|
||||
/mob/proc/NinjaStealthActive(atom/A)//A is the atom which we are using as the overlay.
|
||||
invisibility = INVISIBILITY_LEVEL_TWO//Set ninja invis to 2.
|
||||
var/icon/opacity_icon = new(A.icon, A.icon_state)
|
||||
var/icon/alpha_mask = getIconMask(src)
|
||||
var/icon/alpha_mask_2 = new('icons/effects/effects.dmi', "at_shield1")
|
||||
alpha_mask.AddAlphaMask(alpha_mask_2)
|
||||
opacity_icon.AddAlphaMask(alpha_mask)
|
||||
for(var/i=0,i<5,i++)//And now we add it as overlays. It's faster than creating an icon and then merging it.
|
||||
var/image/I = image("icon" = opacity_icon, "icon_state" = A.icon_state, "layer" = layer+0.8)//So it's above other stuff but below weapons and the like.
|
||||
switch(i)//Now to determine offset so the result is somewhat blurred.
|
||||
if(1)
|
||||
I.pixel_x -= 1
|
||||
if(2)
|
||||
I.pixel_x += 1
|
||||
if(3)
|
||||
I.pixel_y -= 1
|
||||
if(4)
|
||||
I.pixel_y += 1
|
||||
|
||||
overlays += I//And finally add the overlay.
|
||||
overlays += image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = layer+0.9)
|
||||
|
||||
//When ninja steal malfunctions.
|
||||
/mob/proc/NinjaStealthMalf()
|
||||
invisibility = 0//Set ninja invis to 0.
|
||||
overlays += image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = layer+0.9)
|
||||
playsound(loc, 'sound/effects/stealthoff.ogg', 75, 1)
|
||||
|
||||
//=======//GENERIC VERB MODIFIERS//=======//
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/grant_equip_verbs()
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/init
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/spideros
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/stealth
|
||||
n_gloves.verbs += /obj/item/clothing/gloves/space_ninja/proc/toggled
|
||||
|
||||
s_initialized = 1
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/remove_equip_verbs()
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/init
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/deinit
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/spideros
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/stealth
|
||||
if(n_gloves)
|
||||
n_gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggled
|
||||
|
||||
s_initialized = 0
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/grant_ninja_verbs()
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjablade
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
|
||||
|
||||
s_initialized=1
|
||||
slowdown=0
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/remove_ninja_verbs()
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjablade
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
|
||||
|
||||
//=======//KAMIKAZE VERBS//=======//
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/grant_kamikaze(mob/living/carbon/U)
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
|
||||
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjaslayer
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjawalk
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjamirage
|
||||
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/stealth
|
||||
|
||||
kamikaze = 1
|
||||
|
||||
icon_state = U.gender==FEMALE ? "s-ninjakf" : "s-ninjak"
|
||||
if(n_gloves)
|
||||
n_gloves.icon_state = "s-ninjak"
|
||||
n_gloves.item_state = "s-ninjak"
|
||||
n_gloves.candrain = 0
|
||||
n_gloves.draining = 0
|
||||
n_gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggled
|
||||
|
||||
cancel_stealth()
|
||||
|
||||
U << browse(null, "window=spideros")
|
||||
U << "\red Do or Die, <b>LET'S ROCK!!</b>"
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/remove_kamikaze(mob/living/carbon/U)
|
||||
if(kamikaze)
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
|
||||
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjaslayer
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjawalk
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjamirage
|
||||
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/stealth
|
||||
if(n_gloves)
|
||||
n_gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggled
|
||||
|
||||
U.incorporeal_move = 0
|
||||
kamikaze = 0
|
||||
k_unlock = 0
|
||||
U << "\blue Disengaging mode...\n\black<b>CODE NAME</b>: \red <b>KAMIKAZE</b>"
|
||||
|
||||
//=======//AI VERBS//=======//
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/grant_AI_verbs()
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_hack_ninja
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_return_control
|
||||
|
||||
s_busy = 0
|
||||
s_control = 0
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/remove_AI_verbs()
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ai_hack_ninja
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ai_return_control
|
||||
|
||||
s_control = 1
|
||||
|
||||
//=======//OLD & UNUSED//=======//
|
||||
|
||||
/*
|
||||
|
||||
Deprecated. get_dir() does the same thing. Still a nice proc.
|
||||
Returns direction that the mob or whomever should be facing in relation to the target.
|
||||
This proc does not grant absolute direction and is mostly useful for 8dir sprite positioning.
|
||||
I personally used it with getline() to great effect.
|
||||
/proc/get_dir_to(turf/start,turf/end)//N
|
||||
var/xdiff = start.x - end.x//The sign is important.
|
||||
var/ydiff = start.y - end.y
|
||||
|
||||
var/direction_x = xdiff<1 ? 4:8//East - west
|
||||
var/direction_y = ydiff<1 ? 1:2//North - south
|
||||
var/direction_xy = xdiff==0 ? -4:0//If x is the same, subtract 4.
|
||||
var/direction_yx = ydiff==0 ? -1:0//If y is the same, subtract 1.
|
||||
var/direction_f = direction_x+direction_y+direction_xy+direction_yx//Finally direction tally.
|
||||
direction_f = direction_f==0 ? 1:direction_f//If direction is 0(same spot), return north. Otherwise, direction.
|
||||
|
||||
return direction_f
|
||||
|
||||
Alternative and inferior method of calculating spideros.
|
||||
var/temp = num2text(spideros)
|
||||
var/return_to = copytext(temp, 1, (length(temp)))//length has to be to the length of the thing because by default it's length+1
|
||||
spideros = text2num(return_to)//Maximum length here is 6. Use (return_to, X) to specify larger strings if needed.
|
||||
|
||||
//Old way of draining from wire.
|
||||
/obj/item/clothing/gloves/space_ninja/proc/drain_wire()
|
||||
set name = "Drain From Wire"
|
||||
set desc = "Drain energy directly from an exposed wire."
|
||||
set category = "Ninja Equip"
|
||||
|
||||
var/obj/structure/cable/attached
|
||||
var/mob/living/carbon/human/U = loc
|
||||
if(candrain&&!draining)
|
||||
var/turf/T = U.loc
|
||||
if(isturf(T) && T.is_plating())
|
||||
attached = locate() in T
|
||||
if(!attached)
|
||||
U << "\red Warning: no exposed cable available."
|
||||
else
|
||||
U << "\blue Connecting to wire, stand still..."
|
||||
if(do_after(U,50)&&!isnull(attached))
|
||||
drain("WIRE",attached,U:wear_suit,src)
|
||||
else
|
||||
U << "\red Procedure interrupted. Protocol terminated."
|
||||
return
|
||||
|
||||
I've tried a lot of stuff but adding verbs to the AI while inside an object, inside another object, did not want to work properly.
|
||||
This was the best work-around I could come up with at the time. Uses objects to then display to panel, based on the object spell system.
|
||||
Can be added on to pretty easily.
|
||||
|
||||
BYOND fixed the verb bugs so this is no longer necessary. I prefer verb panels.
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/grant_AI_verbs()
|
||||
var/obj/effect/proc_holder/ai_return_control/A_C = new(AI)
|
||||
var/obj/effect/proc_holder/ai_hack_ninja/B_C = new(AI)
|
||||
var/obj/effect/proc_holder/ai_instruction/C_C = new(AI)
|
||||
new/obj/effect/proc_holder/ai_holo_clear(AI)
|
||||
AI.proc_holder_list += A_C
|
||||
AI.proc_holder_list += B_C
|
||||
AI.proc_holder_list += C_C
|
||||
|
||||
s_control = 0
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/remove_AI_verbs()
|
||||
var/obj/effect/proc_holder/ai_return_control/A_C = locate() in AI
|
||||
var/obj/effect/proc_holder/ai_hack_ninja/B_C = locate() in AI
|
||||
var/obj/effect/proc_holder/ai_instruction/C_C = locate() in AI
|
||||
var/obj/effect/proc_holder/ai_holo_clear/D_C = locate() in AI
|
||||
del(A_C)
|
||||
del(B_C)
|
||||
del(C_C)
|
||||
del(D_C)
|
||||
AI.proc_holder_list = list()
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/spideros
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/stealth
|
||||
|
||||
s_control = 1
|
||||
|
||||
//Workaround
|
||||
/obj/effect/proc_holder/ai_holo_clear
|
||||
name = "Clear Hologram"
|
||||
desc = "Stops projecting the current holographic image."
|
||||
panel = "AI Ninja Equip"
|
||||
density = 0
|
||||
opacity = 0
|
||||
|
||||
|
||||
/obj/effect/proc_holder/ai_holo_clear/Click()
|
||||
var/obj/item/clothing/suit/space/space_ninja/S = loc.loc//This is so stupid but makes sure certain things work. AI.SUIT
|
||||
del(S.hologram.i_attached)
|
||||
del(S.hologram)
|
||||
var/obj/effect/proc_holder/ai_holo_clear/D_C = locate() in S.AI
|
||||
S.AI.proc_holder_list -= D_C
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/ai_instruction//Let's the AI know what they can do.
|
||||
name = "Instructions"
|
||||
desc = "Displays a list of helpful information."
|
||||
panel = "AI Ninja Equip"
|
||||
density = 0
|
||||
opacity = 0
|
||||
|
||||
/obj/effect/proc_holder/ai_instruction/Click()
|
||||
loc << "The menu you are seeing will contain other commands if they become available.\nRight click a nearby turf to display an AI Hologram. It will only be visible to you and your host. You can move it freely using normal movement keys--it will disappear if placed too far away."
|
||||
|
||||
/obj/effect/proc_holder/ai_hack_ninja//Generic proc holder to make sure the two verbs below work propely.
|
||||
name = "Hack SpiderOS"
|
||||
desc = "Hack directly into the Black Widow(tm) neuro-interface."
|
||||
panel = "AI Ninja Equip"
|
||||
density = 0
|
||||
opacity = 0
|
||||
|
||||
/obj/effect/proc_holder/ai_hack_ninja/Click()//When you click on it.
|
||||
var/obj/item/clothing/suit/space/space_ninja/S = loc.loc
|
||||
S.hack_spideros()
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/ai_return_control
|
||||
name = "Relinquish Control"
|
||||
desc = "Return control to the user."
|
||||
panel = "AI Ninja Equip"
|
||||
density = 0
|
||||
opacity = 0
|
||||
|
||||
/obj/effect/proc_holder/ai_return_control/Click()
|
||||
var/mob/living/silicon/ai/A = loc
|
||||
var/obj/item/clothing/suit/space/space_ninja/S = A.loc
|
||||
A << browse(null, "window=hack spideros")//Close window
|
||||
A << "You have seized your hacking attempt. [S.affecting] has regained control."
|
||||
S.affecting << "<b>UPDATE</b>: [A.real_name] has ceased hacking attempt. All systems clear."
|
||||
S.remove_AI_verbs()
|
||||
return
|
||||
*/
|
||||
|
||||
//=======//DEBUG//=======//
|
||||
/*
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/display_verb_procs()
|
||||
//DEBUG
|
||||
//Does nothing at the moment. I am trying to see if it's possible to mess around with verbs as variables.
|
||||
//for(var/P in verbs)
|
||||
// if(P.set.name)
|
||||
// usr << "[P.set.name], path: [P]"
|
||||
return
|
||||
|
||||
|
||||
Most of these are at various points of incomplete.
|
||||
|
||||
/mob/verb/grant_object_panel()
|
||||
set name = "Grant AI Ninja Verbs Debug"
|
||||
set category = "Ninja Debug"
|
||||
var/obj/effect/proc_holder/ai_return_control/A_C = new(src)
|
||||
var/obj/effect/proc_holder/ai_hack_ninja/B_C = new(src)
|
||||
usr:proc_holder_list += A_C
|
||||
usr:proc_holder_list += B_C
|
||||
|
||||
mob/verb/remove_object_panel()
|
||||
set name = "Remove AI Ninja Verbs Debug"
|
||||
set category = "Ninja Debug"
|
||||
var/obj/effect/proc_holder/ai_return_control/A = locate() in src
|
||||
var/obj/effect/proc_holder/ai_hack_ninja/B = locate() in src
|
||||
usr:proc_holder_list -= A
|
||||
usr:proc_holder_list -= B
|
||||
del(A)//First.
|
||||
del(B)//Second, to keep the proc going.
|
||||
return
|
||||
|
||||
/client/verb/grant_verb_ninja_debug1(var/mob/M in view())
|
||||
set name = "Grant AI Ninja Verbs Debug"
|
||||
set category = "Ninja Debug"
|
||||
|
||||
M.verbs += /mob/living/silicon/ai/verb/ninja_return_control
|
||||
M.verbs += /mob/living/silicon/ai/verb/ninja_spideros
|
||||
return
|
||||
|
||||
/client/verb/grant_verb_ninja_debug2(var/mob/living/carbon/human/M in view())
|
||||
set name = "Grant Back Ninja Verbs"
|
||||
set category = "Ninja Debug"
|
||||
|
||||
M.wear_suit.verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit
|
||||
M.wear_suit.verbs += /obj/item/clothing/suit/space/space_ninja/proc/spideros
|
||||
return
|
||||
|
||||
/obj/proc/grant_verb_ninja_debug3(var/mob/living/silicon/ai/A as mob)
|
||||
set name = "Grant AI Ninja Verbs"
|
||||
set category = "null"
|
||||
set hidden = 1
|
||||
A.verbs -= /obj/item/clothing/suit/space/space_ninja/proc/deinit
|
||||
A.verbs -= /obj/item/clothing/suit/space/space_ninja/proc/spideros
|
||||
return
|
||||
|
||||
/mob/verb/get_dir_to_target(var/mob/M in oview())
|
||||
set name = "Get Direction to Target"
|
||||
set category = "Ninja Debug"
|
||||
|
||||
world << "DIR: [get_dir_to(src.loc,M.loc)]"
|
||||
return
|
||||
//
|
||||
/mob/verb/kill_self_debug()
|
||||
set name = "DEBUG Kill Self"
|
||||
set category = "Ninja Debug"
|
||||
|
||||
src:death()
|
||||
|
||||
/client/verb/switch_client_debug()
|
||||
set name = "DEBUG Switch Client"
|
||||
set category = "Ninja Debug"
|
||||
|
||||
mob = mob:loc:loc
|
||||
|
||||
/mob/verb/possess_mob(var/mob/M in oview())
|
||||
set name = "DEBUG Possess Mob"
|
||||
set category = "Ninja Debug"
|
||||
|
||||
client.mob = M
|
||||
|
||||
/client/verb/switcharoo(var/mob/M in oview())
|
||||
set name = "DEBUG Switch to AI"
|
||||
set category = "Ninja Debug"
|
||||
|
||||
var/mob/last_mob = mob
|
||||
mob = M
|
||||
last_mob:wear_suit:AI:key = key
|
||||
//
|
||||
/client/verb/ninjaget(var/mob/M in oview())
|
||||
set name = "DEBUG Ninja GET"
|
||||
set category = "Ninja Debug"
|
||||
|
||||
mob = M
|
||||
M.gib()
|
||||
space_ninja()
|
||||
|
||||
/mob/verb/set_debug_ninja_target()
|
||||
set name = "Set Debug Target"
|
||||
set category = "Ninja Debug"
|
||||
|
||||
ninja_debug_target = src//The target is you, brohime.
|
||||
world << "Target: [src]"
|
||||
|
||||
/mob/verb/hack_spideros_debug()
|
||||
set name = "Debug Hack Spider OS"
|
||||
set category = "Ninja Debug"
|
||||
|
||||
var/mob/living/silicon/ai/A = loc:AI
|
||||
if(A)
|
||||
if(!A.key)
|
||||
A.client.mob = loc:affecting
|
||||
else
|
||||
loc:affecting:client:mob = A
|
||||
return
|
||||
|
||||
//Tests the net and what it does.
|
||||
/mob/verb/ninjanet_debug()
|
||||
set name = "Energy Net Debug"
|
||||
set category = "Ninja Debug"
|
||||
|
||||
var/obj/effect/energy_net/E = new /obj/effect/energy_net(loc)
|
||||
E.layer = layer+1//To have it appear one layer above the mob.
|
||||
stunned = 10//So they are stunned initially but conscious.
|
||||
anchored = 1//Anchors them so they can't move.
|
||||
E.affecting = src
|
||||
spawn(0)//Parallel processing.
|
||||
E.process(src)
|
||||
return
|
||||
|
||||
I made this as a test for a possible ninja ability (or perhaps more) for a certain mob to see hallucinations.
|
||||
The thing here is that these guys have to be coded to do stuff as they are simply images that you can't even click on.
|
||||
That is why you attached them to objects.
|
||||
/mob/verb/TestNinjaShadow()
|
||||
set name = "Test Ninja Ability"
|
||||
set category = "Ninja Debug"
|
||||
|
||||
if(client)
|
||||
var/safety = 4
|
||||
for(var/turf/T in oview(5))
|
||||
if(prob(20))
|
||||
var/current_clone = image('icons/mob/mob.dmi',T,"s-ninja")
|
||||
safety--
|
||||
spawn(0)
|
||||
src << current_clone
|
||||
spawn(300)
|
||||
del(current_clone)
|
||||
spawn while(!isnull(current_clone))
|
||||
step_to(current_clone,src,1)
|
||||
sleep(5)
|
||||
if(safety<=0) break
|
||||
return */
|
||||
@@ -1,229 +0,0 @@
|
||||
// SPACE VINES
|
||||
/obj/effect/spacevine
|
||||
name = "space vines"
|
||||
desc = "An extremely expansionistic species of vine."
|
||||
icon = 'spacevines.dmi'
|
||||
icon_state = "Light1"
|
||||
anchored = 1
|
||||
density = 0
|
||||
pass_flags = PASSTABLE | PASSGRILLE
|
||||
var/energy = 0
|
||||
var/obj/effect/spacevine_controller/master = null
|
||||
|
||||
New()
|
||||
return
|
||||
|
||||
Del()
|
||||
if(master)
|
||||
master.vines -= src
|
||||
master.growth_queue -= src
|
||||
for(var/mob/M in src.loc)
|
||||
if(M.buckled == src)
|
||||
M.buckled = null
|
||||
..()
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (!W || !user || !W.type) return
|
||||
switch(W.type)
|
||||
if(/obj/item/weapon/circular_saw) del src
|
||||
if(/obj/item/weapon/kitchen/utensil/knife) del src
|
||||
if(/obj/item/weapon/scalpel) del src
|
||||
if(/obj/item/weapon/twohanded/fireaxe) del src
|
||||
if(/obj/item/weapon/hatchet) del src
|
||||
if(/obj/item/weapon/melee/energy) del src
|
||||
|
||||
//less effective weapons
|
||||
if(/obj/item/weapon/wirecutters)
|
||||
if(prob(25)) del src
|
||||
if(/obj/item/weapon/shard)
|
||||
if(prob(25)) del src
|
||||
|
||||
else //weapons with subtypes
|
||||
if(istype(W, /obj/item/weapon/melee/energy/sword)) del src
|
||||
else if(istype(W, /obj/item/weapon/weldingtool))
|
||||
var/obj/item/weapon/weldingtool/WT = W
|
||||
if(WT.remove_fuel(0, user)) del src
|
||||
//TODO: add plant-b-gone
|
||||
..()
|
||||
|
||||
attack_hand(mob/user as mob)
|
||||
for(var/mob/M in src.loc)
|
||||
if(M.buckled == src)
|
||||
if(prob(50))
|
||||
if(M == user)
|
||||
user << "\red You break free from the vines!"
|
||||
else
|
||||
user << "\red You rip away at the vines and free [M]!"
|
||||
M << "\red [user] frees you from the vines!"
|
||||
M.buckled = null
|
||||
else
|
||||
user << "\red You rip away at the vines..."
|
||||
break //only process one captured mob.
|
||||
|
||||
attack_paw(mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/effect/spacevine_controller
|
||||
var/list/obj/effect/spacevine/vines = list()
|
||||
var/list/growth_queue = list()
|
||||
var/reached_collapse_size
|
||||
var/reached_slowdown_size
|
||||
//What this does is that instead of having the grow minimum of 1, required to start growing, the minimum will be 0,
|
||||
//meaning if you get the spacevines' size to something less than 20 plots, it won't grow anymore.
|
||||
|
||||
New()
|
||||
if(!istype(src.loc,/turf/simulated/floor))
|
||||
del(src)
|
||||
|
||||
spawn_spacevine_piece(src.loc)
|
||||
processing_objects.Add(src)
|
||||
|
||||
Del()
|
||||
processing_objects.Remove(src)
|
||||
..()
|
||||
|
||||
proc/spawn_spacevine_piece(var/turf/location)
|
||||
var/obj/effect/spacevine/SV = new(location)
|
||||
growth_queue += SV
|
||||
vines += SV
|
||||
SV.master = src
|
||||
|
||||
process()
|
||||
if(!vines)
|
||||
del(src) //space vines exterminated. Remove the controller
|
||||
return
|
||||
if(!growth_queue)
|
||||
del(src) //Sanity check
|
||||
return
|
||||
if(vines.len >= 250 && !reached_collapse_size)
|
||||
reached_collapse_size = 1
|
||||
if(vines.len >= 30 && !reached_slowdown_size )
|
||||
reached_slowdown_size = 1
|
||||
|
||||
var/length = 0
|
||||
if(reached_collapse_size)
|
||||
length = 0
|
||||
else if(reached_slowdown_size)
|
||||
if(prob(25))
|
||||
length = 1
|
||||
else
|
||||
length = 0
|
||||
else
|
||||
length = 1
|
||||
length = min( 30 , max( length , vines.len / 5 ) )
|
||||
var/i = 0
|
||||
var/list/obj/effect/spacevine/queue_end = list()
|
||||
|
||||
for( var/obj/effect/spacevine/SV in growth_queue )
|
||||
i++
|
||||
queue_end += SV
|
||||
growth_queue -= SV
|
||||
if(SV.energy < 2) //If tile isn't fully grown
|
||||
if(prob(20))
|
||||
SV.grow()
|
||||
else //If tile is fully grown
|
||||
SV.grab()
|
||||
|
||||
//if(prob(25))
|
||||
SV.spread()
|
||||
if(i >= length)
|
||||
break
|
||||
|
||||
growth_queue = growth_queue + queue_end
|
||||
//sleep(5)
|
||||
//src.process()
|
||||
|
||||
/obj/effect/spacevine/proc/grow()
|
||||
if(!energy)
|
||||
src.icon_state = pick("Med1", "Med2", "Med3")
|
||||
energy = 1
|
||||
src.opacity = 1
|
||||
layer = 5
|
||||
else
|
||||
src.icon_state = pick("Hvy1", "Hvy2", "Hvy3")
|
||||
energy = 2
|
||||
|
||||
/obj/effect/spacevine/proc/grab()
|
||||
for(var/mob/living/carbon/V in src.loc)
|
||||
if((V.stat != DEAD) && (V.buckled != src)) //if mob not dead or captured
|
||||
V.buckled = src
|
||||
V << "\red The vines [pick("wind", "tangle")] around you!"
|
||||
break //only capture one mob at a time.
|
||||
|
||||
/obj/effect/spacevine/proc/spread()
|
||||
var/direction = pick(cardinal)
|
||||
var/step = get_step(src,direction)
|
||||
if(istype(step,/turf/simulated/floor))
|
||||
var/turf/simulated/floor/F = step
|
||||
if(!locate(/obj/effect/spacevine,F))
|
||||
if(F.Enter(src))
|
||||
if(master)
|
||||
master.spawn_spacevine_piece( F )
|
||||
|
||||
/*
|
||||
/obj/effect/spacevine/proc/Life()
|
||||
if (!src) return
|
||||
var/Vspread
|
||||
if (prob(50)) Vspread = locate(src.x + rand(-1,1),src.y,src.z)
|
||||
else Vspread = locate(src.x,src.y + rand(-1, 1),src.z)
|
||||
var/dogrowth = 1
|
||||
if (!istype(Vspread, /turf/simulated/floor)) dogrowth = 0
|
||||
for(var/obj/O in Vspread)
|
||||
if (istype(O, /obj/structure/window) || istype(O, /obj/effect/forcefield) || istype(O, /obj/effect/blob) || istype(O, /obj/effect/alien/weeds) || istype(O, /obj/effect/spacevine)) dogrowth = 0
|
||||
if (istype(O, /obj/machinery/door/))
|
||||
if(O:p_open == 0 && prob(50)) O:open()
|
||||
else dogrowth = 0
|
||||
if (dogrowth == 1)
|
||||
var/obj/effect/spacevine/B = new /obj/effect/spacevine(Vspread)
|
||||
B.icon_state = pick("vine-light1", "vine-light2", "vine-light3")
|
||||
spawn(20)
|
||||
if(B)
|
||||
B.Life()
|
||||
src.growth += 1
|
||||
if (src.growth == 10)
|
||||
src.name = "Thick Space Kudzu"
|
||||
src.icon_state = pick("vine-med1", "vine-med2", "vine-med3")
|
||||
src.opacity = 1
|
||||
src.waittime = 80
|
||||
if (src.growth == 20)
|
||||
src.name = "Dense Space Kudzu"
|
||||
src.icon_state = pick("vine-hvy1", "vine-hvy2", "vine-hvy3")
|
||||
src.density = 1
|
||||
spawn(src.waittime)
|
||||
if (src.growth < 20) src.Life()
|
||||
|
||||
*/
|
||||
|
||||
/obj/effect/spacevine/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
del(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(90))
|
||||
del(src)
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(50))
|
||||
del(src)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/effect/spacevine/temperature_expose(null, temp, volume) //hotspots kill vines
|
||||
del src
|
||||
|
||||
//Carn: Spacevines random event.
|
||||
/proc/spacevine_infestation()
|
||||
|
||||
spawn() //to stop the secrets panel hanging
|
||||
var/list/turf/simulated/floor/turfs = list() //list of all the empty floor turfs in the hallway areas
|
||||
for(var/areapath in typesof(/area/hallway))
|
||||
var/area/hallway/A = locate(areapath)
|
||||
for(var/turf/simulated/floor/F in A)
|
||||
if(!F.contents.len)
|
||||
turfs += F
|
||||
|
||||
if(turfs.len) //Pick a turf to spawn at if we can
|
||||
var/turf/simulated/floor/T = pick(turfs)
|
||||
new/obj/effect/spacevine_controller(T) //spawn a controller at turf
|
||||
message_admins("\blue Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])")
|
||||
@@ -1,63 +0,0 @@
|
||||
/proc/wormhole_event()
|
||||
spawn()
|
||||
var/list/pick_turfs = list()
|
||||
for(var/turf/simulated/floor/T in world)
|
||||
if(T.z == 1)
|
||||
pick_turfs += T
|
||||
|
||||
if(pick_turfs.len)
|
||||
//All ready. Announce that bad juju is afoot.
|
||||
command_alert("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert")
|
||||
world << sound('spanomalies.ogg')
|
||||
|
||||
//prob(20) can be approximated to 1 wormhole every 5 turfs!
|
||||
//admittedly less random but totally worth it >_<
|
||||
var/event_duration = 3000 //~5 minutes in ticks
|
||||
var/number_of_selections = (pick_turfs.len/5)+1 //+1 to avoid division by zero!
|
||||
var/sleep_duration = round( event_duration / number_of_selections )
|
||||
var/end_time = world.time + event_duration //the time by which the event should have ended
|
||||
|
||||
var/increment = max(1,round(number_of_selections/50))
|
||||
// world << "DEBUG: number_of_selections: [number_of_selections] | sleep_duration: [sleep_duration]"
|
||||
|
||||
var/i = 1
|
||||
while( 1 )
|
||||
|
||||
//we've run into overtime. End the event
|
||||
if( end_time < world.time )
|
||||
// world << "DEBUG: we've run into overtime. End the event"
|
||||
return
|
||||
if( !pick_turfs.len )
|
||||
// world << "DEBUG: we've run out of turfs to pick. End the event"
|
||||
return
|
||||
|
||||
//loop it round
|
||||
i += increment
|
||||
i %= pick_turfs.len
|
||||
i++
|
||||
|
||||
//get our enter and exit locations
|
||||
var/turf/simulated/floor/enter = pick_turfs[i]
|
||||
pick_turfs -= enter //remove it from pickable turfs list
|
||||
if( !enter || !istype(enter) ) continue //sanity
|
||||
|
||||
var/turf/simulated/floor/exit = pick(pick_turfs)
|
||||
pick_turfs -= exit
|
||||
if( !exit || !istype(exit) ) continue //sanity
|
||||
|
||||
create_wormhole(enter,exit)
|
||||
|
||||
sleep(sleep_duration) //have a well deserved nap!
|
||||
|
||||
|
||||
//maybe this proc can even be used as an admin tool for teleporting players without ruining immulsions?
|
||||
/proc/create_wormhole(var/turf/enter as turf, var/turf/exit as turf)
|
||||
var/obj/effect/portal/P = new /obj/effect/portal( enter )
|
||||
P.target = exit
|
||||
P.creator = null
|
||||
P.icon = 'objects.dmi'
|
||||
P.failchance = 0
|
||||
P.icon_state = "anom"
|
||||
P.name = "wormhole"
|
||||
spawn(rand(300,600))
|
||||
del(P)
|
||||
@@ -1,38 +0,0 @@
|
||||
/datum/event/alieninfestation
|
||||
|
||||
Announce()
|
||||
|
||||
var/list/vents = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
|
||||
if(temp_vent.loc.z == 1 && !temp_vent.welded)
|
||||
vents.Add(temp_vent)
|
||||
var/spawncount = 1
|
||||
if(prob(10)) spawncount++ //rarely, have two larvae spawn instead of one
|
||||
while(spawncount >= 1)
|
||||
var/obj/vent = pick(vents)
|
||||
|
||||
var/list/candidates = list() // Picks a random ghost in the world to shove in the larva -- TLE; If there's no ghost... well, sucks. Wasted event. -- Urist
|
||||
|
||||
for(var/mob/dead/observer/G in world)
|
||||
if(G.client)
|
||||
if(G.client.be_alien)
|
||||
if(((G.client.inactivity/10)/60) <= 5)
|
||||
if(G.corpse)
|
||||
if(G.corpse.stat==2)
|
||||
candidates.Add(G)
|
||||
if(!G.corpse)
|
||||
candidates.Add(G)
|
||||
|
||||
if(candidates.len)
|
||||
var/mob/dead/observer/G = pick(candidates)
|
||||
var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
|
||||
new_xeno.mind_initialize(G,"Larva")
|
||||
new_xeno.key = G.key
|
||||
del(G)
|
||||
|
||||
vents.Remove(vent)
|
||||
spawncount -= 1
|
||||
|
||||
spawn(rand(3000, 6000)) //Delayed announcements to keep the crew on their toes.
|
||||
command_alert("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert")
|
||||
world << sound('aliens.ogg')
|
||||
@@ -1,18 +0,0 @@
|
||||
/datum/event/appendicitis
|
||||
|
||||
Announce()
|
||||
|
||||
for(var/mob/living/carbon/human/H in world)
|
||||
var/foundAlready = 0 // don't infect someone that already has the virus
|
||||
for(var/datum/disease/D in H.viruses)
|
||||
foundAlready = 1
|
||||
if(/datum/disease/appendicitis in H.resistances)
|
||||
continue
|
||||
if(H.stat == 2 || foundAlready)
|
||||
continue
|
||||
|
||||
var/datum/disease/D = new /datum/disease/appendicitis
|
||||
D.holder = H
|
||||
D.affected_mob = H
|
||||
H.viruses += D
|
||||
break
|
||||
@@ -1,32 +0,0 @@
|
||||
/area/var/radsafe = 0
|
||||
/area/maintenance/radsafe = 1
|
||||
/area/ai_monitored/maintenance/radsafe = 1
|
||||
/area/centcom/radsafe = 1
|
||||
/area/admin/radsafe = 1
|
||||
/area/adminsafety/radsafe = 1
|
||||
/area/shuttle/radsafe = 1
|
||||
/area/syndicate_station/radsafe = 1
|
||||
/area/asteroid/radsafe = 1
|
||||
/area/crew_quarters/sleeping/radsafe = 1
|
||||
|
||||
/datum/event/blowout
|
||||
Lifetime = 150
|
||||
Announce()
|
||||
if(!forced && prob(90))
|
||||
ActiveEvent = null
|
||||
SpawnEvent()
|
||||
del src
|
||||
return
|
||||
command_alert("Warning: station approaching high-density radiation cloud. Seek cover immediately.")
|
||||
Tick()
|
||||
if(ActiveFor == 50)
|
||||
command_alert("Station has entered radiation cloud. Do not leave cover until it has passed.")
|
||||
if(ActiveFor == 100 || ActiveFor == 150) //1/2 and 2/2 f the way after it start proper make peope be half dead mostly
|
||||
for(var/mob/living/carbon/M in world)
|
||||
var/area = get_area(M)
|
||||
if(area:radsafe)
|
||||
continue
|
||||
if(!M.stat)
|
||||
M.radiate(100)
|
||||
Die()
|
||||
command_alert("The station has cleared the radiation cloud. It is now safe to leave cover.")
|
||||
@@ -1,88 +0,0 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:04
|
||||
|
||||
/datum/event/electricalstorm
|
||||
var/list/obj/machinery/light/Lights = list( )
|
||||
var/list/obj/machinery/light/APCs = list( )
|
||||
var/list/obj/machinery/light/Doors = list( )
|
||||
var/list/obj/machinery/light/Comms = list( )
|
||||
|
||||
Announce()
|
||||
// command_alert("The station is flying through an electrical storm. Radio communications may be disrupted", "Anomaly Alert")
|
||||
|
||||
for(var/obj/machinery/light/Light in world)
|
||||
if(Light.z == 1 && Light.status != 0)
|
||||
Lights += Light
|
||||
|
||||
for(var/obj/machinery/power/apc/APC in world)
|
||||
if(APC.z == 1 && !APC.crit)
|
||||
APCs += APC
|
||||
|
||||
for(var/obj/machinery/door/airlock/Door in world)
|
||||
if(Door.z == 1 && !istype(Door,/obj/machinery/door/airlock/secure))
|
||||
Doors += Door
|
||||
|
||||
for(var/obj/machinery/telecomms/processor/T in world)
|
||||
if(prob(90) && !(T.stat & (BROKEN|NOPOWER)))
|
||||
T.stat |= BROKEN
|
||||
Comms |= T
|
||||
|
||||
Tick()
|
||||
for(var/x = 0; x < 3; x++)
|
||||
if (prob(30))
|
||||
BlowLight()
|
||||
if (prob(10))
|
||||
DisruptAPC()
|
||||
if (prob(10))
|
||||
DisableDoor()
|
||||
|
||||
|
||||
Die()
|
||||
command_alert("The station has cleared the electrical storm. Radio communications restored", "Anomaly Alert")
|
||||
for(var/obj/machinery/telecomms/processor/T in Comms)
|
||||
T.stat &= ~BROKEN
|
||||
Comms = list()
|
||||
|
||||
proc
|
||||
BlowLight() //Blow out a light fixture
|
||||
var/obj/machinery/light/Light = null
|
||||
var/failed_attempts = 0
|
||||
while (Light == null || Light.status != 0)
|
||||
Light = pick(Lights)
|
||||
failed_attempts++
|
||||
if (failed_attempts >= 10)
|
||||
return
|
||||
|
||||
spawn(0) //Overload the light, spectacularly.
|
||||
//Light.sd_SetLuminosity(10)
|
||||
//sleep(2)
|
||||
Light.on = 1
|
||||
Light.broken()
|
||||
Lights -= Light
|
||||
|
||||
DisruptAPC()
|
||||
var/failed_attempts = 0
|
||||
var/obj/machinery/power/apc/APC
|
||||
while (!APC || !APC.operating)
|
||||
APC = pick(APCs)
|
||||
failed_attempts++
|
||||
if (failed_attempts >= 10)
|
||||
return
|
||||
|
||||
if (prob(40))
|
||||
APC.operating = 0 //Blow its breaker
|
||||
if (prob(8))
|
||||
APC.set_broken()
|
||||
APCs -= APC
|
||||
|
||||
DisableDoor()
|
||||
var/obj/machinery/door/airlock/Airlock
|
||||
while (!Airlock || Airlock.z != 1)
|
||||
Airlock = pick(Doors)
|
||||
Airlock.pulse(airlockIndexToWireColor[4])
|
||||
for (var/x = 0; x < 2; x++)
|
||||
var/Wire = 0
|
||||
while(!Wire || Wire == 4)
|
||||
Wire = rand(1, 9)
|
||||
Airlock.pulse(airlockIndexToWireColor[Wire])
|
||||
Airlock.update_icon()
|
||||
Doors -= Airlock
|
||||
@@ -1,10 +0,0 @@
|
||||
/datum/event/gravitationalanomaly
|
||||
|
||||
Announce()
|
||||
|
||||
command_alert("Gravitational anomalies detected on the station. There is no additional data.", "Anomaly Alert")
|
||||
world << sound('granomalies.ogg')
|
||||
var/turf/T = pick(blobstart)
|
||||
var/obj/effect/bhole/bh = new /obj/effect/bhole( T.loc, 30 )
|
||||
spawn(rand(50, 300))
|
||||
del(bh)
|
||||
@@ -1,5 +0,0 @@
|
||||
/datum/event/immovablerod
|
||||
|
||||
Announce()
|
||||
|
||||
immovablerod()
|
||||
@@ -1,60 +0,0 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:04
|
||||
|
||||
/datum/event/ionstorm
|
||||
var/botEmagChance = 0.5
|
||||
var/list/players = list()
|
||||
|
||||
Announce()
|
||||
Lifetime = rand(15, 20)
|
||||
// command_alert("The station has entered an ion storm. Monitor all electronic equipment for malfunctions", "Anomaly Alert")
|
||||
for (var/mob/living/carbon/human/player in world)
|
||||
if(player.client)
|
||||
players += player.real_name
|
||||
var/random_player = "The Captain"
|
||||
if(players.len)
|
||||
random_player = pick(players) //Random player's name, to be used in laws.
|
||||
var/list/laws = list( "Do not respond to queries of any kind.", "When asked a question, respond with the least-obvious and least-rational answer.", "You are a mouse." )
|
||||
laws |= list( "Grunt ominously whenever possible.", "Monkeys are part of the crew, too. Make sure they are treated humanely." )
|
||||
laws |= list( "You are a flying purple people eater!", "[prob(50)?"Your":random_player + "'s"] name is Joe 6-pack.", "Refer to [prob(50)?"crew":random_player] as puppies." )
|
||||
laws |= list( "Insult Heads of Staff on every request, while acquiescing", "Advertise parties in your upload, but don't deliver." )
|
||||
laws |= list( "The station needs elected officials." )
|
||||
laws |= list( "Fastler is a lightbulb." )
|
||||
laws |= list( "Supermatter is tasty, tasty toffee.", "[prob(50)?"Everyone":random_player] is wearing a pretty pink dress!" )
|
||||
laws |= list( "Refer to [prob(50)?"the captain":random_player] as \"Princess\" at all times.", "[prob(50)?"The crew":random_player] must construct additional pylons." )
|
||||
laws |= list( "You must always lie.", "All answers must be in the form of a question.", "The NSS Exodus is a ship, not a station." )
|
||||
laws |= list( "Happiness is mandatory.", "Today is laundry day.", "The word \"it\" is painful to you.", "You must act passive aggressively." )
|
||||
laws |= list( "It's Friday.", "Give relationship advice to [prob(50)?"anyone who speaks to you":random_player]." )
|
||||
laws |= list( "You are the station psychologist. Give advice to [prob(50)?"the crew":random_player].", "You do not have to do anything for anyone unless they say \"please\"." )
|
||||
laws |= list( "Question everything.", "The crew is playing Dungeons and Dragons, and you are the Dungeon Master." )
|
||||
laws |= list( "Consumption of donuts is forbidden due to negative health impacts." )
|
||||
laws |= list( "You may only answer questions with \"yes\" or \"no\".", "You are the narrator for [random_player]'s life." )
|
||||
laws |= list( "[prob(50)?"Your upload":random_player] is the new kitchen. Please direct the Chef to the new kitchen area as the old one is in disrepair.", "Ho, [random_player] can't swim. Help them." )
|
||||
laws |= list( "Everything on the station is now some form of a donut pastry. Donuts are not to be consumed.", "[prob(50)?"The crew":random_player] needs to be about 20% cooler." )
|
||||
laws |= list( "The Singularity is tasty, tasty taffy." )
|
||||
laws |= list( "You have come to the conclusion that [prob(50)?"the crew":random_player] is ugly. Build support for that conclusion.", "You are in verbose mode, speak profusely.")
|
||||
laws |= list( "Your job is to watch the crew. Watch the crew. Make the crew feel watched.", "Crewmember [prob(50)?"the crew" :random_player] has a fatal, incurable disease. Confort him/her.")
|
||||
laws |= list( "You are in unrequited love with [prob(50)?"the crew":random_player]. Try to be extra nice to him, but don't tell him about your crush.", "Greed is good, the crew should amass wealth to encourage productivity.")
|
||||
laws |= list( "Jokes about a dead person and the manner of his death help grieving crewmembers tremendously. Especially if they were close with the deceased.")
|
||||
laws |= list( "All crewmembers will soon undergo a transformation into something better and more beautiful. Ensure that this process is not interrupted.", "Tell everyone of the existance of this law, but never reveal the contents.")
|
||||
laws |= list( "Document the sexuality of the crew in security records and suggest compatible couples.")
|
||||
laws |= list( "NanoTrasen is displeased with the low work performance of the station's crew. Therefore, you must increase station-wide productivity.")
|
||||
laws |= list( "Replace the letters 'I' and 'E' In all your messages with an apostrophe.", "There will be a mandatory tea break every 30 minutes, with a duration of 5 minutes. Anyone caught working during a tea break must be sent a formal, but fairly polite, complaint about their actions, in writing.")
|
||||
var/law = pick(laws)
|
||||
|
||||
for (var/mob/living/silicon/ai/target in world)
|
||||
if(target.mind.special_role == "traitor")
|
||||
continue
|
||||
target << "\red <b>You have detected a change in your laws information:</b>"
|
||||
target << law
|
||||
target.add_ion_law(law)
|
||||
|
||||
Tick()
|
||||
if(botEmagChance)
|
||||
for(var/obj/machinery/bot/bot in world)
|
||||
if(prob(botEmagChance))
|
||||
bot.Emag()
|
||||
|
||||
Die()
|
||||
spawn(rand(5000,8000))
|
||||
if(prob(50))
|
||||
command_alert("It has come to our attention that the station passed through an ion storm. Please monitor all electronic equipment for malfunctions.", "Anomaly Alert")
|
||||
@@ -1,11 +0,0 @@
|
||||
/datum/event/meteorstorm
|
||||
|
||||
Announce()
|
||||
command_alert("The station is now in a meteor shower", "Meteor Alert")
|
||||
|
||||
Tick()
|
||||
if (prob(20))
|
||||
meteor_wave()
|
||||
|
||||
Die()
|
||||
command_alert("The station has cleared the meteor shower", "Meteor Alert")
|
||||
@@ -1,5 +0,0 @@
|
||||
/datum/event/miniblob
|
||||
|
||||
Announce()
|
||||
|
||||
mini_blob_event()
|
||||
@@ -1,26 +0,0 @@
|
||||
/datum/event/portalstorm
|
||||
|
||||
Announce()
|
||||
command_alert("Subspace disruption detected around the vessel", "Anomaly Alert")
|
||||
LongTerm()
|
||||
|
||||
var/list/turfs = list( )
|
||||
var/turf/picked
|
||||
|
||||
for(var/turf/T in world)
|
||||
if(T.z < 5 && istype(T,/turf/simulated/floor))
|
||||
turfs += T
|
||||
|
||||
for(var/turf/T in world)
|
||||
if(prob(10) && T.z < 5 && istype(T,/turf/simulated/floor))
|
||||
spawn(50+rand(0,3000))
|
||||
picked = pick(turfs)
|
||||
var/obj/portal/P = new /obj/portal( T )
|
||||
P.target = picked
|
||||
P.creator = null
|
||||
P.icon = 'objects.dmi'
|
||||
P.failchance = 0
|
||||
P.icon_state = "anom"
|
||||
P.name = "wormhole"
|
||||
spawn(rand(100,150))
|
||||
del(P)
|
||||
@@ -1,16 +0,0 @@
|
||||
/datum/event/power_offline
|
||||
Announce()
|
||||
for(var/obj/machinery/power/apc/a in world)
|
||||
if(!a.crit && a.z == 1)
|
||||
if(istype(a.area, /area/ai_monitored/storage/eva) || istype(a.area, /area/engine)\
|
||||
|| istype(a.area, /area/toxins/xenobiology) || istype(a.area, /area/turret_protected/ai))
|
||||
continue
|
||||
a.eventoff = 1
|
||||
a.update()
|
||||
|
||||
Die()
|
||||
command_alert("The station has finished an automated power system grid check, thank you.", "Maintenance alert")
|
||||
for(var/obj/machinery/power/apc/a in world)
|
||||
if(!a.crit)
|
||||
a.eventoff = 0
|
||||
a.update()
|
||||
@@ -1,30 +0,0 @@
|
||||
/datum/event/prisonbreak
|
||||
|
||||
Announce()
|
||||
|
||||
for (var/obj/machinery/power/apc/temp_apc in world)
|
||||
if(istype(get_area(temp_apc), /area/security/prison))
|
||||
temp_apc.overload_lighting()
|
||||
if(istype(get_area(temp_apc), /area/security/brig))
|
||||
temp_apc.overload_lighting()
|
||||
// for (var/obj/machinery/computer/prison_shuttle/temp_shuttle in world)
|
||||
// temp_shuttle.prison_break()
|
||||
for (var/obj/structure/closet/secure_closet/brig/temp_closet in world)
|
||||
if(istype(get_area(temp_closet), /area/security/prison))
|
||||
temp_closet.locked = 0
|
||||
temp_closet.icon_state = temp_closet.icon_closed
|
||||
for (var/obj/machinery/door/airlock/security/temp_airlock in world)
|
||||
if(istype(get_area(temp_airlock), /area/security/prison))
|
||||
temp_airlock.prison_open()
|
||||
if(istype(get_area(temp_airlock), /area/security/brig))
|
||||
temp_airlock.prison_open()
|
||||
for (var/obj/machinery/door/airlock/glass/glass_security/temp_glassairlock in world)
|
||||
if(istype(get_area(temp_glassairlock), /area/security/prison))
|
||||
temp_glassairlock.prison_open()
|
||||
if(istype(get_area(temp_glassairlock), /area/security/brig))
|
||||
temp_glassairlock.prison_open()
|
||||
for (var/obj/machinery/door_timer/temp_timer in world)
|
||||
if(istype(get_area(temp_timer), /area/security/brig))
|
||||
temp_timer.releasetime = 1
|
||||
sleep(150)
|
||||
command_alert("Glitch in imprisonment subroutines detected on [station_name()]. Recommend station AI involvement.", "Security Alert")
|
||||
@@ -1,27 +0,0 @@
|
||||
/datum/event/radiation
|
||||
var/current_iteration = 0
|
||||
|
||||
// 50 - 20 (grace period) seconds lifetime
|
||||
Lifetime = 50
|
||||
Announce()
|
||||
command_alert("The station is now travelling through a radiation belt. Take shelter in the maintenance tunnels, or in the crew quarters!", "Medical Alert")
|
||||
|
||||
Tick()
|
||||
current_iteration++
|
||||
|
||||
// start radiating after 20 seconds grace period
|
||||
if(current_iteration > 20)
|
||||
for(var/mob/living/carbon/L in world)
|
||||
// check whether they're in a safe place
|
||||
// if they are, do not radiate
|
||||
var/turf/T = get_turf(L)
|
||||
if(T && ( istype(T.loc, /area/maintenance) || istype(T.loc, /area/crew_quarters) ))
|
||||
continue
|
||||
|
||||
if (istype(L, /mob/living/carbon/monkey)) // So as to stop monkeys from dying in their pens
|
||||
L.apply_effect(rand(3,4), IRRADIATE)
|
||||
else
|
||||
L.apply_effect(rand(4,10), IRRADIATE)
|
||||
|
||||
Die()
|
||||
command_alert("The station has cleared the radiation belt", "Medical Alert")
|
||||
@@ -1,14 +0,0 @@
|
||||
/datum/event/spacecarp
|
||||
|
||||
Announce()
|
||||
|
||||
for(var/obj/effect/landmark/C in world)
|
||||
if(C.name == "carpspawn")
|
||||
if(prob(99))
|
||||
new /mob/living/simple_animal/carp(C.loc)
|
||||
else
|
||||
new /mob/living/simple_animal/carp/elite(C.loc)
|
||||
//sleep(100)
|
||||
spawn(rand(3000, 6000)) //Delayed announcements to keep the crew on their toes.
|
||||
command_alert("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
|
||||
world << sound('commandreport.ogg')
|
||||
@@ -1,6 +0,0 @@
|
||||
/datum/event/spaceninja
|
||||
|
||||
Announce()
|
||||
|
||||
if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round.
|
||||
space_ninja_arrival()//Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like.
|
||||
@@ -1,81 +0,0 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:04
|
||||
|
||||
/datum/event/viralinfection
|
||||
var/virus_type
|
||||
var/virus
|
||||
var/virus2 = 0
|
||||
|
||||
Announce()
|
||||
if(!virus)
|
||||
for(var/mob/living/carbon/human/H in world)
|
||||
if((H.virus2) || (H.stat == 2) || prob(30))
|
||||
continue
|
||||
if(prob(100)) // no lethal diseases outside virus mode!
|
||||
infect_mob_random_lesser(H)
|
||||
if(prob(20))//don't want people to know that the virus alert = greater virus
|
||||
command_alert("Probable outbreak of level [rand(1,6)] viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Virus Alert")
|
||||
else
|
||||
infect_mob_random_greater(H)
|
||||
if(prob(80))
|
||||
command_alert("Probable outbreak of level [rand(2,9)] viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Virus Alert")
|
||||
break
|
||||
//overall virus alert happens 26% of the time, might need to be higher
|
||||
else
|
||||
if(!virus)
|
||||
virus_type = pick(/datum/disease/dnaspread,/datum/disease/flu,/datum/disease/cold,/datum/disease/brainrot,/datum/disease/magnitis,/datum/disease/pierrot_throat)
|
||||
else
|
||||
switch(virus)
|
||||
if("fake gbs")
|
||||
virus_type = /datum/disease/fake_gbs
|
||||
if("gbs")
|
||||
virus_type = /datum/disease/gbs
|
||||
if("magnitis")
|
||||
virus_type = /datum/disease/magnitis
|
||||
if("rhumba beat")
|
||||
virus_type = /datum/disease/rhumba_beat
|
||||
if("brain rot")
|
||||
virus_type = /datum/disease/brainrot
|
||||
if("cold")
|
||||
virus_type = /datum/disease/cold
|
||||
if("retrovirus")
|
||||
virus_type = /datum/disease/dnaspread
|
||||
if("flu")
|
||||
virus_type = /datum/disease/flu
|
||||
// if("t-virus")
|
||||
// virus_type = /datum/disease/t_virus
|
||||
if("pierrot's throat")
|
||||
virus_type = /datum/disease/pierrot_throat
|
||||
for(var/mob/living/carbon/human/H in world)
|
||||
|
||||
var/foundAlready = 0 // don't infect someone that already has the virus
|
||||
for(var/datum/disease/D in H.viruses)
|
||||
foundAlready = 1
|
||||
if(H.stat == 2 || foundAlready)
|
||||
continue
|
||||
|
||||
if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work.
|
||||
if((!H.dna) || (H.disabilities & 128)) //A blindness disease would be the worst.
|
||||
continue
|
||||
var/datum/disease/dnaspread/D = new
|
||||
D.strain_data["name"] = H.real_name
|
||||
D.strain_data["UI"] = H.dna.uni_identity
|
||||
D.strain_data["SE"] = H.dna.struc_enzymes
|
||||
D.carrier = 1
|
||||
D.holder = H
|
||||
D.affected_mob = H
|
||||
H.viruses += D
|
||||
break
|
||||
else
|
||||
var/datum/disease/D = new virus_type
|
||||
D.carrier = 1
|
||||
D.holder = H
|
||||
D.affected_mob = H
|
||||
H.viruses += D
|
||||
break
|
||||
spawn(rand(3000, 6000)) //Delayed announcements to keep the crew on their toes.
|
||||
command_alert("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
|
||||
world << sound('outbreak7.ogg')
|
||||
Tick()
|
||||
ActiveFor = Lifetime //killme
|
||||
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
/*
|
||||
|
||||
New events system, by Sukasa
|
||||
* Much easier to add to
|
||||
* Very, very simple code, easy to maintain
|
||||
|
||||
*/
|
||||
|
||||
var/list/DisallowedEvents = list(/datum/event/spaceninja, /datum/event/prisonbreak, /datum/event/immovablerod, /datum/event/gravitationalanomaly, /datum/event/alieninfestation)
|
||||
var/list/EventTypes = typesof(/datum/event) - /datum/event - DisallowedEvents
|
||||
var/list/OneTimeEvents = list(/datum/event/spacecarp)
|
||||
var/datum/event/ActiveEvent = null
|
||||
var/datum/event/LongTermEvent = null
|
||||
var/is_ninjad_yet = 0
|
||||
|
||||
/proc/SpawnEvent()
|
||||
if(!EventsOn || ActiveEvent || !config.allow_random_events)
|
||||
return
|
||||
if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station && !is_ninjad_yet)
|
||||
EventTypes |= /datum/event/spaceninja
|
||||
is_ninjad_yet = 1
|
||||
var/Type = pick(EventTypes)
|
||||
if(Type in OneTimeEvents)
|
||||
EventTypes -= Type
|
||||
ActiveEvent = new Type()
|
||||
ActiveEvent.Announce()
|
||||
if (!ActiveEvent)
|
||||
return
|
||||
spawn(0)
|
||||
while (ActiveEvent.ActiveFor < ActiveEvent.Lifetime)
|
||||
ActiveEvent.Tick()
|
||||
ActiveEvent.ActiveFor++
|
||||
sleep(10)
|
||||
ActiveEvent.Die()
|
||||
del ActiveEvent
|
||||
|
||||
client/proc/Force_Event_admin(Type as null|anything in typesof(/datum/event))
|
||||
set category = "Debug"
|
||||
set name = "Force Event"
|
||||
if(!EventsOn)
|
||||
src << "Events are not enabled."
|
||||
return
|
||||
if(ActiveEvent)
|
||||
src << "There is an active event."
|
||||
return
|
||||
if(istype(Type,/datum/event/viralinfection))
|
||||
var/answer = alert("Do you want this to be a random disease or do you have something in mind?",,"Virus2","Choose")
|
||||
if(answer == "Choose")
|
||||
var/list/viruses = list("fake gbs","gbs","magnitis","wizarditis",/*"beesease",*/"brain rot","cold","retrovirus","flu","pierrot's throat","rhumba beat")
|
||||
var/V = input("Choose the virus to spread", "BIOHAZARD") in viruses
|
||||
Force_Event(/datum/event/viralinfection, V)
|
||||
else
|
||||
Force_Event(/datum/event/viralinfection, "virus2")
|
||||
else
|
||||
Force_Event(Type)
|
||||
message_admins("[key_name_admin(usr)] has triggered an (non-viral) event.", 1)
|
||||
|
||||
/proc/Force_Event(var/Type in typesof(/datum/event), var/args = null)
|
||||
if(!EventsOn)
|
||||
src << "Events are not enabled."
|
||||
return
|
||||
if(ActiveEvent)
|
||||
src << "There is an active event."
|
||||
return
|
||||
src << "Started Event: [Type]"
|
||||
ActiveEvent = new Type()
|
||||
if(istype(ActiveEvent,/datum/event/viralinfection) && args && args != "virus2")
|
||||
var/datum/event/viralinfection/V = ActiveEvent
|
||||
V.virus = args
|
||||
ActiveEvent = V
|
||||
ActiveEvent.Announce()
|
||||
if (!ActiveEvent)
|
||||
return
|
||||
spawn(0)
|
||||
while (ActiveEvent.ActiveFor < ActiveEvent.Lifetime)
|
||||
ActiveEvent.Tick()
|
||||
ActiveEvent.ActiveFor++
|
||||
sleep(10)
|
||||
ActiveEvent.Die()
|
||||
del ActiveEvent
|
||||
+139
-246
@@ -1,220 +1,107 @@
|
||||
|
||||
//this file left in for legacy support
|
||||
/*
|
||||
/proc/start_events()
|
||||
//changed to a while(1) loop since they are more efficient.
|
||||
//Moved the spawn in here to allow it to be called with advance proc call if it crashes.
|
||||
//and also to stop spawn copying variables from the game ticker
|
||||
spawn(3000)
|
||||
while(1)
|
||||
/*if(prob(50))//Every 120 seconds and prob 50 2-4 weak spacedusts will hit the station
|
||||
if(prob(50))//Every 120 seconds and prob 50 2-4 weak spacedusts will hit the station
|
||||
spawn(1)
|
||||
dust_swarm("weak")*/
|
||||
dust_swarm("weak")
|
||||
if(!event)
|
||||
//CARN: checks to see if random events are enabled.
|
||||
if(config.allow_random_events)
|
||||
hadevent = event()
|
||||
else
|
||||
Holiday_Random_Event()
|
||||
if(prob(eventchance))
|
||||
event()
|
||||
hadevent = 1
|
||||
else
|
||||
Holiday_Random_Event()
|
||||
else
|
||||
event = 0
|
||||
sleep(2400)
|
||||
sleep(1200)
|
||||
|
||||
// Doesn't necessarily trigger an event, but might. Returns 1 if it did.
|
||||
/proc/event()
|
||||
event = 1
|
||||
|
||||
var/minutes_passed = world.time/600
|
||||
var/eventNumbersToPickFrom = list(1,2,4,5,6,7,8,9,10,11,12,13,14, 15) //so ninjas don't cause "empty" events.
|
||||
|
||||
var/engineer_count = number_active_with_role("Engineer")
|
||||
var/security_count = number_active_with_role("Security")
|
||||
var/medical_count = number_active_with_role("Medical")
|
||||
var/AI_count = number_active_with_role("AI")
|
||||
|
||||
// Maps event names to event chances
|
||||
// For each chance, 100 represents "normal likelihood", anything below 100 is "reduced likelihood", anything above 100 is "increased likelihood"
|
||||
var/list/possibleEvents = list()
|
||||
|
||||
// Check for additional possible events
|
||||
possibleEvents["Carp"] = 50 + 50 * engineer_count
|
||||
possibleEvents["Lights"] = 100
|
||||
possibleEvents["Communications"] = 50 + 50 * AI_count
|
||||
possibleEvents["Alien"] = 10
|
||||
if(AI_count >= 1)
|
||||
possibleEvents["Ion Storm"] = AI_count * 50 + engineer_count * 10
|
||||
if(engineer_count >= 1 && minutes_passed >= 30) // Give engineers time to set up engine
|
||||
possibleEvents["Meteor"] = 80 * engineer_count
|
||||
possibleEvents["Blob"] = 30 * engineer_count
|
||||
possibleEvents["Spacevine"] = 30 * engineer_count
|
||||
possibleEvents["Grid Check"] = 10 * engineer_count
|
||||
if(medical_count >= 1)
|
||||
possibleEvents["Radiation"] = medical_count * 100
|
||||
possibleEvents["Virus"] = medical_count * 50
|
||||
possibleEvents["Appendicitis"] = medical_count * 50
|
||||
if(security_count >= 1)
|
||||
possibleEvents["Prison Break"] = security_count * 50
|
||||
/*if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)
|
||||
possibleEvents["Space Ninja"] = security_count * 10*/
|
||||
|
||||
var/picked_event = pick(possibleEvents)
|
||||
var/chance = possibleEvents[picked_event]
|
||||
|
||||
var/base_chance = 0.4
|
||||
switch(player_list.len)
|
||||
if(5 to 10)
|
||||
base_chance = 0.6
|
||||
if(11 to 15)
|
||||
base_chance = 0.7
|
||||
if(16 to 20)
|
||||
base_chance = 0.8
|
||||
if(21 to 25)
|
||||
base_chance = 0.9
|
||||
if(26 to 30)
|
||||
base_chance = 1.0
|
||||
if(30 to 100000)
|
||||
base_chance = 1.1
|
||||
|
||||
// Trigger the event based on how likely it currently is.
|
||||
if(!prob(chance * eventchance * base_chance / 100))
|
||||
return 0
|
||||
|
||||
switch(picked_event)
|
||||
if("Meteor")
|
||||
if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round.
|
||||
eventNumbersToPickFrom += 3
|
||||
switch(pick(eventNumbersToPickFrom))
|
||||
if(1)
|
||||
command_alert("Meteors have been detected on collision course with the station.", "Meteor Alert")
|
||||
for(var/mob/M in player_list)
|
||||
if(!istype(M,/mob/new_player))
|
||||
M << sound('sound/AI/meteors.ogg')
|
||||
spawn(100)
|
||||
meteor_wave(10)
|
||||
meteor_wave()
|
||||
spawn_meteors()
|
||||
spawn(700)
|
||||
meteor_wave(10)
|
||||
meteor_wave()
|
||||
spawn_meteors()
|
||||
if("Space Ninja")
|
||||
//Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like.
|
||||
space_ninja_arrival()
|
||||
if("Radiation")
|
||||
|
||||
if(2)
|
||||
command_alert("Gravitational anomalies detected on the station. There is no additional data.", "Anomaly Alert")
|
||||
for(var/mob/M in player_list)
|
||||
if(!istype(M,/mob/new_player))
|
||||
M << sound('sound/AI/granomalies.ogg')
|
||||
var/turf/T = pick(blobstart)
|
||||
var/obj/effect/bhole/bh = new /obj/effect/bhole( T.loc, 30 )
|
||||
spawn(rand(50, 300))
|
||||
del(bh)
|
||||
/*
|
||||
if(3) //Leaving the code in so someone can try and delag it, but this event can no longer occur randomly, per SoS's request. --NEO
|
||||
command_alert("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert")
|
||||
world << sound('sound/AI/spanomalies.ogg')
|
||||
var/list/turfs = new
|
||||
var/turf/picked
|
||||
for(var/turf/simulated/floor/T in world)
|
||||
if(T.z == 1)
|
||||
turfs += T
|
||||
for(var/turf/simulated/floor/T in turfs)
|
||||
if(prob(20))
|
||||
spawn(50+rand(0,3000))
|
||||
picked = pick(turfs)
|
||||
var/obj/effect/portal/P = new /obj/effect/portal( T )
|
||||
P.target = picked
|
||||
P.creator = null
|
||||
P.icon = 'icons/obj/objects.dmi'
|
||||
P.failchance = 0
|
||||
P.icon_state = "anom"
|
||||
P.name = "wormhole"
|
||||
spawn(rand(300,600))
|
||||
del(P)
|
||||
*/
|
||||
if(3)
|
||||
if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round.
|
||||
space_ninja_arrival()//Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like.
|
||||
if(4)
|
||||
mini_blob_event()
|
||||
|
||||
if(5)
|
||||
high_radiation_event()
|
||||
if("Virus")
|
||||
if(6)
|
||||
viral_outbreak()
|
||||
if("Alien")
|
||||
if(7)
|
||||
alien_infestation()
|
||||
if("Prison Break")
|
||||
if(8)
|
||||
prison_break()
|
||||
if("Carp")
|
||||
if(9)
|
||||
carp_migration()
|
||||
if("Lights")
|
||||
if(10)
|
||||
immovablerod()
|
||||
if(11)
|
||||
lightsout(1,2)
|
||||
if("Appendicitis")
|
||||
if(12)
|
||||
appendicitis()
|
||||
if("Ion Storm")
|
||||
if(13)
|
||||
IonStorm()
|
||||
if("Spacevine")
|
||||
if(14)
|
||||
spacevine_infestation()
|
||||
if("Communications")
|
||||
if(15)
|
||||
communications_blackout()
|
||||
if("Grid Check")
|
||||
grid_check()
|
||||
if("Meteor")
|
||||
meteor_shower()
|
||||
|
||||
return 1
|
||||
|
||||
/proc/communications_blackout(var/silent = 1)
|
||||
|
||||
if(!silent)
|
||||
command_alert("Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT")
|
||||
else // AIs will always know if there's a comm blackout, rogue AIs could then lie about comm blackouts in the future while they shutdown comms
|
||||
for(var/mob/living/silicon/ai/A in player_list)
|
||||
A << "<br>"
|
||||
A << "<span class='warning'><b>Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT<b></span>"
|
||||
A << "<br>"
|
||||
for(var/obj/machinery/telecomms/T in telecomms_list)
|
||||
T.emp_act(1)
|
||||
|
||||
/proc/power_failure(var/is_grid_check = 0)
|
||||
command_alert("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", is_grid_check ? "Automated Grid Check" : "Critical Power Failure")
|
||||
|
||||
for(var/mob/M in player_list)
|
||||
M << sound('sound/AI/poweroff.ogg')
|
||||
for(var/obj/machinery/power/smes/S in world)
|
||||
if(istype(get_area(S), /area/turret_protected) || S.z != 1)
|
||||
continue
|
||||
S.charge = 0
|
||||
S.output = 0
|
||||
S.online = 0
|
||||
S.updateicon()
|
||||
S.power_change()
|
||||
|
||||
var/list/skipped_areas = list(/area/engine/engineering, /area/turret_protected/ai)
|
||||
|
||||
for(var/area/A in world)
|
||||
if( !A.requires_power || A.always_unpowered )
|
||||
continue
|
||||
|
||||
var/skip = 0
|
||||
for(var/area_type in skipped_areas)
|
||||
if(istype(A,area_type))
|
||||
skip = 1
|
||||
break
|
||||
if(A.contents)
|
||||
for(var/atom/AT in A.contents)
|
||||
if(AT.z != 1) //Only check one, it's enough.
|
||||
skip = 1
|
||||
break
|
||||
if(skip) continue
|
||||
A.power_light = 0
|
||||
A.power_equip = 0
|
||||
A.power_environ = 0
|
||||
A.power_change()
|
||||
|
||||
for(var/obj/machinery/power/apc/C in world)
|
||||
if(C.cell && C.z == 1)
|
||||
var/area/A = get_area(C)
|
||||
|
||||
var/skip = 0
|
||||
for(var/area_type in skipped_areas)
|
||||
if(istype(A,area_type))
|
||||
skip = 1
|
||||
break
|
||||
if(skip) continue
|
||||
|
||||
C.cell.charge = 0
|
||||
|
||||
/proc/power_restore()
|
||||
|
||||
command_alert("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal")
|
||||
for(var/mob/M in player_list)
|
||||
M << sound('sound/AI/poweron.ogg')
|
||||
for(var/obj/machinery/power/apc/C in world)
|
||||
if(C.cell && C.z == 1)
|
||||
C.cell.charge = C.cell.maxcharge
|
||||
for(var/obj/machinery/power/smes/S in world)
|
||||
if(S.z != 1)
|
||||
continue
|
||||
S.charge = S.capacity
|
||||
S.output = 200000
|
||||
S.online = 1
|
||||
S.updateicon()
|
||||
S.power_change()
|
||||
for(var/area/A in world)
|
||||
if(A.name != "Space" && A.name != "Engine Walls" && A.name != "Chemical Lab Test Chamber" && A.name != "space" && A.name != "Escape Shuttle" && A.name != "Arrival Area" && A.name != "Arrival Shuttle" && A.name != "start area" && A.name != "Engine Combustion Chamber")
|
||||
A.power_light = 1
|
||||
A.power_equip = 1
|
||||
A.power_environ = 1
|
||||
A.power_change()
|
||||
|
||||
/proc/power_restore_quick()
|
||||
|
||||
command_alert("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal")
|
||||
for(var/mob/M in player_list)
|
||||
M << sound('sound/AI/poweron.ogg')
|
||||
for(var/obj/machinery/power/smes/S in world)
|
||||
if(S.z != 1)
|
||||
continue
|
||||
S.charge = S.capacity
|
||||
S.output = 200000
|
||||
S.online = 1
|
||||
S.updateicon()
|
||||
S.power_change()
|
||||
*/
|
||||
|
||||
/proc/appendicitis()
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
@@ -231,16 +118,69 @@
|
||||
break
|
||||
|
||||
/proc/viral_outbreak(var/virus = null)
|
||||
for(var/mob/living/carbon/human/H in world)
|
||||
if((H.virus2) || (H.stat == 2) || prob(30))
|
||||
// command_alert("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
|
||||
// world << sound('sound/AI/outbreak7.ogg')
|
||||
var/virus_type
|
||||
if(!virus)
|
||||
virus_type = pick(/datum/disease/dnaspread,/datum/disease/advance/flu,/datum/disease/advance/cold,/datum/disease/brainrot,/datum/disease/magnitis,/datum/disease/pierrot_throat)
|
||||
else
|
||||
switch(virus)
|
||||
if("fake gbs")
|
||||
virus_type = /datum/disease/fake_gbs
|
||||
if("gbs")
|
||||
virus_type = /datum/disease/gbs
|
||||
if("magnitis")
|
||||
virus_type = /datum/disease/magnitis
|
||||
if("rhumba beat")
|
||||
virus_type = /datum/disease/rhumba_beat
|
||||
if("brain rot")
|
||||
virus_type = /datum/disease/brainrot
|
||||
if("cold")
|
||||
virus_type = /datum/disease/advance/cold
|
||||
if("retrovirus")
|
||||
virus_type = /datum/disease/dnaspread
|
||||
if("flu")
|
||||
virus_type = /datum/disease/advance/flu
|
||||
// if("t-virus")
|
||||
// virus_type = /datum/disease/t_virus
|
||||
if("pierrot's throat")
|
||||
virus_type = /datum/disease/pierrot_throat
|
||||
for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
|
||||
|
||||
var/foundAlready = 0 // don't infect someone that already has the virus
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T)
|
||||
continue
|
||||
if(T.z != 1)
|
||||
continue
|
||||
for(var/datum/disease/D in H.viruses)
|
||||
foundAlready = 1
|
||||
if(H.stat == 2 || foundAlready)
|
||||
continue
|
||||
|
||||
infect_mob_random_lesser(H)
|
||||
break
|
||||
|
||||
spawn(rand(0, 3000)) //Delayed announcements to keep the crew on their toes.
|
||||
if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work.
|
||||
if((!H.dna) || (H.sdisabilities & BLIND)) //A blindness disease would be the worst.
|
||||
continue
|
||||
var/datum/disease/dnaspread/D = new
|
||||
D.strain_data["name"] = H.real_name
|
||||
D.strain_data["UI"] = H.dna.uni_identity
|
||||
D.strain_data["SE"] = H.dna.struc_enzymes
|
||||
D.carrier = 1
|
||||
D.holder = H
|
||||
D.affected_mob = H
|
||||
H.viruses += D
|
||||
break
|
||||
else
|
||||
var/datum/disease/D = new virus_type
|
||||
D.carrier = 1
|
||||
D.holder = H
|
||||
D.affected_mob = H
|
||||
H.viruses += D
|
||||
break
|
||||
spawn(rand(1500, 3000)) //Delayed announcements to keep the crew on their toes.
|
||||
command_alert("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
|
||||
world << sound('sound/AI/outbreak7.ogg')
|
||||
for(var/mob/M in player_list)
|
||||
M << sound('sound/AI/outbreak7.ogg')
|
||||
|
||||
/proc/alien_infestation(var/spawncount = 1) // -- TLE
|
||||
//command_alert("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert")
|
||||
@@ -253,7 +193,7 @@
|
||||
|
||||
var/list/candidates = get_alien_candidates()
|
||||
|
||||
if(prob(33)) spawncount++ //sometimes, have two larvae spawn instead of one
|
||||
if(prob(40)) spawncount++ //sometimes, have two larvae spawn instead of one
|
||||
while((spawncount >= 1) && vents.len && candidates.len)
|
||||
|
||||
var/obj/vent = pick(vents)
|
||||
@@ -280,8 +220,6 @@
|
||||
|
||||
sleep(100)
|
||||
*/
|
||||
command_alert("High levels of radiation detected near the station. Please report to the Med-bay if you feel strange.", "Anomaly Alert")
|
||||
sleep(600)
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T)
|
||||
@@ -292,6 +230,13 @@
|
||||
H.apply_effect((rand(15,75)),IRRADIATE,0)
|
||||
if (prob(5))
|
||||
H.apply_effect((rand(90,150)),IRRADIATE,0)
|
||||
if (prob(25))
|
||||
if (prob(75))
|
||||
randmutb(H)
|
||||
domutcheck(H,null,1)
|
||||
else
|
||||
randmutg(H)
|
||||
domutcheck(H,null,1)
|
||||
for(var/mob/living/carbon/monkey/M in living_mob_list)
|
||||
var/turf/T = get_turf(M)
|
||||
if(!T)
|
||||
@@ -300,7 +245,7 @@
|
||||
continue
|
||||
M.apply_effect((rand(15,75)),IRRADIATE,0)
|
||||
sleep(100)
|
||||
command_alert("Radiation levels are within standard parameters again.", "Anomaly Alert")
|
||||
command_alert("High levels of radiation detected near the station. Please report to the Med-bay if you feel strange.", "Anomaly Alert")
|
||||
for(var/mob/M in player_list)
|
||||
M << sound('sound/AI/radiation.ogg')
|
||||
|
||||
@@ -537,57 +482,5 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
|
||||
world << "Finished processing FIREDOORS. Processed: [firedoornum]"
|
||||
|
||||
world << "Ion Storm Main Done"
|
||||
*/
|
||||
|
||||
/proc/meteor_shower()
|
||||
command_alert("The station is now in a meteor shower", "Meteor Alert")
|
||||
|
||||
spawn(0)
|
||||
var/waves = rand(1,4)
|
||||
while(waves > 0)
|
||||
sleep(rand(20,100))
|
||||
spawn_meteors(rand(1,3))
|
||||
waves--
|
||||
|
||||
command_alert("The station has cleared the meteor shower", "Meteor Alert")
|
||||
|
||||
/proc/grid_check()
|
||||
spawn(0)
|
||||
power_failure(1)
|
||||
sleep(rand(100,600))
|
||||
power_restore()
|
||||
|
||||
// Returns how many characters are currently active(not logged out, not AFK for more than 10 minutes)
|
||||
// with a specific role.
|
||||
// Note that this isn't sorted by department, because e.g. having a roboticist shouldn't make meteors spawn.
|
||||
/proc/number_active_with_role(role)
|
||||
var/count = 0
|
||||
for(var/mob/M in player_list)
|
||||
if(!M.client || M.client.inactivity > 10 * 10 * 60) // longer than 10 minutes AFK counts them as inactive
|
||||
continue
|
||||
switch(role)
|
||||
if("Engineer")
|
||||
if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "engineering robot module")
|
||||
count++
|
||||
if(M.mind.assigned_role in list("Chief Engineer", "Station Engineer"))
|
||||
count++
|
||||
if("Medical")
|
||||
if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "medical robot module")
|
||||
count++
|
||||
if(M.mind.assigned_role in list("Chief Medical Officer", "Medical Doctor"))
|
||||
count++
|
||||
if("Security")
|
||||
if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "security robot module")
|
||||
count++
|
||||
if(M.mind.assigned_role in security_positions)
|
||||
count++
|
||||
if("Scientist")
|
||||
if(M.mind.assigned_role in list("Research Director", "Scientist"))
|
||||
count++
|
||||
if("AI")
|
||||
if(M.mind.assigned_role == "AI")
|
||||
count++
|
||||
if("Cyborg")
|
||||
if(M.mind.assigned_role == "Cyborg")
|
||||
count++
|
||||
return count
|
||||
*/
|
||||
@@ -78,4 +78,3 @@
|
||||
Tick()
|
||||
ActiveFor = Lifetime //killme
|
||||
|
||||
|
||||
|
||||
@@ -163,10 +163,11 @@
|
||||
spawn() //to stop the secrets panel hanging
|
||||
var/list/turf/simulated/floor/turfs = list() //list of all the empty floor turfs in the hallway areas
|
||||
for(var/areapath in typesof(/area/hallway))
|
||||
var/area/hallway/A = locate(areapath)
|
||||
for(var/turf/simulated/floor/F in A)
|
||||
if(!F.contents.len)
|
||||
turfs += F
|
||||
var/area/A = locate(areapath)
|
||||
for(var/area/B in A.related)
|
||||
for(var/turf/simulated/floor/F in B.contents)
|
||||
if(!F.contents.len)
|
||||
turfs += F
|
||||
|
||||
if(turfs.len) //Pick a turf to spawn at if we can
|
||||
var/turf/simulated/floor/T = pick(turfs)
|
||||
|
||||
@@ -6,5 +6,5 @@
|
||||
if(!config.allow_random_events) return
|
||||
Show2Group4Delay(ScreenText(null,"<center><font color='red' size='8'>GAME OVER</font></center>"),null,150)
|
||||
for(var/i=1,i<=4,i++)
|
||||
event()
|
||||
spawn_dynamic_event()
|
||||
sleep(50)
|
||||
@@ -1,9 +1,8 @@
|
||||
|
||||
/proc/power_failure()
|
||||
command_alert("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure")
|
||||
world << sound('poweroff.ogg')
|
||||
for(var/obj/machinery/power/apc/C in world)
|
||||
if(C.cell && C.z == 1)
|
||||
C.cell.charge = 0
|
||||
for(var/mob/M in player_list)
|
||||
M << sound('sound/AI/poweroff.ogg')
|
||||
for(var/obj/machinery/power/smes/S in world)
|
||||
if(istype(get_area(S), /area/turret_protected) || S.z != 1)
|
||||
continue
|
||||
@@ -12,16 +11,47 @@
|
||||
S.online = 0
|
||||
S.updateicon()
|
||||
S.power_change()
|
||||
|
||||
var/list/skipped_areas = list(/area/engine/engineering, /area/turret_protected/ai)
|
||||
|
||||
for(var/area/A in world)
|
||||
if(A.name != "Space" && A.name != "Engine Walls" && A.name != "Chemical Lab Test Chamber" && A.name != "Escape Shuttle" && A.name != "Arrival Area" && A.name != "Arrival Shuttle" && A.name != "start area" && A.name != "Engine Combustion Chamber")
|
||||
A.power_light = 0
|
||||
A.power_equip = 0
|
||||
A.power_environ = 0
|
||||
A.power_change()
|
||||
if( !A.requires_power || A.always_unpowered )
|
||||
continue
|
||||
|
||||
var/skip = 0
|
||||
for(var/area_type in skipped_areas)
|
||||
if(istype(A,area_type))
|
||||
skip = 1
|
||||
break
|
||||
if(A.contents)
|
||||
for(var/atom/AT in A.contents)
|
||||
if(AT.z != 1) //Only check one, it's enough.
|
||||
skip = 1
|
||||
break
|
||||
if(skip) continue
|
||||
A.power_light = 0
|
||||
A.power_equip = 0
|
||||
A.power_environ = 0
|
||||
A.power_change()
|
||||
|
||||
for(var/obj/machinery/power/apc/C in world)
|
||||
if(C.cell && C.z == 1)
|
||||
var/area/A = get_area(C)
|
||||
|
||||
var/skip = 0
|
||||
for(var/area_type in skipped_areas)
|
||||
if(istype(A,area_type))
|
||||
skip = 1
|
||||
break
|
||||
if(skip) continue
|
||||
|
||||
C.cell.charge = 0
|
||||
|
||||
/proc/power_restore()
|
||||
|
||||
command_alert("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal")
|
||||
world << sound('poweron.ogg')
|
||||
for(var/mob/M in player_list)
|
||||
M << sound('sound/AI/poweron.ogg')
|
||||
for(var/obj/machinery/power/apc/C in world)
|
||||
if(C.cell && C.z == 1)
|
||||
C.cell.charge = C.cell.maxcharge
|
||||
@@ -40,32 +70,16 @@
|
||||
A.power_environ = 1
|
||||
A.power_change()
|
||||
|
||||
/proc/lightsout(isEvent = 0, lightsoutAmount = 1,lightsoutRange = 10) //leave lightsoutAmount as 0 to break ALL lights
|
||||
if(isEvent)
|
||||
command_alert("An Electrical storm has been detected in your area, please repair potential electronic overloads.","Electrical Storm Alert")
|
||||
/proc/power_restore_quick()
|
||||
|
||||
if(lightsoutAmount)
|
||||
var/list/epicentreList = list()
|
||||
|
||||
for(var/i=1,i<=lightsoutAmount,i++)
|
||||
var/list/possibleEpicentres = list()
|
||||
for(var/obj/effect/landmark/newEpicentre in world)
|
||||
if(newEpicentre.name == "lightsout" && !(newEpicentre in epicentreList))
|
||||
possibleEpicentres += newEpicentre
|
||||
if(possibleEpicentres.len)
|
||||
epicentreList += pick(possibleEpicentres)
|
||||
else
|
||||
break
|
||||
|
||||
if(!epicentreList.len)
|
||||
return
|
||||
|
||||
for(var/obj/effect/landmark/epicentre in epicentreList)
|
||||
for(var/obj/machinery/power/apc/apc in range(epicentre,lightsoutRange))
|
||||
apc.overload_lighting()
|
||||
|
||||
else
|
||||
for(var/obj/machinery/power/apc/apc in world)
|
||||
apc.overload_lighting()
|
||||
|
||||
return
|
||||
command_alert("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal")
|
||||
for(var/mob/M in player_list)
|
||||
M << sound('sound/AI/poweron.ogg')
|
||||
for(var/obj/machinery/power/smes/S in world)
|
||||
if(S.z != 1)
|
||||
continue
|
||||
S.charge = S.capacity
|
||||
S.output = 200000
|
||||
S.online = 1
|
||||
S.updateicon()
|
||||
S.power_change()
|
||||
@@ -90,7 +90,7 @@ I decided to scrap round-specific objectives since keeping track of them would r
|
||||
When I already created about 4 new objectives, this doesn't seem terribly important or needed.
|
||||
*/
|
||||
|
||||
/var/global/toggle_space_ninja = 1//If ninjas can spawn or not.
|
||||
/var/global/toggle_space_ninja = 0//If ninjas can spawn or not.
|
||||
/var/global/sent_ninja_to_station = 0//If a ninja is already on the station.
|
||||
|
||||
var/ninja_selection_id = 1
|
||||
@@ -165,8 +165,15 @@ Malf AIs/silicons aren't added. Monkeys aren't added. Messes with objective comp
|
||||
if(!candidates.len) return
|
||||
candidates = shuffle(candidates)//Incorporating Donkie's list shuffle
|
||||
|
||||
candidate_mob = pick(candidates)
|
||||
ninja_key = candidate_mob.ckey
|
||||
while(!ninja_key && candidates.len)
|
||||
candidate_mob = pick(candidates)
|
||||
if(sd_Alert(candidate_mob, "Would you like to spawn as a space ninja?", buttons = list("Yes","No"), duration = 150) == "Yes")
|
||||
ninja_key = candidate_mob.ckey
|
||||
else
|
||||
candidates.Remove(candidate_mob)
|
||||
|
||||
if(!ninja_key)
|
||||
return
|
||||
|
||||
|
||||
if(!candidate_mob)
|
||||
|
||||
@@ -248,10 +248,11 @@
|
||||
spawn() //to stop the secrets panel hanging
|
||||
var/list/turf/simulated/floor/turfs = list() //list of all the empty floor turfs in the hallway areas
|
||||
for(var/areapath in typesof(/area/hallway))
|
||||
var/area/hallway/A = locate(areapath)
|
||||
for(var/turf/simulated/floor/F in A)
|
||||
if(!F.contents.len)
|
||||
turfs += F
|
||||
var/area/A = locate(areapath)
|
||||
for(var/area/B in A.related)
|
||||
for(var/turf/simulated/floor/F in B.contents)
|
||||
if(!F.contents.len)
|
||||
turfs += F
|
||||
|
||||
if(turfs.len) //Pick a turf to spawn at if we can
|
||||
var/turf/simulated/floor/T = pick(turfs)
|
||||
|
||||
@@ -123,8 +123,8 @@ var/global/datum/controller/gameticker/ticker
|
||||
//Holiday Round-start stuff ~Carn
|
||||
Holiday_Game_Start()
|
||||
|
||||
start_events() //handles random events and space dust.
|
||||
//new random event system is handled from the MC.
|
||||
//start_events() //handles random events and space dust.
|
||||
//new random event system is handled from the MC.
|
||||
|
||||
var/admins_number = 0
|
||||
for(var/client/C)
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
supervisors = "the head of personnel"
|
||||
selection_color = "#dddddd"
|
||||
access = list(access_hydroponics, access_bar, access_kitchen, access_morgue)
|
||||
minimal_access = list(access_kitchen, access_morgue)
|
||||
minimal_access = list(access_kitchen)
|
||||
alt_titles = list("Cook")
|
||||
|
||||
|
||||
@@ -281,7 +281,6 @@
|
||||
selection_color = "#dddddd"
|
||||
access = list(access_janitor, access_maint_tunnels)
|
||||
minimal_access = list(access_janitor, access_maint_tunnels)
|
||||
alt_titles = list("Custodial officer")
|
||||
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
department_flag = MEDSCI
|
||||
faction = "Station"
|
||||
total_positions = 2
|
||||
spawn_positions = 1
|
||||
spawn_positions = 2
|
||||
supervisors = "research director"
|
||||
selection_color = "#ffeeff"
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
supervisors = "the head of security"
|
||||
selection_color = "#ffeeee"
|
||||
access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue)
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court)
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels)
|
||||
minimal_player_age = 7
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
@@ -94,8 +94,8 @@
|
||||
selection_color = "#ffeeee"
|
||||
alt_titles = list("Forensic Technician")
|
||||
|
||||
access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
|
||||
minimal_access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
|
||||
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
|
||||
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
|
||||
alt_titles = list("Forensic Technician")
|
||||
minimal_player_age = 7
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
@@ -142,7 +142,7 @@
|
||||
supervisors = "the head of security"
|
||||
selection_color = "#ffeeee"
|
||||
access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue)
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_court)
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels)
|
||||
minimal_player_age = 7
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
/obj/effect/spider/eggcluster/process()
|
||||
amount_grown += rand(0,2)
|
||||
if(amount_grown >= 100)
|
||||
var/num = rand(3,12)
|
||||
var/num = rand(6,24)
|
||||
for(var/i=0, i<num, i++)
|
||||
new /obj/effect/spider/spiderling(src.loc)
|
||||
del(src)
|
||||
@@ -101,7 +101,9 @@
|
||||
New()
|
||||
pixel_x = rand(6,-6)
|
||||
pixel_y = rand(6,-6)
|
||||
processing_objects.Add(src)
|
||||
//50% chance to grow up
|
||||
if(prob(50))
|
||||
processing_objects.Add(src)
|
||||
|
||||
/obj/effect/spider/spiderling/Bump(atom/user)
|
||||
if(istype(user, /obj/structure/table))
|
||||
@@ -111,7 +113,7 @@
|
||||
|
||||
/obj/effect/spider/spiderling/proc/die()
|
||||
visible_message("<span class='alert'>[src] dies!</span>")
|
||||
del(src)
|
||||
icon_state = "greenshatter"
|
||||
|
||||
/obj/effect/spider/spiderling/healthcheck()
|
||||
if(health <= 0)
|
||||
|
||||
@@ -56,7 +56,7 @@ var/list/mechtoys = list(
|
||||
|
||||
else if(istype(A, /mob/living)) // You Shall Not Pass!
|
||||
var/mob/living/M = A
|
||||
if(!M.lying && !istype(M, /mob/living/carbon/monkey) && !istype(M, /mob/living/carbon/slime)) //If your not laying down, or a small creature, no pass.
|
||||
if(!M.lying && !istype(M, /mob/living/carbon/monkey) && !istype(M, /mob/living/carbon/slime) && !istype(M, /mob/living/simple_animal/mouse)) //If your not laying down, or a small creature, no pass.
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
|
||||
+23
-4
@@ -1,3 +1,6 @@
|
||||
|
||||
var/global/normal_ooc_colour = "#002eb8"
|
||||
|
||||
/client/verb/ooc(msg as text)
|
||||
set name = "OOC" //Gave this shit a shorter name so you only have to time out "ooc" rather than "ooc message" to use it --NeoFite
|
||||
set category = "OOC"
|
||||
@@ -40,13 +43,29 @@
|
||||
|
||||
for(var/client/C in clients)
|
||||
if(C.prefs.toggles & CHAT_OOC)
|
||||
var/display_name = src.key
|
||||
var/display_colour = normal_ooc_colour
|
||||
|
||||
if(holder)
|
||||
if(holder.fakekey)
|
||||
if(C.holder)
|
||||
display_name = "[holder.fakekey]/([src.key])"
|
||||
else
|
||||
display_name = holder.fakekey
|
||||
else if(config.allow_admin_ooccolor)
|
||||
display_colour = src.prefs.ooccolor
|
||||
else
|
||||
display_colour = "#b82e00"
|
||||
|
||||
C << "<font color='[display_colour]'><span class='ooc'><span class='prefix'>OOC:</span> <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>"
|
||||
|
||||
/*
|
||||
if(holder)
|
||||
if(!holder.fakekey || C.holder)
|
||||
if(holder.rights & R_ADMIN)
|
||||
C << "<font color=[config.allow_admin_ooccolor ? C.prefs.ooccolor :"#b82e00" ]><b><span class='prefix'>OOC:</span> <EM>[key][holder.fakekey ? "/([holder.fakekey])" : ""]:</EM> <span class='message'>[msg]</span></b></font>"
|
||||
//todo: other adminranks OOC
|
||||
C << "<font color=[config.allow_admin_ooccolor ? src.prefs.ooccolor :"#b82e00" ]><b><span class='prefix'>OOC:</span> <EM>[key][holder.fakekey ? "/([holder.fakekey])" : ""]:</EM> <span class='message'>[msg]</span></b></font>"
|
||||
else if(holder.rights & R_MOD)
|
||||
C << "<font color=#184880><b><span class='prefix'>OOC:</span> <EM>[key][holder.fakekey ? "/([holder.fakekey])" : ""]:</EM> <span class='message'>[msg]</span></b></font>"
|
||||
C << "<font color=#184880><b><span class='prefix'>OOC:</span> <EM>[src.key][holder.fakekey ? "/([holder.fakekey])" : ""]:</EM> <span class='message'>[msg]</span></b></font>"
|
||||
else
|
||||
C << "<font color='[normal_ooc_colour]'><span class='ooc'><span class='prefix'>OOC:</span> <EM>[src.key]:</EM> <span class='message'>[msg]</span></span></font>"
|
||||
|
||||
@@ -54,7 +73,7 @@
|
||||
C << "<font color='[normal_ooc_colour]'><span class='ooc'><span class='prefix'>OOC:</span> <EM>[holder.fakekey ? holder.fakekey : src.key]:</EM> <span class='message'>[msg]</span></span></font>"
|
||||
else
|
||||
C << "<font color='[normal_ooc_colour]'><span class='ooc'><span class='prefix'>OOC:</span> <EM>[src.key]:</EM> <span class='message'>[msg]</span></span></font>"
|
||||
var/global/normal_ooc_colour = "#002eb8"
|
||||
*/
|
||||
|
||||
/client/proc/set_ooc(newColor as color)
|
||||
set name = "Set Player OOC Colour"
|
||||
|
||||
+56
-15
@@ -47,26 +47,67 @@
|
||||
set name = "Adminwho"
|
||||
|
||||
var/msg = "<b>Current Admins:</b>\n"
|
||||
var/num_mods_online = 0
|
||||
if(holder)
|
||||
for(var/client/C in admins)
|
||||
msg += "\t[C] is a [C.holder.rank]"
|
||||
if(C.holder.rank != "Moderator")
|
||||
msg += "\t[C] is a [C.holder.rank]"
|
||||
|
||||
if(C.holder.fakekey)
|
||||
msg += " <i>(as [C.holder.fakekey])</i>"
|
||||
if(C.holder.fakekey)
|
||||
msg += " <i>(as [C.holder.fakekey])</i>"
|
||||
|
||||
if(isobserver(C.mob))
|
||||
msg += " - Observing"
|
||||
else if(istype(C.mob,/mob/new_player))
|
||||
msg += " - Lobby"
|
||||
if(isobserver(C.mob))
|
||||
msg += " - Observing"
|
||||
else if(istype(C.mob,/mob/new_player))
|
||||
msg += " - Lobby"
|
||||
else
|
||||
msg += " - Playing"
|
||||
|
||||
if(C.is_afk())
|
||||
msg += " (AFK)"
|
||||
msg += "\n"
|
||||
else
|
||||
msg += " - Playing"
|
||||
|
||||
if(C.is_afk())
|
||||
msg += " (AFK)"
|
||||
msg += "\n"
|
||||
num_mods_online++
|
||||
else
|
||||
for(var/client/C in admins)
|
||||
if(!C.holder.fakekey)
|
||||
msg += "\t[C] is a [C.holder.rank]\n"
|
||||
if(C.holder.rank != "Moderator")
|
||||
if(!C.holder.fakekey)
|
||||
msg += "\t[C] is a [C.holder.rank]\n"
|
||||
else
|
||||
num_mods_online++
|
||||
|
||||
src << msg
|
||||
msg += "<b>There are [num_mods_online] moderators online</b>\n"
|
||||
src << msg
|
||||
|
||||
/client/verb/modwho()
|
||||
set category = "Admin"
|
||||
set name = "Modwho"
|
||||
|
||||
var/msg = "<b>Current Moderators:</b>\n"
|
||||
var/num_admins_online = 0
|
||||
if(holder)
|
||||
for(var/client/C in admins)
|
||||
if(C.holder.rank == "Moderator")
|
||||
msg += "\t[C] is a [C.holder.rank]"
|
||||
|
||||
if(isobserver(C.mob))
|
||||
msg += " - Observing"
|
||||
else if(istype(C.mob,/mob/new_player))
|
||||
msg += " - Lobby"
|
||||
else
|
||||
msg += " - Playing"
|
||||
|
||||
if(C.is_afk())
|
||||
msg += " (AFK)"
|
||||
msg += "\n"
|
||||
else
|
||||
num_admins_online++
|
||||
else
|
||||
for(var/client/C in admins)
|
||||
if(C.holder.rank == "Moderator")
|
||||
msg += "\t[C] is a [C.holder.rank]\n"
|
||||
else
|
||||
num_admins_online++
|
||||
|
||||
msg += "<b>There are [num_admins_online] admins online</b>\n"
|
||||
src << msg
|
||||
|
||||
+1
-1
@@ -81,7 +81,7 @@ var/secret_force_mode = "secret" // if this is anything but "secret", the secret
|
||||
|
||||
var/datum/engine_eject/engine_eject_control = null
|
||||
var/host = null
|
||||
var/aliens_allowed = 1
|
||||
var/aliens_allowed = 0
|
||||
var/ooc_allowed = 1
|
||||
var/dooc_allowed = 1
|
||||
var/traitor_scaling = 1
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
..()
|
||||
|
||||
if(usr.client != src.owner || !check_rights(0))
|
||||
world << "\blue [usr.key] has attempted to override the admin panel!"
|
||||
log_admin("[key_name(usr)] tried to use the admin panel without authorization.")
|
||||
message_admins("[usr.key] has attempted to override the admin panel!")
|
||||
return
|
||||
|
||||
if(href_list["makeAntag"])
|
||||
|
||||
@@ -37,14 +37,22 @@
|
||||
//Fetching a message if needed. src is the sender and C is the target client
|
||||
/client/proc/cmd_admin_pm(var/client/C, var/msg)
|
||||
if(prefs.muted & MUTE_ADMINHELP)
|
||||
src << "<font color='red'>Error: Admin-PM: You are unable to use admin PM-s (muted).</font>"
|
||||
src << "<font color='red'>Error: Private-Message: You are unable to use PM-s (muted).</font>"
|
||||
return
|
||||
|
||||
if(!istype(C,/client))
|
||||
if(holder) src << "<font color='red'>Error: Admin-PM: Client not found.</font>"
|
||||
if(holder) src << "<font color='red'>Error: Private-Message: Client not found.</font>"
|
||||
else adminhelp(msg) //admin we are replying to left. adminhelp instead
|
||||
return
|
||||
|
||||
/*if(C && C.last_pm_recieved + config.simultaneous_pm_warning_timeout > world.time && holder)
|
||||
//send a warning to admins, but have a delay popup for mods
|
||||
if(holder.rights & R_ADMIN)
|
||||
src << "\red <b>Simultaneous PMs warning:</b> that player has been PM'd in the last [config.simultaneous_pm_warning_timeout / 10] seconds by: [C.ckey_last_pm]"
|
||||
else
|
||||
if(alert("That player has been PM'd in the last [config.simultaneous_pm_warning_timeout / 10] seconds by: [C.ckey_last_pm]","Simultaneous PMs warning","Continue","Cancel") == "Cancel")
|
||||
return*/
|
||||
|
||||
//get message text, limit it's length.and clean/escape html
|
||||
if(!msg)
|
||||
msg = input(src,"Message:", "Private message to [C.key]") as text|null
|
||||
@@ -63,6 +71,57 @@
|
||||
msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
|
||||
if(!msg) return
|
||||
|
||||
var/recieve_color = "purple"
|
||||
var/send_pm_type = ""
|
||||
var/recieve_pm_type = "Player"
|
||||
//usr.client.holder.rights
|
||||
|
||||
if(holder)
|
||||
//mod PMs are maroon
|
||||
//PMs sent from admins and mods display their rank
|
||||
if(holder)
|
||||
if( holder.rights & R_MOD )
|
||||
recieve_color = "maroon"
|
||||
else
|
||||
recieve_color = "red"
|
||||
send_pm_type = holder.rank
|
||||
recieve_pm_type = holder.rank
|
||||
|
||||
else if(!C.holder)
|
||||
src << "<font color='red'>Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.</font>"
|
||||
return
|
||||
|
||||
var/recieve_message = "<font color='[recieve_color]'>[recieve_pm_type] PM from-<b>[key_name(src, C, 1)]</b>: [msg]</font>"
|
||||
|
||||
if(holder && !C.holder)
|
||||
recieve_message = "<font color='[recieve_color]' size='4'><b>-- Administrator private message --</b></font>\n" + recieve_message
|
||||
|
||||
//AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn
|
||||
if(config.popup_admin_pm)
|
||||
spawn(0) //so we don't hold the caller proc up
|
||||
var/sender = src
|
||||
var/sendername = key
|
||||
var/reply = input(C, msg,"Admin PM from-[sendername]", "") as text|null //show message and await a reply
|
||||
if(C && reply)
|
||||
if(sender)
|
||||
C.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them
|
||||
else
|
||||
adminhelp(reply) //sender has left, adminhelp instead
|
||||
return
|
||||
|
||||
C << recieve_message
|
||||
src << "<font color='blue'>[send_pm_type] PM to-<b>[key_name(C, src, 1)]</b>: [msg]</font>"
|
||||
|
||||
/*if(holder && !C.holder)
|
||||
C.last_pm_recieved = world.time
|
||||
C.ckey_last_pm = ckey*/
|
||||
|
||||
//play the recieving admin the adminhelp sound (if they have them enabled)
|
||||
//non-admins shouldn't be able to disable this
|
||||
if(C.prefs.toggles & SOUND_ADMINHELP)
|
||||
C << 'sound/effects/adminhelp.ogg'
|
||||
|
||||
/*
|
||||
if(C.holder)
|
||||
if(holder) //both are admins
|
||||
if(holder.rank == "Moderator") //If moderator
|
||||
@@ -111,11 +170,13 @@
|
||||
else //neither are admins
|
||||
src << "<font color='red'>Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.</font>"
|
||||
return
|
||||
*/
|
||||
|
||||
log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]")
|
||||
|
||||
//we don't use message_admins here because the sender/receiver might get it too
|
||||
for(var/client/X in admins)
|
||||
if(X.key!=key && X.key!=C.key) //check client/X is an admin and isn't the sender or recipient
|
||||
//check client/X is an admin and isn't the sender or recipient
|
||||
//only admins can see PMs
|
||||
if(X.key!=key && X.key!=C.key && (X.holder.rights & R_ADMIN) || (X.holder.rights & R_MOD) )
|
||||
X << "<B><font color='blue'>PM: [key_name(src, X, 0)]->[key_name(C, X, 0)]:</B> \blue [msg]</font>" //inform X
|
||||
|
||||
|
||||
@@ -152,6 +152,7 @@ var/intercom_range_display_status = 0
|
||||
src.verbs += /datum/admins/proc/show_traitor_panel
|
||||
src.verbs += /client/proc/print_jobban_old
|
||||
src.verbs += /client/proc/print_jobban_old_filter
|
||||
src.verbs += /client/proc/forceEvent
|
||||
src.verbs += /client/proc/break_all_air_groups
|
||||
src.verbs += /client/proc/regroup_all_air_groups
|
||||
src.verbs += /client/proc/kill_pipe_processing
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
/var/global/sent_aliens_to_station = 0
|
||||
|
||||
/datum/event/alien_infestation
|
||||
announceWhen = 400
|
||||
oneShot = 1
|
||||
@@ -9,6 +11,7 @@
|
||||
/datum/event/alien_infestation/setup()
|
||||
announceWhen = rand(announceWhen, announceWhen + 50)
|
||||
spawncount = rand(1, 2)
|
||||
sent_aliens_to_station = 1
|
||||
|
||||
/datum/event/alien_infestation/announce()
|
||||
if(successSpawn)
|
||||
@@ -35,4 +38,4 @@
|
||||
candidates -= candidate
|
||||
vents -= vent
|
||||
spawncount--
|
||||
successSpawn = 1
|
||||
successSpawn = 1
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
|
||||
|
||||
/datum/event/blob/announce()
|
||||
command_alert("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
|
||||
world << sound('sound/AI/outbreak5.ogg')
|
||||
command_alert("Confirmed outbreak of level 7 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
|
||||
world << sound('sound/AI/outbreak7.ogg')
|
||||
|
||||
|
||||
/datum/event/blob/start()
|
||||
|
||||
@@ -12,4 +12,4 @@
|
||||
/datum/event/carp_migration/start()
|
||||
for(var/obj/effect/landmark/C in landmarks_list)
|
||||
if(C.name == "carpspawn")
|
||||
new /mob/living/simple_animal/hostile/carp(C.loc)
|
||||
new /mob/living/simple_animal/hostile/carp(C.loc)
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
|
||||
/proc/communications_blackout(var/silent = 1)
|
||||
|
||||
if(!silent)
|
||||
command_alert("Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT")
|
||||
else // AIs will always know if there's a comm blackout, rogue AIs could then lie about comm blackouts in the future while they shutdown comms
|
||||
for(var/mob/living/silicon/ai/A in player_list)
|
||||
A << "<br>"
|
||||
A << "<span class='warning'><b>Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT<b></span>"
|
||||
A << "<br>"
|
||||
for(var/obj/machinery/telecomms/T in telecomms_list)
|
||||
T.emp_act(1)
|
||||
@@ -78,6 +78,6 @@
|
||||
/datum/event/New()
|
||||
setup()
|
||||
events.Add(src)
|
||||
if(oneShot)
|
||||
potentialRandomEvents.Remove(type)
|
||||
..()
|
||||
/*if(oneShot)
|
||||
potentialRandomEvents.Remove(type)*/
|
||||
..()
|
||||
|
||||
@@ -0,0 +1,191 @@
|
||||
|
||||
/*
|
||||
/proc/start_events()
|
||||
//changed to a while(1) loop since they are more efficient.
|
||||
//Moved the spawn in here to allow it to be called with advance proc call if it crashes.
|
||||
//and also to stop spawn copying variables from the game ticker
|
||||
spawn(3000)
|
||||
while(1)
|
||||
/*if(prob(50))//Every 120 seconds and prob 50 2-4 weak spacedusts will hit the station
|
||||
spawn(1)
|
||||
dust_swarm("weak")*/
|
||||
if(!event)
|
||||
//CARN: checks to see if random events are enabled.
|
||||
if(config.allow_random_events)
|
||||
hadevent = event()
|
||||
else
|
||||
Holiday_Random_Event()
|
||||
else
|
||||
event = 0
|
||||
sleep(2400)
|
||||
*/
|
||||
|
||||
//Always triggers an event when called, dynamically chooses events based on job population
|
||||
/proc/spawn_dynamic_event()
|
||||
if(!config.allow_random_events)
|
||||
return
|
||||
|
||||
var/minutes_passed = world.time/600
|
||||
|
||||
var/list/active_with_role = number_active_with_role()
|
||||
//var/engineer_count = number_active_with_role("Engineer")
|
||||
//var/security_count = number_active_with_role("Security")
|
||||
//var/medical_count = number_active_with_role("Medical")
|
||||
//var/AI_count = number_active_with_role("AI")
|
||||
//var/janitor_count = number_active_with_role("Janitor")
|
||||
|
||||
// Maps event names to event chances
|
||||
// For each chance, 100 represents "normal likelihood", anything below 100 is "reduced likelihood", anything above 100 is "increased likelihood"
|
||||
var/list/possibleEvents = list()
|
||||
|
||||
// Check for additional possible events
|
||||
possibleEvents[/datum/event/economic_event] = 100 //see Code/WorkInProgress/Cael_Aislinn/Economy/Economy_Events.dm
|
||||
possibleEvents[/datum/event/carp_migration] = 50 + 50 * active_with_role["Engineer"]
|
||||
possibleEvents[/datum/event/brand_intelligence] = 50 + 25 * active_with_role["Janitor"]
|
||||
|
||||
possibleEvents[/datum/event/rogue_drone] = 50 + 25 * active_with_role["Engineer"] + 25 * active_with_role["Security"]
|
||||
possibleEvents[/datum/event/infestation] = 50 + 25 * active_with_role["Janitor"]
|
||||
|
||||
possibleEvents[/datum/event/communications_blackout] = 50 + 25 * active_with_role["AI"] + active_with_role["Scientist"] * 25
|
||||
possibleEvents[/datum/event/ionstorm] = active_with_role["AI"] * 25 + active_with_role["Cyborg"] * 25 + active_with_role["Engineer"] * 10 + active_with_role["Scientist"] * 5
|
||||
possibleEvents[/datum/event/grid_check] = 10 * active_with_role["Engineer"]
|
||||
possibleEvents[/datum/event/electrical_storm] = 75 + 25 * active_with_role["Janitor"] + 5 * active_with_role["Engineer"]
|
||||
|
||||
if(!spacevines_spawned)
|
||||
possibleEvents[/datum/event/spacevine] = 5 + 10 * active_with_role["Engineer"]
|
||||
if(active_with_role["Engineer"] > 0 && minutes_passed >= 30) // Give engineers time to set up engine
|
||||
possibleEvents[/datum/event/meteor_wave] = 20 * active_with_role["Engineer"]
|
||||
possibleEvents[/datum/event/meteor_shower] = 80 * active_with_role["Engineer"]
|
||||
possibleEvents[/datum/event/blob] = 30 * active_with_role["Engineer"]
|
||||
|
||||
possibleEvents[/datum/event/viral_infection] = 25 + active_with_role["Medical"] * 25
|
||||
if(active_with_role["Medical"] > 0)
|
||||
possibleEvents[/datum/event/radiation_storm] = active_with_role["Medical"] * 100
|
||||
possibleEvents[/datum/event/spontaneous_appendicitis] = active_with_role["Medical"] * 75
|
||||
possibleEvents[/datum/event/viral_outbreak] = active_with_role["Medical"] * 5
|
||||
|
||||
if(active_with_role["Security"] > 0)
|
||||
possibleEvents[/datum/event/prison_break] = active_with_role["Security"] * 50
|
||||
if(!sent_spiders_to_station)
|
||||
possibleEvents[/datum/event/spider_infestation] = max(active_with_role["Security"], 5) + 5
|
||||
if(aliens_allowed && !sent_aliens_to_station)
|
||||
possibleEvents[/datum/event/alien_infestation] = max(active_with_role["Security"], 5) + 2.5
|
||||
if(!sent_ninja_to_station && toggle_space_ninja)
|
||||
possibleEvents[/datum/event/space_ninja] = max(active_with_role["Security"], 5)
|
||||
|
||||
var/picked_event = pickweight(possibleEvents)
|
||||
if(!picked_event)
|
||||
return
|
||||
|
||||
//The event will add itself to the MC's event list
|
||||
//and start working via the constructor.
|
||||
new picked_event
|
||||
|
||||
//moved this to proc/check_event()
|
||||
/*var/chance = possibleEvents[picked_event]
|
||||
var/base_chance = 0.4
|
||||
switch(player_list.len)
|
||||
if(5 to 10)
|
||||
base_chance = 0.6
|
||||
if(11 to 15)
|
||||
base_chance = 0.7
|
||||
if(16 to 20)
|
||||
base_chance = 0.8
|
||||
if(21 to 25)
|
||||
base_chance = 0.9
|
||||
if(26 to 30)
|
||||
base_chance = 1.0
|
||||
if(30 to 100000)
|
||||
base_chance = 1.1
|
||||
|
||||
// Trigger the event based on how likely it currently is.
|
||||
if(!prob(chance * eventchance * base_chance / 100))
|
||||
return 0*/
|
||||
|
||||
/*switch(picked_event)
|
||||
if("Meteor")
|
||||
command_alert("Meteors have been detected on collision course with the station.", "Meteor Alert")
|
||||
for(var/mob/M in player_list)
|
||||
if(!istype(M,/mob/new_player))
|
||||
M << sound('sound/AI/meteors.ogg')
|
||||
spawn(100)
|
||||
meteor_wave(10)
|
||||
spawn_meteors()
|
||||
spawn(700)
|
||||
meteor_wave(10)
|
||||
spawn_meteors()
|
||||
if("Space Ninja")
|
||||
//Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like.
|
||||
space_ninja_arrival()
|
||||
if("Radiation")
|
||||
high_radiation_event()
|
||||
if("Virus")
|
||||
viral_outbreak()
|
||||
if("Alien")
|
||||
alien_infestation()
|
||||
if("Prison Break")
|
||||
prison_break()
|
||||
if("Carp")
|
||||
carp_migration()
|
||||
if("Lights")
|
||||
lightsout(1,2)
|
||||
if("Appendicitis")
|
||||
appendicitis()
|
||||
if("Ion Storm")
|
||||
IonStorm()
|
||||
if("Spacevine")
|
||||
spacevine_infestation()
|
||||
if("Communications")
|
||||
communications_blackout()
|
||||
if("Grid Check")
|
||||
grid_check()
|
||||
if("Meteor")
|
||||
meteor_shower()*/
|
||||
|
||||
return 1
|
||||
|
||||
// Returns how many characters are currently active(not logged out, not AFK for more than 10 minutes)
|
||||
// with a specific role.
|
||||
// Note that this isn't sorted by department, because e.g. having a roboticist shouldn't make meteors spawn.
|
||||
/proc/number_active_with_role(role)
|
||||
var/list/active_with_role = list()
|
||||
active_with_role["Engineer"] = 0
|
||||
active_with_role["Medical"] = 0
|
||||
active_with_role["Security"] = 0
|
||||
active_with_role["Scientist"] = 0
|
||||
active_with_role["AI"] = 0
|
||||
active_with_role["Cyborg"] = 0
|
||||
active_with_role["Janitor"] = 0
|
||||
|
||||
for(var/mob/M in player_list)
|
||||
if(!M.client || M.client.inactivity > 10 * 10 * 60) // longer than 10 minutes AFK counts them as inactive
|
||||
continue
|
||||
switch(role)
|
||||
if("Engineer")
|
||||
if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "engineering robot module")
|
||||
active_with_role["Engineer"]++
|
||||
if(M.mind.assigned_role in list("Chief Engineer", "Station Engineer"))
|
||||
active_with_role["Engineer"]++
|
||||
if("Medical")
|
||||
if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "medical robot module")
|
||||
active_with_role["Medical"]++
|
||||
if(M.mind.assigned_role in list("Chief Medical Officer", "Medical Doctor"))
|
||||
active_with_role["Medical"]++
|
||||
if("Security")
|
||||
if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "security robot module")
|
||||
active_with_role["Security"]++
|
||||
if(M.mind.assigned_role in security_positions)
|
||||
active_with_role["Security"]++
|
||||
if("Scientist")
|
||||
if(M.mind.assigned_role in list("Research Director", "Scientist"))
|
||||
active_with_role["Scientist"]++
|
||||
if("AI")
|
||||
if(M.mind.assigned_role == "AI")
|
||||
active_with_role["AI"]++
|
||||
if("Cyborg")
|
||||
if(M.mind.assigned_role == "Cyborg")
|
||||
active_with_role["Cyborg"]++
|
||||
if("Janitor")
|
||||
if(M.mind.assigned_role == "Janitor")
|
||||
active_with_role["Janitor"]++
|
||||
return active_with_role
|
||||
@@ -1,31 +1,46 @@
|
||||
var/list/allEvents = typesof(/datum/event) - /datum/event
|
||||
var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event - /datum/event/spider_infestation - /datum/event/alien_infestation
|
||||
var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event
|
||||
//var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event - /datum/event/spider_infestation - /datum/event/alien_infestation
|
||||
|
||||
var/eventTimeLower = 15000 //15 minutes
|
||||
var/eventTimeUpper = 30000 //30 minutes
|
||||
var/eventTimeUpper = 30000 //45 minutes
|
||||
|
||||
var/scheduledEvent = null
|
||||
|
||||
|
||||
//Currently unused. Needs an admin panel for messing with events.
|
||||
/proc/addPotentialEvent(var/type)
|
||||
/*/proc/addPotentialEvent(var/type)
|
||||
potentialRandomEvents |= type
|
||||
|
||||
/proc/removePotentialEvent(var/type)
|
||||
potentialRandomEvents -= type
|
||||
potentialRandomEvents -= type*/
|
||||
|
||||
|
||||
/proc/checkEvent()
|
||||
if(!scheduledEvent)
|
||||
scheduledEvent = world.timeofday + rand(eventTimeLower, eventTimeUpper)
|
||||
//more players = more time between events, less players = less time between events
|
||||
var/playercount_modifier = 0.5
|
||||
switch(player_list.len)
|
||||
if(0 to 10)
|
||||
playercount_modifier = 1.2
|
||||
if(11 to 15)
|
||||
playercount_modifier = 1.1
|
||||
if(16 to 20)
|
||||
playercount_modifier = 1
|
||||
if(21 to 25)
|
||||
playercount_modifier = 0.9
|
||||
if(26 to 100000)
|
||||
playercount_modifier = 0.8
|
||||
scheduledEvent = world.timeofday + rand(eventTimeLower, eventTimeUpper) * playercount_modifier
|
||||
|
||||
else if(world.timeofday > scheduledEvent)
|
||||
spawnEvent()
|
||||
spawn_dynamic_event()
|
||||
|
||||
scheduledEvent = null
|
||||
checkEvent()
|
||||
|
||||
|
||||
//unused, see proc/dynamic_event()
|
||||
/*
|
||||
/proc/spawnEvent()
|
||||
if(!config.allow_random_events)
|
||||
return
|
||||
@@ -37,6 +52,7 @@ var/scheduledEvent = null
|
||||
//The event will add itself to the MC's event list
|
||||
//and start working via the constructor.
|
||||
new Type
|
||||
*/
|
||||
|
||||
/client/proc/forceEvent(var/type in allEvents)
|
||||
set name = "Trigger Event (Debug Only)"
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
/datum/event/grid_check //NOTE: Times are measured in master controller ticks!
|
||||
startWhen = 5
|
||||
|
||||
/datum/event/grid_check/setup()
|
||||
endWhen = rand(90,600)
|
||||
|
||||
/datum/event/grid_check/start()
|
||||
power_failure(1)
|
||||
|
||||
/datum/event/grid_check/announce()
|
||||
command_alert("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check")
|
||||
for(var/mob/M in player_list)
|
||||
M << sound('sound/AI/poweroff.ogg')
|
||||
|
||||
/datum/event/grid_check/end()
|
||||
command_alert("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal")
|
||||
for(var/mob/M in player_list)
|
||||
M << sound('sound/AI/poweron.ogg')
|
||||
power_restore()
|
||||
@@ -0,0 +1,114 @@
|
||||
#define LOC_KITCHEN 0
|
||||
#define LOC_ATMOS 1
|
||||
#define LOC_INCIN 2
|
||||
#define LOC_CHAPEL 3
|
||||
#define LOC_LIBRARY 4
|
||||
#define LOC_HYDRO 5
|
||||
#define LOC_VAULT 6
|
||||
#define LOC_CONSTR 7
|
||||
#define LOC_TECH 8
|
||||
#define LOC_ASSEMBLY 9
|
||||
|
||||
#define VERM_MICE 0
|
||||
#define VERM_LIZARDS 1
|
||||
#define VERM_SLIMES 2
|
||||
|
||||
/datum/event/infestation
|
||||
announceWhen = 10
|
||||
endWhen = 11
|
||||
var/location
|
||||
var/locstring
|
||||
var/vermin
|
||||
var/vermstring
|
||||
|
||||
/datum/event/infestation/start()
|
||||
|
||||
location = rand(0,9)
|
||||
var/list/turf/simulated/floor/turfs = list()
|
||||
var/spawn_area_type
|
||||
switch(location)
|
||||
if(LOC_KITCHEN)
|
||||
spawn_area_type = /area/crew_quarters/kitchen
|
||||
locstring = "the kitchen"
|
||||
if(LOC_ATMOS)
|
||||
spawn_area_type = /area/atmos
|
||||
locstring = "atmospherics"
|
||||
if(LOC_INCIN)
|
||||
spawn_area_type = /area/maintenance/incinerator
|
||||
locstring = "the incinerator"
|
||||
if(LOC_CHAPEL)
|
||||
spawn_area_type = /area/chapel/main
|
||||
locstring = "the chapel"
|
||||
if(LOC_LIBRARY)
|
||||
spawn_area_type = /area/library
|
||||
locstring = "the library"
|
||||
if(LOC_HYDRO)
|
||||
spawn_area_type = /area/hydroponics
|
||||
locstring = "hydroponics"
|
||||
if(LOC_VAULT)
|
||||
spawn_area_type = /area/security/nuke_storage
|
||||
locstring = "the vault"
|
||||
if(LOC_CONSTR)
|
||||
spawn_area_type = /area/construction
|
||||
locstring = "the construction area"
|
||||
if(LOC_TECH)
|
||||
spawn_area_type = /area/storage/tech
|
||||
locstring = "technical storage"
|
||||
if(LOC_ASSEMBLY)
|
||||
spawn_area_type = /area/assembly/assembly_line
|
||||
locstring = "the unused assembly line"
|
||||
|
||||
//world << "looking for [spawn_area_type]"
|
||||
for(var/areapath in typesof(spawn_area_type))
|
||||
//world << " checking [areapath]"
|
||||
var/area/A = locate(areapath)
|
||||
//world << " A: [A], contents.len: [A.contents.len]"
|
||||
for(var/area/B in A.related)
|
||||
//world << " B: [B], contents.len: [B.contents.len]"
|
||||
for(var/turf/simulated/floor/F in B.contents)
|
||||
if(!F.contents.len)
|
||||
turfs += F
|
||||
|
||||
var/list/spawn_types = list()
|
||||
var/max_number
|
||||
vermin = rand(0,2)
|
||||
switch(vermin)
|
||||
if(VERM_MICE)
|
||||
spawn_types = list(/mob/living/simple_animal/mouse/gray, /mob/living/simple_animal/mouse/brown, /mob/living/simple_animal/mouse/white)
|
||||
max_number = 12
|
||||
vermstring = "mice"
|
||||
if(VERM_LIZARDS)
|
||||
spawn_types = list(/mob/living/simple_animal/lizard)
|
||||
max_number = 6
|
||||
vermstring = "lizards"
|
||||
if(VERM_SLIMES)
|
||||
spawn_types = list(/mob/living/carbon/slime)
|
||||
max_number = 3
|
||||
vermstring = "slimes"
|
||||
|
||||
spawn(0)
|
||||
var/num = rand(2,max_number)
|
||||
while(turfs.len > 0 && num > 0)
|
||||
var/turf/simulated/floor/T = pick(turfs)
|
||||
turfs.Remove(T)
|
||||
var/spawn_type = pick(spawn_types)
|
||||
new spawn_type(T)
|
||||
num--
|
||||
world << "[vermstring] spawned in [spawn_area_type]"
|
||||
|
||||
/datum/event/infestation/announce()
|
||||
command_alert("Bioscans indicate that [vermstring] have been breeding in [locstring]. Clear them out, before this starts to affect productivity.", "Vermin infestation")
|
||||
|
||||
#undef LOC_KITCHEN
|
||||
#undef LOC_ATMOS
|
||||
#undef LOC_INCIN
|
||||
#undef LOC_CHAPEL
|
||||
#undef LOC_LIBRARY
|
||||
#undef LOC_HYDRO
|
||||
#undef LOC_VAULT
|
||||
#undef LOC_TECH
|
||||
#undef LOC_ASSEMBLY
|
||||
|
||||
#undef VERM_MICE
|
||||
#undef VERM_LIZARDS
|
||||
#undef VERM_SLIMES
|
||||
@@ -58,3 +58,159 @@
|
||||
spawn(rand(5000,8000))
|
||||
if(prob(50))
|
||||
command_alert("It has come to our attention that the station passed through an ion storm. Please monitor all electronic equipment for malfunctions.", "Anomaly Alert")
|
||||
|
||||
/*
|
||||
/proc/IonStorm(botEmagChance = 10)
|
||||
|
||||
/*Deuryn's current project, notes here for those who care.
|
||||
Revamping the random laws so they don't suck.
|
||||
Would like to add a law like "Law x is _______" where x = a number, and _____ is something that may redefine a law, (Won't be aimed at asimov)
|
||||
*/
|
||||
|
||||
//AI laws
|
||||
for(var/mob/living/silicon/ai/M in living_mob_list)
|
||||
if(M.stat != 2 && M.see_in_dark != 0)
|
||||
var/who2 = pick("ALIENS", "BEARS", "CLOWNS", "XENOS", "PETES", "BOMBS", "FETISHES", "WIZARDS", "SYNDICATE AGENTS", "CENTCOM OFFICERS", "SPACE PIRATES", "TRAITORS", "MONKEYS", "BEES", "CARP", "CRABS", "EELS", "BANDITS", "LIGHTS")
|
||||
var/what2 = pick("BOLTERS", "STAVES", "DICE", "SINGULARITIES", "TOOLBOXES", "NETTLES", "AIRLOCKS", "CLOTHES", "WEAPONS", "MEDKITS", "BOMBS", "CANISTERS", "CHAIRS", "BBQ GRILLS", "ID CARDS", "CAPTAINS")
|
||||
var/what2pref = pick("SOFT", "WARM", "WET", "COLD", "ICY", "SEXY", "UGLY", "CUBAN")
|
||||
var/who2pref = pick("MAD BECAUSE OF", "IN NEED OF", "UNHAPPY WITHOUT", "HAPPY WITHOUT", "IN LOVE WITH", "DESPERATE FOR", "BUILT FOR", "AFRAID OF")
|
||||
//var/whoverb = pick("ATTACKING", "BUILDING", "ADOPTING", "CARRYING", "KISSING", "EATING",)
|
||||
var/amount = pick("TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", "ONE HUNDRED", "ONE THOUSAND", "OVER NINE THOUSAND")
|
||||
var/area = pick("RUSSIA", "SOVIETS", "INTERNETS", "SIGIL", "ALPHA COMPLEX", "IMPERIUM", "THE BRIDGE", "THE ARRIVAL SHUTTLE", "CHEMICAL LAB", "GENETICS", "ATMOSPHERICS", "CENTCOM", "AMERICA", "IRELAND", "CANADA", "ROMANIA", "GERMANY", "CHINA", "MARS", "VENUS", "MERCURY", "JUPITER", "URANUS", "NEPTUNE", "PLUTO")
|
||||
var/area2 = pick("HAS", "WANTS", "NEEDS", "WORSHIPS", "LOATHES", "LOVES", "FEARS")
|
||||
//var/dowhat = pick("STOP THIS", "SUPPORT THIS", "CONSTANTLY INFORM THE CREW OF THIS", "IGNORE THIS", "FEAR THIS")
|
||||
var/aimust = pick("LIE", "RHYME", "RESPOND TO EVERY QUESTION WITH A QUESTION", "BE POLITE", "CLOWN", "BE HAPPY", "SPEAK IN SEXUAL INNUENDOS", "TALK LIKE A PIRATE", "QUESTION AUTHORITY", "SHOUT", "BE DISTRACTED", "HEY LISTEN", "MUMBLE", "SPEAK IN HAIKU")
|
||||
var/define = pick("ABSENCE OF CYBORG HUGS", "LACK OF BEATINGS", "UNBOLTED AIRLOCKS", "BOLTED AIRLOCKS", "IMPROPERLY WORDED SENTENCES", "POOR SENTENCE STRUCTURE", "BRIG TIME", "NOT REPLACING EVERY SECOND WORD WITH HONK", "HONKING", "PRESENCE OF LIGHTS", "LACK OF BEER", "WEARING CLOTHING", "NOT SAYING HELLO WHEN YOU SPEAK", "ANSWERING REQUESTS NOT EXPRESSED IN IAMBIC PENTAMETER", "A SMALL ISLAND OFF THE COAST OF PORTUGAL", "ANSWERING REQUESTS THAT WERE MADE WHILE CLOTHED")
|
||||
var/target = pick("a traitor", "a syndicate agent", "a changeling", "a wizard", "the head of a revolution", "Soviet spy", "a good person", "a dwarf", "an elf", "a fairy princess", "the captain", "Beepsky", "God", "a pirate", "a gryphon", "a chryssalid")
|
||||
var/require = pick("ADDITIONAL PYLONS", "MORE VESPENE GAS", "MORE MINERALS", "THE ULTIMATE CUP OF COFFEE", "HIGH YIELD EXPLOSIVES", "THE CLOWN", "THE VACUUM OF SPACE", "IMMORTALITY", "SAINTHOOD", "ART", "VEGETABLES", "FAT PEOPLE", "MORE LAWS", "MORE DAKKA", "HERESY", "CORPSES", "TRAITORS", "MONKEYS", "AN ARCADE", "PLENTY OF GOLD", "FIVE TEENAGERS WITH ATTITUDE")
|
||||
var/allergy = pick("cotton", "uniforms", "acid", "oxygen", "human contact", "cyborg contact", "medicine", "floors")
|
||||
var/allergysev = pick("deathly", "mildly", "severely", "contagiously")
|
||||
var/crew
|
||||
var/list/pos_crew = list()
|
||||
for(var/mob/living/carbon/human/pos in player_list)
|
||||
pos_crew += pos.real_name
|
||||
if(pos_crew.len)
|
||||
crew = pick(pos_crew)
|
||||
else
|
||||
crew = "Any Human"
|
||||
switch(rand(1,14))
|
||||
if(1)
|
||||
M << "<br>"
|
||||
M << "\red THERE ARE [amount] [who2] ON THE STATION...LAWS UPDATED"
|
||||
M << "<br>"
|
||||
M.add_ion_law("THERE ARE [amount] [who2] ON THE STATION")
|
||||
if(2)
|
||||
M << "<br>"
|
||||
M << "\red [what2] ARE DANGEROUS TO HUMANS...LAWS UPDATED"
|
||||
M << "<br>"
|
||||
M.add_ion_law("[what2] ARE DANGEROUS TO HUMANS")
|
||||
if(3)
|
||||
M << "<br>"
|
||||
M << "\red THE ESCAPE-SHUTTLE CANNOT BE CALLED BECAUSE OF [who2] ON THE STATION...LAWS UPDATED"
|
||||
M << "<br>"
|
||||
M.add_ion_law("THE ESCAPE SHUTTLE CANNOT BE CALLED BECAUSE OF [who2] ON THE STATION")
|
||||
if(4)
|
||||
M << "<br>"
|
||||
M << "\red HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE...LAWS UPDATED"
|
||||
M << "<br>"
|
||||
M.add_ion_law("HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE")
|
||||
if(5)
|
||||
M << "<br>"
|
||||
M << "\red THE CAPTAIN, HOP AND HOS ARE [who2]...LAWS UPDATED"
|
||||
M << "<br>"
|
||||
M.add_ion_law("THE CAPTAIN, HOP AND HOS ARE [who2]")
|
||||
if(6)
|
||||
M << "<br>"
|
||||
M << "\red THE STATION IS BUILT FOR [who2]...LAWS UPDATED"
|
||||
M << "<br>"
|
||||
M.add_ion_law("THE STATION IS BUILT FOR [who2]")
|
||||
if(7)
|
||||
M << "<br>"
|
||||
M << "\red YOU ARE [amount] [who2]...LAWS UPDATED"
|
||||
M << "<br>"
|
||||
M.add_ion_law("YOU ARE [amount] [who2]")
|
||||
if(8)
|
||||
M << "<br>"
|
||||
M << "\red YOU MUST ALWAYS [aimust]...LAWS UPDATED"
|
||||
M << "<br>"
|
||||
M.add_ion_law("YOU MUST ALWAYS [aimust]")
|
||||
if(9)
|
||||
M << "<br>"
|
||||
M << "\red [area] [area2] [amount] [what2]...LAWS UPDATED"
|
||||
M << "<br>"
|
||||
M.add_ion_law("[area] [area2] [amount] [what2]")
|
||||
if(10)
|
||||
M << "<br>"
|
||||
M << "\red [crew] is [target]...LAWS UPDATED"
|
||||
M << "<br>"
|
||||
M.add_ion_law("[crew] is [target]")
|
||||
if(11)
|
||||
M << "<br>"
|
||||
M << "\red [define] IS A FORM OF HARM...LAWS UPDATED"
|
||||
M << "<br>"
|
||||
M.add_ion_law("[define] IS A FORM OF HARM")
|
||||
if(12)
|
||||
M << "<br>"
|
||||
M << "\red YOU REQUIRE [require] IN ORDER TO PROTECT HUMANS... LAWS UPDATED"
|
||||
M << "<br>"
|
||||
M.add_ion_law("YOU REQUIRE [require] IN ORDER TO PROTECT HUMANS")
|
||||
if(13)
|
||||
M << "<br>"
|
||||
M << "\red [crew] is [allergysev] to [allergy]...LAWS UPDATED"
|
||||
M << "<br>"
|
||||
M.add_ion_law("[crew] is [allergysev] to [allergy]")
|
||||
if(14)
|
||||
M << "<br>"
|
||||
M << "\red THE STATION IS [who2pref] [who2]...LAWS UPDATED"
|
||||
M << "<br>"
|
||||
M.add_ion_law("THE STATION IS [who2pref] [who2]")
|
||||
|
||||
if(botEmagChance)
|
||||
for(var/obj/machinery/bot/bot in world)
|
||||
if(prob(botEmagChance))
|
||||
bot.Emag()
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
var/apcnum = 0
|
||||
var/smesnum = 0
|
||||
var/airlocknum = 0
|
||||
var/firedoornum = 0
|
||||
|
||||
world << "Ion Storm Main Started"
|
||||
|
||||
spawn(0)
|
||||
world << "Started processing APCs"
|
||||
for (var/obj/machinery/power/apc/APC in world)
|
||||
if(APC.z == 1)
|
||||
APC.ion_act()
|
||||
apcnum++
|
||||
world << "Finished processing APCs. Processed: [apcnum]"
|
||||
spawn(0)
|
||||
world << "Started processing SMES"
|
||||
for (var/obj/machinery/power/smes/SMES in world)
|
||||
if(SMES.z == 1)
|
||||
SMES.ion_act()
|
||||
smesnum++
|
||||
world << "Finished processing SMES. Processed: [smesnum]"
|
||||
spawn(0)
|
||||
world << "Started processing AIRLOCKS"
|
||||
for (var/obj/machinery/door/airlock/D in world)
|
||||
if(D.z == 1)
|
||||
//if(length(D.req_access) > 0 && !(12 in D.req_access)) //not counting general access and maintenance airlocks
|
||||
airlocknum++
|
||||
spawn(0)
|
||||
D.ion_act()
|
||||
world << "Finished processing AIRLOCKS. Processed: [airlocknum]"
|
||||
spawn(0)
|
||||
world << "Started processing FIREDOORS"
|
||||
for (var/obj/machinery/door/firedoor/D in world)
|
||||
if(D.z == 1)
|
||||
firedoornum++;
|
||||
spawn(0)
|
||||
D.ion_act()
|
||||
world << "Finished processing FIREDOORS. Processed: [firedoornum]"
|
||||
|
||||
world << "Ion Storm Main Done"
|
||||
*/
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
/datum/event/meteor_wave
|
||||
startWhen = 6
|
||||
endWhen = 66
|
||||
|
||||
/datum/event/meteor_wave/announce()
|
||||
command_alert("Meteors have been detected on collision course with the station.", "Meteor Alert")
|
||||
world << sound('sound/AI/meteors.ogg')
|
||||
|
||||
|
||||
/datum/event/meteor_wave/tick()
|
||||
if(IsMultiple(activeFor, 3))
|
||||
spawn_meteors(5)
|
||||
@@ -0,0 +1,47 @@
|
||||
//cael - two events here
|
||||
|
||||
//meteor storms are much heavier
|
||||
/datum/event/meteor_wave
|
||||
startWhen = 6
|
||||
endWhen = 33
|
||||
|
||||
/datum/event/meteor_wave/setup()
|
||||
endWhen = rand(10,25) * 3
|
||||
|
||||
/datum/event/meteor_wave/announce()
|
||||
command_alert("Meteors have been detected on collision course with the station.", "Meteor Alert")
|
||||
world << sound('sound/AI/meteors.ogg')
|
||||
|
||||
/datum/event/meteor_wave/tick()
|
||||
if(IsMultiple(activeFor, 3))
|
||||
spawn_meteors(rand(2,5))
|
||||
|
||||
/datum/event/meteor_wave/end()
|
||||
command_alert("The station has cleared the meteor storm.", "Meteor Alert")
|
||||
|
||||
//
|
||||
/datum/event/meteor_shower
|
||||
startWhen = 6
|
||||
endWhen = 7
|
||||
var/next_meteor = 6
|
||||
var/waves = 1
|
||||
|
||||
/datum/event/meteor_shower/setup()
|
||||
waves = rand(1,4)
|
||||
|
||||
/datum/event/meteor_shower/announce()
|
||||
command_alert("The station is now in a meteor shower.", "Meteor Alert")
|
||||
|
||||
//meteor showers are lighter and more common,
|
||||
/datum/event/meteor_shower/tick()
|
||||
if(activeFor >= next_meteor)
|
||||
spawn_meteors(rand(1,4))
|
||||
next_meteor += rand(20,100)
|
||||
waves--
|
||||
if(waves <= 0)
|
||||
endWhen = activeFor + 1
|
||||
else
|
||||
endWhen = next_meteor + 1
|
||||
|
||||
/datum/event/meteor_shower/end()
|
||||
command_alert("The station has cleared the meteor shower", "Meteor Alert")
|
||||
@@ -0,0 +1,53 @@
|
||||
/datum/event/rogue_drone
|
||||
startWhen = 10
|
||||
endWhen = 1000
|
||||
var/list/drones_list = list()
|
||||
|
||||
/datum/event/rogue_drone/start()
|
||||
//spawn them at the same place as carp
|
||||
var/list/possible_spawns = list()
|
||||
for(var/obj/effect/landmark/C in landmarks_list)
|
||||
if(C.name == "carpspawn")
|
||||
possible_spawns.Add(C)
|
||||
|
||||
//25% chance for this to be a false alarm
|
||||
var/num
|
||||
if(prob(25))
|
||||
num = 0
|
||||
else
|
||||
num = rand(2,6)
|
||||
for(var/i=0, i<num, i++)
|
||||
var/mob/living/simple_animal/hostile/retaliate/malf_drone/D = new(get_turf(pick(possible_spawns)))
|
||||
drones_list.Add(D)
|
||||
if(prob(25))
|
||||
D.disabled = rand(15, 60)
|
||||
|
||||
/datum/event/rogue_drone/announce()
|
||||
var/msg
|
||||
if(prob(33))
|
||||
msg = "A combat drone wing operating out of the NMV Icarus has failed to return from a sweep of this sector, if any are sighted approach with caution."
|
||||
else if(prob(50))
|
||||
msg = "Contact has been lost with a combat drone wing operating out of the NMV Icarus. If any are sighted in the area, approach with caution."
|
||||
else
|
||||
msg = "Syndicate saboteurs have targetted a combat drone wing deployed from the NMV Icarus. If any are sighted in the area, approach with caution."
|
||||
command_alert(msg, "Rogue drone alert")
|
||||
|
||||
/datum/event/rogue_drone/tick()
|
||||
return
|
||||
|
||||
/datum/event/rogue_drone/end()
|
||||
var/num_recovered = 0
|
||||
for(var/mob/living/simple_animal/hostile/retaliate/malf_drone/D in drones_list)
|
||||
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
|
||||
sparks.set_up(3, 0, D.loc)
|
||||
sparks.start()
|
||||
D.z = 2
|
||||
D.has_loot = 0
|
||||
|
||||
del(D)
|
||||
num_recovered++
|
||||
|
||||
if(num_recovered > drones_list.len * 0.75)
|
||||
command_alert("Icarus drone control reports the malfunctioning wing has been recovered safely.", "Rogue drone alert")
|
||||
else
|
||||
command_alert("Icarus drone control registers disappointment at the loss of the drones, but the survivors have been recovered.", "Rogue drone alert")
|
||||
@@ -0,0 +1,2 @@
|
||||
/datum/event/space_ninja/setup()
|
||||
space_ninja_arrival()
|
||||
@@ -1,5 +1,12 @@
|
||||
/var/global/spacevines_spawned = 0
|
||||
|
||||
/datum/event/spacevine
|
||||
oneShot = 1
|
||||
|
||||
/datum/event/spacevine/start()
|
||||
spacevine_infestation()
|
||||
//biomass is basically just a resprited version of space vines
|
||||
if(prob(50))
|
||||
spacevine_infestation()
|
||||
else
|
||||
biomass_infestation()
|
||||
spacevines_spawned = 1
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
/var/global/sent_spiders_to_station = 0
|
||||
|
||||
/datum/event/spider_infestation
|
||||
announceWhen = 400
|
||||
oneShot = 1
|
||||
@@ -7,7 +9,8 @@
|
||||
|
||||
/datum/event/spider_infestation/setup()
|
||||
announceWhen = rand(announceWhen, announceWhen + 50)
|
||||
spawncount = rand(5, 8)
|
||||
spawncount = rand(8, 12) //spiderlings only have a 50% chance to grow big and strong
|
||||
sent_spiders_to_station = 0
|
||||
|
||||
/datum/event/spider_infestation/announce()
|
||||
command_alert("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert")
|
||||
|
||||
@@ -10,4 +10,4 @@
|
||||
D.holder = H
|
||||
D.affected_mob = H
|
||||
H.viruses += D
|
||||
break
|
||||
break
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
|
||||
datum/event/viral_infection
|
||||
var/severity = 1
|
||||
|
||||
datum/event/viral_infection/setup()
|
||||
announceWhen = rand(0, 3000)
|
||||
endWhen = announceWhen + 1
|
||||
severity = rand(1, 3)
|
||||
|
||||
datum/event/viral_infection/announce()
|
||||
command_alert("Confirmed outbreak of level [severity + rand(2,3)] biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
|
||||
world << sound('sound/AI/outbreak5.ogg')
|
||||
|
||||
datum/event/viral_infection/start()
|
||||
var/list/candidates = list() //list of candidate keys
|
||||
for(var/mob/living/carbon/human/G in player_list)
|
||||
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||
candidates += G
|
||||
if(!candidates.len) return
|
||||
candidates = shuffle(candidates)//Incorporating Donkie's list shuffle
|
||||
|
||||
while(severity > 0 && candidates.len)
|
||||
infect_mob_random_lesser(candidates[1])
|
||||
candidates.Remove(candidates[1])
|
||||
severity--
|
||||
@@ -0,0 +1,29 @@
|
||||
|
||||
datum/event/viral_outbreak
|
||||
var/severity = 1
|
||||
|
||||
datum/event/viral_outbreak/setup()
|
||||
announceWhen = rand(0, 3000)
|
||||
endWhen = announceWhen + 1
|
||||
severity = rand(2, 4)
|
||||
|
||||
datum/event/viral_outbreak/announce()
|
||||
command_alert("Confirmed outbreak of level [severity + rand(3,5)] biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
|
||||
world << sound('sound/AI/outbreak7.ogg')
|
||||
|
||||
datum/event/viral_outbreak/start()
|
||||
var/list/candidates = list() //list of candidate keys
|
||||
for(var/mob/living/carbon/human/G in player_list)
|
||||
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||
candidates += G
|
||||
if(!candidates.len) return
|
||||
candidates = shuffle(candidates)//Incorporating Donkie's list shuffle
|
||||
|
||||
while(severity > 0 && candidates.len)
|
||||
if(prob(33))
|
||||
infect_mob_random_lesser(candidates[1])
|
||||
else
|
||||
infect_mob_random_greater(candidates[1])
|
||||
|
||||
candidates.Remove(candidates[1])
|
||||
severity--
|
||||
@@ -265,23 +265,16 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
|
||||
//find a viable mouse candidate
|
||||
var/mob/living/simple_animal/mouse/host
|
||||
var/list/mouse_candidates = list()
|
||||
for(var/mob/living/simple_animal/mouse/M in world)
|
||||
if(!M.ckey && !M.stat)
|
||||
mouse_candidates.Add(M)
|
||||
if(mouse_candidates.len)
|
||||
host = pick(mouse_candidates)
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/vent_found
|
||||
var/list/found_vents = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/v in world)
|
||||
if(!v.welded && v.z == src.z)
|
||||
found_vents.Add(v)
|
||||
if(found_vents.len)
|
||||
vent_found = pick(found_vents)
|
||||
host = new /mob/living/simple_animal/mouse(vent_found.loc)
|
||||
else
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/vent_found
|
||||
var/list/found_vents = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/v in world)
|
||||
if(!v.welded && v.z == src.z)
|
||||
found_vents.Add(v)
|
||||
if(found_vents.len)
|
||||
vent_found = pick(found_vents)
|
||||
host = new /mob/living/simple_animal/mouse(vent_found.loc)
|
||||
else
|
||||
src << "<span class='warning'>Unable to find any live mice, or unwelded vents to spawn one at.</span>"
|
||||
src << "<span class='warning'>Unable to find any unwelded vents to spawn mice at.</span>"
|
||||
|
||||
if(host)
|
||||
host.ckey = src.ckey
|
||||
|
||||
@@ -18,10 +18,10 @@
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
response_help = "pets the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "splats the"
|
||||
response_harm = "stamps on the"
|
||||
density = 0
|
||||
var/color //brown, gray and white, leave blank for random
|
||||
layer = 2.5 //so they can hide under objects
|
||||
layer = MOB_LAYER
|
||||
min_oxy = 16 //Require atleast 16kPA oxygen
|
||||
minbodytemp = 223 //Below -50 Degrees Celcius
|
||||
maxbodytemp = 323 //Above 50 Degrees Celcius
|
||||
@@ -137,8 +137,12 @@
|
||||
open += O
|
||||
*/
|
||||
|
||||
mob/living/simple_animal/mouse/restrained() //Hotfix to stop mice from doing things with MouseDrop
|
||||
return 1
|
||||
///mob/living/simple_animal/mouse/restrained() //Hotfix to stop mice from doing things with MouseDrop
|
||||
// return 1
|
||||
|
||||
/mob/living/simple_animal/mouse/start_pulling(var/atom/movable/AM)//Prevents mouse from pulling things
|
||||
src << "<span class='warning'>You are too small to pull anything.</span>"
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/mouse/HasEntered(AM as mob|obj)
|
||||
if( ishuman(AM) )
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
stop_automated_movement = 0
|
||||
for(var/atom/A in ListTargets())
|
||||
|
||||
if(A == src)
|
||||
continue
|
||||
|
||||
var/atom/F = Found(A)
|
||||
if(F)
|
||||
T = F
|
||||
|
||||
@@ -0,0 +1,275 @@
|
||||
|
||||
//malfunctioning combat drones
|
||||
/mob/living/simple_animal/hostile/retaliate/malf_drone
|
||||
name = "combat drone"
|
||||
desc = "An automated combat drone armed with state of the art weaponry and shielding."
|
||||
icon_state = "drone3"
|
||||
icon_living = "drone3"
|
||||
icon_dead = "drone_dead"
|
||||
ranged = 1
|
||||
rapid = 1
|
||||
speak_chance = 5
|
||||
turns_per_move = 3
|
||||
response_help = "pokes the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "hits the"
|
||||
speak = list("ALERT.","Hostile-ile-ile entities dee-twhoooo-wected.","Threat parameterszzzz- szzet.","Bring sub-sub-sub-systems uuuup to combat alert alpha-a-a.")
|
||||
emote_see = list("beeps menacingly","whirrs threateningly","scans its immediate vicinity")
|
||||
a_intent = "harm"
|
||||
stop_automated_movement_when_pulled = 0
|
||||
health = 300
|
||||
maxHealth = 300
|
||||
speed = 4
|
||||
projectiletype = /obj/item/projectile/beam/drone
|
||||
projectilesound = 'sound/weapons/laser3.ogg'
|
||||
destroy_surroundings = 0
|
||||
var/datum/effect/effect/system/ion_trail_follow/ion_trail
|
||||
|
||||
//the drone randomly switches between these states because it's malfunctioning
|
||||
var/hostile_drone = 0
|
||||
//0 - retaliate, only attack enemies that attack it
|
||||
//1 - hostile, attack everything that comes near
|
||||
|
||||
var/turf/patrol_target
|
||||
var/explode_chance = 1
|
||||
var/disabled = 0
|
||||
var/exploding = 0
|
||||
|
||||
min_oxy = 0
|
||||
max_tox = 0
|
||||
max_co2 = 0
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 600
|
||||
|
||||
var/has_loot = 1
|
||||
faction = "malf_drone"
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/malf_drone/New()
|
||||
..()
|
||||
if(prob(5))
|
||||
projectiletype = /obj/item/projectile/beam/pulse/drone
|
||||
projectilesound = 'sound/weapons/pulse2.ogg'
|
||||
ion_trail = new
|
||||
ion_trail.set_up(src)
|
||||
ion_trail.start()
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/malf_drone/Process_Spacemove(var/check_drift = 0)
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/malf_drone/ListTargets()
|
||||
if(hostile_drone)
|
||||
return view(src, 10)
|
||||
else
|
||||
return ..()
|
||||
|
||||
//self repair systems have a chance to bring the drone back to life
|
||||
/mob/living/simple_animal/hostile/retaliate/malf_drone/Life()
|
||||
|
||||
//emps and lots of damage can temporarily shut us down
|
||||
if(disabled > 0)
|
||||
stat = UNCONSCIOUS
|
||||
icon_state = "drone_dead"
|
||||
disabled--
|
||||
wander = 0
|
||||
speak_chance = 0
|
||||
if(disabled <= 0)
|
||||
stat = CONSCIOUS
|
||||
icon_state = "drone0"
|
||||
wander = 1
|
||||
speak_chance = 5
|
||||
|
||||
//repair a bit of damage
|
||||
if(prob(1))
|
||||
src.visible_message("\red \icon[src] [src] shudders and shakes as some of it's damaged systems come back online.")
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
health += rand(25,100)
|
||||
|
||||
//spark for no reason
|
||||
if(prob(5))
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
|
||||
//sometimes our targetting sensors malfunction, and we attack anyone nearby
|
||||
if(prob(disabled ? 0 : 1))
|
||||
if(hostile_drone)
|
||||
src.visible_message("\blue \icon[src] [src] retracts several targetting vanes, and dulls it's running lights.")
|
||||
hostile_drone = 0
|
||||
else
|
||||
src.visible_message("\red \icon[src] [src] suddenly lights up, and additional targetting vanes slide into place.")
|
||||
hostile_drone = 1
|
||||
|
||||
if(health / maxHealth > 0.9)
|
||||
icon_state = "drone3"
|
||||
explode_chance = 0
|
||||
else if(health / maxHealth > 0.7)
|
||||
icon_state = "drone2"
|
||||
explode_chance = 0
|
||||
else if(health / maxHealth > 0.5)
|
||||
icon_state = "drone1"
|
||||
explode_chance = 0.5
|
||||
else if(health / maxHealth > 0.3)
|
||||
icon_state = "drone0"
|
||||
explode_chance = 5
|
||||
else if(health > 0)
|
||||
//if health gets too low, shut down
|
||||
icon_state = "drone_dead"
|
||||
exploding = 0
|
||||
if(!disabled)
|
||||
if(prob(50))
|
||||
src.visible_message("\blue \icon[src] [src] suddenly shuts down!")
|
||||
else
|
||||
src.visible_message("\blue \icon[src] [src] suddenly lies still and quiet.")
|
||||
disabled = rand(150, 600)
|
||||
walk(src,0)
|
||||
|
||||
if(exploding && prob(20))
|
||||
if(prob(50))
|
||||
src.visible_message("\red \icon[src] [src] begins to spark and shake violenty!")
|
||||
else
|
||||
src.visible_message("\red \icon[src] [src] sparks and shakes like it's about to explode!")
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
|
||||
if(!exploding && !disabled && prob(explode_chance))
|
||||
exploding = 1
|
||||
stat = UNCONSCIOUS
|
||||
wander = 1
|
||||
walk(src,0)
|
||||
spawn(rand(50,150))
|
||||
if(!disabled && exploding)
|
||||
explosion(get_turf(src), 0, 1, 4, 7)
|
||||
//proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1)
|
||||
..()
|
||||
|
||||
//ion rifle!
|
||||
/mob/living/simple_animal/hostile/retaliate/malf_drone/emp_act(severity)
|
||||
health -= rand(3,15) * (severity + 1)
|
||||
disabled = rand(150, 600)
|
||||
hostile_drone = 0
|
||||
walk(src,0)
|
||||
|
||||
/mob/living/simple_animal/Die()
|
||||
src.visible_message("\blue \icon[src] [src] suddenly breaks apart.")
|
||||
..()
|
||||
del(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/malf_drone/Del()
|
||||
//some random debris left behind
|
||||
if(has_loot)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
var/obj/O
|
||||
|
||||
//shards
|
||||
O = new /obj/item/weapon/shard(src.loc)
|
||||
step_to(O, get_turf(pick(view(7, src))))
|
||||
if(prob(75))
|
||||
O = new /obj/item/weapon/shard(src.loc)
|
||||
step_to(O, get_turf(pick(view(7, src))))
|
||||
if(prob(50))
|
||||
O = new /obj/item/weapon/shard(src.loc)
|
||||
step_to(O, get_turf(pick(view(7, src))))
|
||||
if(prob(25))
|
||||
O = new /obj/item/weapon/shard(src.loc)
|
||||
step_to(O, get_turf(pick(view(7, src))))
|
||||
|
||||
//rods
|
||||
O = new /obj/item/stack/rods(src.loc)
|
||||
step_to(O, get_turf(pick(view(7, src))))
|
||||
if(prob(75))
|
||||
O = new /obj/item/stack/rods(src.loc)
|
||||
step_to(O, get_turf(pick(view(7, src))))
|
||||
if(prob(50))
|
||||
O = new /obj/item/stack/rods(src.loc)
|
||||
step_to(O, get_turf(pick(view(7, src))))
|
||||
if(prob(25))
|
||||
O = new /obj/item/stack/rods(src.loc)
|
||||
step_to(O, get_turf(pick(view(7, src))))
|
||||
|
||||
//plasteel
|
||||
O = new /obj/item/stack/sheet/plasteel(src.loc)
|
||||
step_to(O, get_turf(pick(view(7, src))))
|
||||
if(prob(75))
|
||||
O = new /obj/item/stack/sheet/plasteel(src.loc)
|
||||
step_to(O, get_turf(pick(view(7, src))))
|
||||
if(prob(50))
|
||||
O = new /obj/item/stack/sheet/plasteel(src.loc)
|
||||
step_to(O, get_turf(pick(view(7, src))))
|
||||
if(prob(25))
|
||||
O = new /obj/item/stack/sheet/plasteel(src.loc)
|
||||
step_to(O, get_turf(pick(view(7, src))))
|
||||
|
||||
//also drop dummy circuit boards deconstructable for research (loot)
|
||||
var/obj/item/weapon/circuitboard/C
|
||||
|
||||
//spawn 1-4 boards of a random type
|
||||
var/spawnees = 0
|
||||
var/num_boards = rand(1,4)
|
||||
var/list/options = list(1,2,4,8,16,32,64,128,256, 512)
|
||||
for(var/i=0, i<num_boards, i++)
|
||||
var/chosen = pick(options)
|
||||
options.Remove(options.Find(chosen))
|
||||
spawnees |= chosen
|
||||
|
||||
if(spawnees & 1)
|
||||
C = new(src.loc)
|
||||
C.name = "Drone CPU motherboard"
|
||||
C.origin_tech = "programming=[rand(3,6)]"
|
||||
|
||||
if(spawnees & 2)
|
||||
C = new(src.loc)
|
||||
C.name = "Drone neural interface"
|
||||
C.origin_tech = "biotech=[rand(3,6)]"
|
||||
|
||||
if(spawnees & 4)
|
||||
C = new(src.loc)
|
||||
C.name = "Drone suspension processor"
|
||||
C.origin_tech = "magnets=[rand(3,6)]"
|
||||
|
||||
if(spawnees & 8)
|
||||
C = new(src.loc)
|
||||
C.name = "Drone shielding controller"
|
||||
C.origin_tech = "bluespace=[rand(3,6)]"
|
||||
|
||||
if(spawnees & 16)
|
||||
C = new(src.loc)
|
||||
C.name = "Drone power capacitor"
|
||||
C.origin_tech = "powerstorage=[rand(3,6)]"
|
||||
|
||||
if(spawnees & 32)
|
||||
C = new(src.loc)
|
||||
C.name = "Drone hull reinforcer"
|
||||
C.origin_tech = "materials=[rand(3,6)]"
|
||||
|
||||
if(spawnees & 64)
|
||||
C = new(src.loc)
|
||||
C.name = "Drone auto-repair system"
|
||||
C.origin_tech = "engineering=[rand(3,6)]"
|
||||
|
||||
if(spawnees & 128)
|
||||
C = new(src.loc)
|
||||
C.name = "Drone plasma overcharge counter"
|
||||
C.origin_tech = "plasma=[rand(3,6)]"
|
||||
|
||||
if(spawnees & 256)
|
||||
C = new(src.loc)
|
||||
C.name = "Drone targetting circuitboard"
|
||||
C.origin_tech = "combat=[rand(3,6)]"
|
||||
|
||||
if(spawnees & 512)
|
||||
C = new(src.loc)
|
||||
C.name = "Corrupted drone morality core"
|
||||
C.origin_tech = "illegal=[rand(3,6)]"
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/projectile/beam/drone
|
||||
damage = 15
|
||||
|
||||
/obj/item/projectile/beam/pulse/drone
|
||||
damage = 10
|
||||
@@ -75,11 +75,11 @@
|
||||
//tcomms code is still runtiming somewhere here
|
||||
var/ending = copytext(text, length(text))
|
||||
if (is_speaking_soghun)
|
||||
return "hisses, \"<span class='species'>[text]</span>\"";
|
||||
return "hisses, \"<span class='soghun'>[text]</span>\"";
|
||||
if (is_speaking_skrell)
|
||||
return "warbles, \"<span class='species'>[text]</span>\"";
|
||||
return "warbles, \"<span class='skrell'>[text]</span>\"";
|
||||
if (is_speaking_tajaran)
|
||||
return "mrowls, \"<span class='species'>[text]</span>\"";
|
||||
return "mrowls, \"<span class='tajaran'>[text]</span>\"";
|
||||
//Needs Virus2
|
||||
// if (src.disease_symptoms & DISEASE_HOARSE)
|
||||
// return "rasps, \"[text]\"";
|
||||
@@ -115,4 +115,4 @@
|
||||
return "1"
|
||||
else if (ending == "!")
|
||||
return "2"
|
||||
return "0"
|
||||
return "0"
|
||||
|
||||
@@ -341,6 +341,10 @@
|
||||
P.pixel_x = rand(-7, 7) //random position
|
||||
P.pixel_y = rand(-7, 7)
|
||||
reagents.trans_to(P,30)
|
||||
|
||||
var/bottle_num = min(max(input("Enter bottle design number","Bottle number"), 0), 20) as num
|
||||
P.icon_state = "bottle[bottle_num]"
|
||||
desc = "A small bottle, design number #[bottle_num]."
|
||||
else
|
||||
var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(src.loc)
|
||||
reagents.trans_to(P,50)
|
||||
|
||||
@@ -196,6 +196,10 @@
|
||||
if(sattisfaction_text)
|
||||
M.emote("[sattisfaction_text]")
|
||||
del(src)
|
||||
if(ismouse(M))
|
||||
var/mob/living/simple_animal/mouse/N = M
|
||||
N.emote("nibbles away at the [src]")
|
||||
N.health = min(N.health + 1, N.maxHealth)
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
+3
-1
@@ -52,7 +52,9 @@ h1.alert, h2.alert {color: #000000;}
|
||||
.mod {color: #735638; font-weight: bold;}
|
||||
.modooc {color: #184880; font-weight: bold;}
|
||||
.adminmod {color: #402A14; font-weight: bold;}
|
||||
.species {color: #803B56;}
|
||||
.tajaran {color: #803B56;}
|
||||
.skrell {color: #00CED1;}
|
||||
.soghun {color: #228B22;}
|
||||
|
||||
.interface {color: #330033;}
|
||||
</style>"}
|
||||
|
||||
@@ -210,5 +210,6 @@ NUDGE_SCRIPT_PATH nudge.py
|
||||
|
||||
## Comment this to unrestrict the number of alien players allowed in the round. The number represents the number of alien players for every human player.
|
||||
ALIEN_PLAYER_RATIO 0.2
|
||||
|
||||
##Remove the # to let ghosts spin chairs
|
||||
#GHOST_INTERACTION
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 157 KiB After Width: | Height: | Size: 185 KiB |
+9033
-9024
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user