mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 02:16:05 +00:00
Merge branch 'Bleeding-Edge' of github.com:d3athrow/vgstation13 into melting
Conflicts: code/game/objects/items/stacks/sheets/glass.dm code/game/objects/items/stacks/sheets/mineral.dm code/setup.dm
This commit is contained in:
@@ -194,7 +194,6 @@
|
||||
#include "code\defines\byondtools.dm"
|
||||
#include "code\defines\obj.dm"
|
||||
#include "code\defines\vox_sounds.dm"
|
||||
#include "code\defines\obj\hydro.dm"
|
||||
#include "code\defines\obj\weapon.dm"
|
||||
#include "code\defines\procs\AStar.dm"
|
||||
#include "code\defines\procs\biohazard_alert.dm"
|
||||
@@ -354,7 +353,6 @@
|
||||
#include "code\game\machinery\Freezer.dm"
|
||||
#include "code\game\machinery\hologram.dm"
|
||||
#include "code\game\machinery\holosign.dm"
|
||||
#include "code\game\machinery\hydroponics.dm"
|
||||
#include "code\game\machinery\igniter.dm"
|
||||
#include "code\game\machinery\iv_drip.dm"
|
||||
#include "code\game\machinery\kinetic_accelerator.dm"
|
||||
@@ -368,7 +366,6 @@
|
||||
#include "code\game\machinery\newscaster.dm"
|
||||
#include "code\game\machinery\OpTable.dm"
|
||||
#include "code\game\machinery\overview.dm"
|
||||
#include "code\game\machinery\podmen.dm"
|
||||
#include "code\game\machinery\portable_turret.dm"
|
||||
#include "code\game\machinery\recharger.dm"
|
||||
#include "code\game\machinery\rechargestation.dm"
|
||||
@@ -380,6 +377,7 @@
|
||||
#include "code\game\machinery\status_display.dm"
|
||||
#include "code\game\machinery\suit_storage_unit.dm"
|
||||
#include "code\game\machinery\syndicatebeacon.dm"
|
||||
#include "code\game\machinery\taxi_buttons.dm"
|
||||
#include "code\game\machinery\teleporter.dm"
|
||||
#include "code\game\machinery\transformer.dm"
|
||||
#include "code\game\machinery\turrets.dm"
|
||||
@@ -477,6 +475,7 @@
|
||||
#include "code\game\mecha\mecha.dm"
|
||||
#include "code\game\mecha\mecha_construction_paths.dm"
|
||||
#include "code\game\mecha\mecha_control_console.dm"
|
||||
#include "code\game\mecha\mecha_designs.dm"
|
||||
#include "code\game\mecha\mecha_parts.dm"
|
||||
#include "code\game\mecha\mecha_wreckage.dm"
|
||||
#include "code\game\mecha\combat\combat.dm"
|
||||
@@ -487,6 +486,7 @@
|
||||
#include "code\game\mecha\combat\phazon.dm"
|
||||
#include "code\game\mecha\equipment\mecha_equipment.dm"
|
||||
#include "code\game\mecha\equipment\tools\medical_tools.dm"
|
||||
#include "code\game\mecha\equipment\tools\sec_tools.dm"
|
||||
#include "code\game\mecha\equipment\tools\tools.dm"
|
||||
#include "code\game\mecha\equipment\weapons\weapons.dm"
|
||||
#include "code\game\mecha\medical\medical.dm"
|
||||
@@ -551,6 +551,7 @@
|
||||
#include "code\game\objects\items\devices\handtv.dm"
|
||||
#include "code\game\objects\items\devices\lightreplacer.dm"
|
||||
#include "code\game\objects\items\devices\maracas.dm"
|
||||
#include "code\game\objects\items\devices\mat_synth.dm"
|
||||
#include "code\game\objects\items\devices\megaphone.dm"
|
||||
#include "code\game\objects\items\devices\modkit.dm"
|
||||
#include "code\game\objects\items\devices\multitool.dm"
|
||||
@@ -574,6 +575,7 @@
|
||||
#include "code\game\objects\items\devices\radio\headset.dm"
|
||||
#include "code\game\objects\items\devices\radio\intercom.dm"
|
||||
#include "code\game\objects\items\devices\radio\radio.dm"
|
||||
#include "code\game\objects\items\robot\robot_designs.dm"
|
||||
#include "code\game\objects\items\robot\robot_items.dm"
|
||||
#include "code\game\objects\items\robot\robot_parts.dm"
|
||||
#include "code\game\objects\items\robot\robot_upgrades.dm"
|
||||
@@ -765,6 +767,8 @@
|
||||
#include "code\libs\db\db.dm"
|
||||
#include "code\libs\Get Flat Icon\Get Flat Icon.dm"
|
||||
#include "code\libs\IconProcs\IconProcs.dm"
|
||||
#include "code\libs\s_html\hexadecimal.dm"
|
||||
#include "code\libs\s_html\inverthtml.dm"
|
||||
#include "code\modules\admin\admin.dm"
|
||||
#include "code\modules\admin\admin_investigate.dm"
|
||||
#include "code\modules\admin\admin_memo.dm"
|
||||
@@ -962,6 +966,14 @@
|
||||
#include "code\modules\food\icecreamvat.dm"
|
||||
#include "code\modules\food\recipes_microwave.dm"
|
||||
#include "code\modules\genetics\side_effects.dm"
|
||||
#include "code\modules\hydroponics\grown_inedible.dm"
|
||||
#include "code\modules\hydroponics\hydro_tools.dm"
|
||||
#include "code\modules\hydroponics\hydro_tray.dm"
|
||||
#include "code\modules\hydroponics\seed_datums.dm"
|
||||
#include "code\modules\hydroponics\seed_machines.dm"
|
||||
#include "code\modules\hydroponics\seed_mobs.dm"
|
||||
#include "code\modules\hydroponics\seeds.dm"
|
||||
#include "code\modules\hydroponics\vines.dm"
|
||||
#include "code\modules\library\lib_items.dm"
|
||||
#include "code\modules\library\lib_machines.dm"
|
||||
#include "code\modules\library\lib_readme.dm"
|
||||
@@ -1202,6 +1214,7 @@
|
||||
#include "code\modules\mob\living\simple_animal\hostile\necro.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\pirate.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\russian.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\slime.dm"
|
||||
#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\giant_spider\base_spider.dm"
|
||||
@@ -1459,6 +1472,7 @@
|
||||
#include "code\modules\surgery\encased.dm"
|
||||
#include "code\modules\surgery\eye.dm"
|
||||
#include "code\modules\surgery\face.dm"
|
||||
#include "code\modules\surgery\genderchange.dm"
|
||||
#include "code\modules\surgery\generic.dm"
|
||||
#include "code\modules\surgery\headreattach.dm"
|
||||
#include "code\modules\surgery\implant.dm"
|
||||
|
||||
119
code/WorkInProgress/Cael_Aislinn/Jungle/jungle_plants.dm
Normal file
119
code/WorkInProgress/Cael_Aislinn/Jungle/jungle_plants.dm
Normal file
@@ -0,0 +1,119 @@
|
||||
//*********************//
|
||||
// Generic undergrowth //
|
||||
//*********************//
|
||||
|
||||
/obj/structure/bush
|
||||
name = "foliage"
|
||||
desc = "Pretty thick scrub, it'll take something sharp and a lot of determination to clear away."
|
||||
icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi'
|
||||
icon_state = "bush1"
|
||||
density = 1
|
||||
anchored = 1
|
||||
layer = 3.2
|
||||
var/indestructable = 0
|
||||
var/stump = 0
|
||||
|
||||
/obj/structure/bush/New()
|
||||
if(prob(20))
|
||||
opacity = 1
|
||||
|
||||
/obj/structure/bush/Bumped(M as mob)
|
||||
if (istype(M, /mob/living/simple_animal))
|
||||
var/mob/living/simple_animal/A = M
|
||||
A.loc = get_turf(src)
|
||||
else if (istype(M, /mob/living/carbon/monkey))
|
||||
var/mob/living/carbon/monkey/A = M
|
||||
A.loc = get_turf(src)
|
||||
|
||||
/obj/structure/bush/attackby(var/obj/I as obj, var/mob/user as mob)
|
||||
//hatchets can clear away undergrowth
|
||||
if(istype(I, /obj/item/weapon/hatchet) && !stump)
|
||||
if(indestructable)
|
||||
//this bush marks the edge of the map, you can't destroy it
|
||||
user << "\red You flail away at the undergrowth, but it's too thick here."
|
||||
else
|
||||
user.visible_message("\red <b>[user] begins clearing away [src].</b>","\red <b>You begin clearing away [src].</b>")
|
||||
spawn(rand(15,30))
|
||||
if(get_dist(user,src) < 2)
|
||||
user << "\blue You clear away [src]."
|
||||
var/obj/item/stack/sheet/wood/W = new(src.loc)
|
||||
W.amount = rand(3,15)
|
||||
if(prob(50))
|
||||
icon_state = "stump[rand(1,2)]"
|
||||
name = "cleared foliage"
|
||||
desc = "There used to be dense undergrowth here."
|
||||
density = 0
|
||||
stump = 1
|
||||
pixel_x = rand(-6,6)
|
||||
pixel_y = rand(-6,6)
|
||||
else
|
||||
del(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
//*******************************//
|
||||
// Strange, fruit-bearing plants //
|
||||
//*******************************//
|
||||
|
||||
var/list/fruit_icon_states = list("badrecipe","kudzupod","reishi","lime","grapes","boiledrorocore","chocolateegg")
|
||||
var/list/reagent_effects = list("toxin","anti_toxin","stoxin","space_drugs","mindbreaker","zombiepowder","impedrezene")
|
||||
var/jungle_plants_init = 0
|
||||
|
||||
/proc/init_jungle_plants()
|
||||
jungle_plants_init = 1
|
||||
fruit_icon_states = shuffle(fruit_icon_states)
|
||||
reagent_effects = shuffle(reagent_effects)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/jungle_fruit
|
||||
name = "jungle fruit"
|
||||
desc = "It smells weird and looks off."
|
||||
icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi'
|
||||
icon_state = "orange"
|
||||
potency = 1
|
||||
|
||||
/obj/structure/jungle_plant
|
||||
icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi'
|
||||
icon_state = "plant1"
|
||||
desc = "Looks like some of that fruit might be edible."
|
||||
var/fruits_left = 3
|
||||
var/fruit_type = -1
|
||||
var/icon/fruit_overlay
|
||||
var/plant_strength = 1
|
||||
var/fruit_r
|
||||
var/fruit_g
|
||||
var/fruit_b
|
||||
|
||||
|
||||
/obj/structure/jungle_plant/New()
|
||||
if(!jungle_plants_init)
|
||||
init_jungle_plants()
|
||||
|
||||
fruit_type = rand(1,7)
|
||||
icon_state = "plant[fruit_type]"
|
||||
fruits_left = rand(1,5)
|
||||
fruit_overlay = icon('code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi',"fruit[fruits_left]")
|
||||
fruit_r = 255 - fruit_type * 36
|
||||
fruit_g = rand(1,255)
|
||||
fruit_b = fruit_type * 36
|
||||
fruit_overlay.Blend(rgb(fruit_r, fruit_g, fruit_b), ICON_ADD)
|
||||
overlays += fruit_overlay
|
||||
plant_strength = rand(20,200)
|
||||
|
||||
/obj/structure/jungle_plant/attack_hand(var/mob/user as mob)
|
||||
if(fruits_left > 0)
|
||||
fruits_left--
|
||||
user << "\blue You pick a fruit off [src]."
|
||||
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/grown/jungle_fruit/J = new (src.loc)
|
||||
J.potency = plant_strength
|
||||
J.icon_state = fruit_icon_states[fruit_type]
|
||||
J.reagents.add_reagent(reagent_effects[fruit_type], 1+round((plant_strength / 20), 1))
|
||||
J.bitesize = 1+round(J.reagents.total_volume / 2, 1)
|
||||
J.attack_hand(user)
|
||||
|
||||
overlays -= fruit_overlay
|
||||
fruit_overlay = icon('code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi',"fruit[fruits_left]")
|
||||
fruit_overlay.Blend(rgb(fruit_r, fruit_g, fruit_b), ICON_ADD)
|
||||
overlays += fruit_overlay
|
||||
else
|
||||
user << "\red There are no fruit left on [src]."
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
//sculpture
|
||||
//SCP-173, nothing more need be said
|
||||
/mob/living/simple_animal/sculpture
|
||||
@@ -26,13 +25,13 @@
|
||||
/mob/living/simple_animal/sculpture/proc/GrabMob(var/mob/living/target)
|
||||
if(target && target != src && ishuman(target) && !observed)
|
||||
G = new /obj/item/weapon/grab(src, target)
|
||||
target.Stun(1)
|
||||
target.Paralyse(1)
|
||||
G.loc = src
|
||||
target.grabbed_by += G
|
||||
G.synch()
|
||||
target.LAssailant = src
|
||||
//Killing people has been extradited here for reasons, SCP still looks to grab targets on his turf later down
|
||||
target.Stun(1)
|
||||
target.Paralyse(1)
|
||||
target.apply_damage(rand(120,150), BRUTE, "head")
|
||||
|
||||
playsound(target.loc, pick(snap_sound), 100, 1, -1)
|
||||
@@ -60,9 +59,9 @@
|
||||
continue
|
||||
var/xdif = M.x - src.x
|
||||
var/ydif = M.y - src.y
|
||||
if(abs(xdif) < abs(ydif))
|
||||
//testing with PERFECT line of sight (aka lined up)
|
||||
if(!(ydif == 0)) // If we are not on the same vertical plane (up/down)
|
||||
//mob is either above or below src
|
||||
//We'll estimate that humans have a perfect 180 degrees view for simplicity, quite zanny
|
||||
if(ydif < 0 && M.dir == NORTH)
|
||||
//mob is below src and looking up
|
||||
observed = 1
|
||||
@@ -71,7 +70,7 @@
|
||||
//mob is above src and looking down
|
||||
observed = 1
|
||||
break
|
||||
else if(abs(xdif) > abs(ydif))
|
||||
if(!(xdif == 0)) // If we are not on the same horizontal plane (left/right)
|
||||
//mob is either left or right of src
|
||||
if(xdif < 0 && M.dir == EAST)
|
||||
//mob is to the left of src and looking right
|
||||
@@ -81,13 +80,12 @@
|
||||
//mob is to the right of src and looking left
|
||||
observed = 1
|
||||
break
|
||||
else if (xdif == 0 && ydif == 0)
|
||||
//mob is on the same tile as src
|
||||
else if (xdif == 0 && ydif == 0) //SCP is on the same tile. So technically, in the mob's back
|
||||
observed = 0
|
||||
//breaks the sculpture since it's target can observe it, changed to observed = 0
|
||||
else
|
||||
observed = 0
|
||||
//otherwise we're pretty safe in saying no-one's looking at you boy, avoids having to define it at the start of Life()
|
||||
//otherwise we don't understand your situation, it's pretty non-euclidian, just move
|
||||
|
||||
//account for darkness
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -95,156 +93,157 @@
|
||||
if(T.luminosity == 0 && !istype(T, /turf/unsimulated)) //Let's only bother with dark tiles. Unsimulated tiles can't run this check for reference.
|
||||
in_darkness = 1
|
||||
|
||||
//see if we're able to do stuff
|
||||
if(!observed || in_darkness)
|
||||
//see if we're able to strangle anyone
|
||||
var/turf/myTurf = get_turf(src)
|
||||
for(var/mob/living/carbon/human/M in myTurf)
|
||||
if(!M.stat)
|
||||
GrabMob(M)
|
||||
break
|
||||
|
||||
//find out what mobs we can see (-tried to- remove sight and doubled range)
|
||||
//var/list/incapacitated = list()
|
||||
var/list/conscious = list()
|
||||
for(var/mob/living/carbon/human/M in view(7, src))
|
||||
//this may not be quite the right test
|
||||
if(M == src)
|
||||
if(observed && !in_darkness) //Is someone looking at us, given that they can see us ?
|
||||
return //Try again when we get a chance
|
||||
|
||||
//see if we're able to strangle anyone
|
||||
for(var/mob/living/carbon/human/M in T)
|
||||
if(M.stat == CONSCIOUS)
|
||||
GrabMob(M)
|
||||
break
|
||||
|
||||
//find out what mobs we can see (-tried to- remove sight and doubled range)
|
||||
//var/list/incapacitated = list()
|
||||
var/list/conscious = list()
|
||||
for(var/mob/living/carbon/human/M in view(7, src))
|
||||
//this may not be quite the right test
|
||||
if(M == src)
|
||||
continue
|
||||
if (M.stat == CONSCIOUS)
|
||||
conscious.Add(M)
|
||||
|
||||
//pick the nearest valid conscious target
|
||||
var/mob/living/carbon/human/target
|
||||
for(var/mob/living/carbon/human/M in conscious)
|
||||
if(!target || get_dist(src, M) < get_dist(src, target))
|
||||
target = M
|
||||
|
||||
if(target)
|
||||
var/turf/target_turf
|
||||
if(in_darkness)
|
||||
//move to right behind them
|
||||
target_turf = get_step(target, src)
|
||||
if(scare_played == 0) //Let's minimize the spam
|
||||
playsound(loc, pick(scare_sound), 100, 1, -1)
|
||||
scare_played = 1
|
||||
spawn(50)
|
||||
scare_played = 0
|
||||
else
|
||||
//move to them really really fast and knock them down
|
||||
target_turf = get_turf(target)
|
||||
if(scare_played == 0) //Let's minimize the spam
|
||||
playsound(loc, pick(scare_sound), 100, 1, -1)
|
||||
scare_played = 1
|
||||
spawn(50)
|
||||
scare_played = 0
|
||||
|
||||
//rampage along a path to get to them, in the blink of an eye
|
||||
var/turf/next_turf = get_step_towards(src, target)
|
||||
var/num_turfs = get_dist(src,target)
|
||||
spawn()
|
||||
while(get_turf(src) != target_turf && num_turfs > 0)
|
||||
for(var/obj/structure/window/W in next_turf)
|
||||
W.destroy()
|
||||
sleep(5)
|
||||
for(var/obj/structure/table/O in next_turf)
|
||||
O.ex_act(1)
|
||||
sleep(10)
|
||||
for(var/obj/structure/grille/G in next_turf)
|
||||
G.ex_act(1)
|
||||
sleep(10)
|
||||
for(var/obj/machinery/door/airlock/A in next_turf) //Snowflakey code to take in account bolts and welding
|
||||
if(A.welded || A.locked)
|
||||
break
|
||||
A.open()
|
||||
sleep(10)
|
||||
for(var/obj/machinery/door/D in next_turf)
|
||||
D.open()
|
||||
sleep(10)
|
||||
if(!next_turf.CanPass(src, next_turf))
|
||||
break
|
||||
src.loc = next_turf
|
||||
src.dir = get_dir(src, target)
|
||||
next_turf = get_step(src, get_dir(next_turf,target))
|
||||
num_turfs--
|
||||
|
||||
//if we're not strangling anyone, take a stroll
|
||||
if(prob(30)) //30 % of dance of its people
|
||||
var/list/turfs = new/list()
|
||||
for(var/turf/thisturf in view(7,src))
|
||||
if(istype(thisturf, /turf/space))
|
||||
continue
|
||||
if (!M.stat)
|
||||
conscious.Add(M)
|
||||
else if(istype(thisturf, /turf/simulated/wall))
|
||||
continue
|
||||
else if(istype(thisturf, /turf/unsimulated/mineral))
|
||||
continue
|
||||
else if(istype(thisturf, /turf/simulated/shuttle/wall))
|
||||
continue
|
||||
else if(istype(thisturf, /turf/unsimulated/wall))
|
||||
continue
|
||||
turfs += thisturf
|
||||
var/turf/target_turf = pick(turfs)
|
||||
|
||||
//pick the nearest valid conscious target
|
||||
var/mob/living/carbon/human/target
|
||||
for(var/mob/living/carbon/human/M in conscious)
|
||||
if(!target || get_dist(src, M) < get_dist(src, target))
|
||||
target = M
|
||||
//MUH 6 QUADRILLION WINDOWS
|
||||
//rampage along a path to get to it, in the blink of an eye
|
||||
var/turf/next_turf = get_step_towards(src, target_turf)
|
||||
var/num_turfs = get_dist(src,target_turf)
|
||||
spawn()
|
||||
while(get_turf(src) != target_turf && num_turfs > 0)
|
||||
for(var/obj/structure/window/W in next_turf)
|
||||
W.destroy()
|
||||
sleep(5)
|
||||
for(var/obj/structure/table/O in next_turf)
|
||||
O.ex_act(1)
|
||||
sleep(5)
|
||||
for(var/obj/structure/grille/G in next_turf)
|
||||
G.ex_act(1)
|
||||
sleep(5)
|
||||
for(var/obj/machinery/door/D in next_turf)
|
||||
D.open()
|
||||
sleep(5)
|
||||
if(!next_turf.CanPass(src, next_turf))
|
||||
break
|
||||
src.loc = next_turf
|
||||
src.dir = get_dir(src, target)
|
||||
next_turf = get_step(src, get_dir(next_turf,target_turf))
|
||||
num_turfs--
|
||||
//Coding note : This is known to allow SCP to end up on tiles that contain obstructing structures (doors, machinery, etc)
|
||||
//Although he CAN'T pass through them during normal movement. Will look into a fix soon
|
||||
|
||||
if(target)
|
||||
var/turf/target_turf
|
||||
if(in_darkness)
|
||||
//move to right behind them
|
||||
target_turf = get_step(target, src)
|
||||
if(scare_played == 0) //Let's minimize the spam
|
||||
playsound(loc, pick(scare_sound), 100, 1, -1)
|
||||
scare_played = 1
|
||||
spawn(50)
|
||||
scare_played = 0
|
||||
else
|
||||
//move to them really really fast and knock them down
|
||||
target_turf = get_turf(target)
|
||||
if(scare_played == 0) //Let's minimize the spam
|
||||
playsound(loc, pick(scare_sound), 100, 1, -1)
|
||||
scare_played = 1
|
||||
spawn(50)
|
||||
scare_played = 0
|
||||
|
||||
//rampage along a path to get to them, in the blink of an eye
|
||||
var/turf/next_turf = get_step_towards(src, target)
|
||||
var/num_turfs = get_dist(src,target)
|
||||
spawn()
|
||||
while(get_turf(src) != target_turf && num_turfs > 0)
|
||||
for(var/obj/structure/window/W in next_turf)
|
||||
W.destroy()
|
||||
sleep(5)
|
||||
for(var/obj/structure/table/O in next_turf)
|
||||
O.ex_act(1)
|
||||
sleep(10)
|
||||
for(var/obj/structure/grille/G in next_turf)
|
||||
G.ex_act(1)
|
||||
sleep(10)
|
||||
for(var/obj/machinery/door/airlock/A in next_turf) //Snowflakey code to take in account bolts and welding
|
||||
if(A.welded || A.locked)
|
||||
break
|
||||
A.open()
|
||||
sleep(10)
|
||||
for(var/obj/machinery/door/D in next_turf)
|
||||
D.open()
|
||||
sleep(10)
|
||||
if(!next_turf.CanPass(src, next_turf))
|
||||
break
|
||||
src.loc = next_turf
|
||||
src.dir = get_dir(src, target)
|
||||
next_turf = get_step(src, get_dir(next_turf,target))
|
||||
num_turfs--
|
||||
|
||||
//if we're not strangling anyone, take a stroll
|
||||
if(prob(30)) //30 % of dance of its people
|
||||
var/list/turfs = new/list()
|
||||
for(var/turf/thisturf in view(7,src))
|
||||
if(istype(thisturf, /turf/space))
|
||||
continue
|
||||
else if(istype(thisturf, /turf/simulated/wall))
|
||||
continue
|
||||
else if(istype(thisturf, /turf/unsimulated/mineral))
|
||||
continue
|
||||
else if(istype(thisturf, /turf/simulated/shuttle/wall))
|
||||
continue
|
||||
else if(istype(thisturf, /turf/unsimulated/wall))
|
||||
continue
|
||||
turfs += thisturf
|
||||
var/turf/target_turf = pick(turfs)
|
||||
|
||||
//MUH 6 QUADRILLION WINDOWS
|
||||
//rampage along a path to get to it, in the blink of an eye
|
||||
var/turf/next_turf = get_step_towards(src, target_turf)
|
||||
var/num_turfs = get_dist(src,target_turf)
|
||||
spawn()
|
||||
while(get_turf(src) != target_turf && num_turfs > 0)
|
||||
for(var/obj/structure/window/W in next_turf)
|
||||
W.destroy()
|
||||
sleep(5)
|
||||
for(var/obj/structure/table/O in next_turf)
|
||||
O.ex_act(1)
|
||||
sleep(5)
|
||||
for(var/obj/structure/grille/G in next_turf)
|
||||
G.ex_act(1)
|
||||
sleep(5)
|
||||
for(var/obj/machinery/door/D in next_turf)
|
||||
D.open()
|
||||
sleep(5)
|
||||
if(!next_turf.CanPass(src, next_turf))
|
||||
break
|
||||
src.loc = next_turf
|
||||
src.dir = get_dir(src, target)
|
||||
next_turf = get_step(src, get_dir(next_turf,target_turf))
|
||||
num_turfs--
|
||||
//Coding note : This is known to allow SCP to end up on tiles that contain obstructing structures (doors, machinery, etc)
|
||||
//Although he CAN'T pass through them during normal movement. Will look into a fix soon
|
||||
|
||||
//Do we have a vent ? Good, let's take a look
|
||||
for(entry_vent in view(1, src))
|
||||
if(prob(75))
|
||||
return //Ignore that vent for this tick
|
||||
spawn(5) //Let's stop SCP-173 for half a second to take a look
|
||||
..()
|
||||
if(entry_vent.network && entry_vent.network.normal_members.len)
|
||||
var/list/vents = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in entry_vent.network.normal_members)
|
||||
vents.Add(temp_vent)
|
||||
if(!vents.len)
|
||||
entry_vent = null
|
||||
return
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/exit_vent = pick(vents)
|
||||
spawn()
|
||||
visible_message("<span class='danger'>[src] suddenly disappears into [entry_vent.name] !</span>")
|
||||
loc = exit_vent
|
||||
var/travel_time = round(get_dist(loc, exit_vent.loc)/2)
|
||||
spawn(travel_time)
|
||||
|
||||
if(!exit_vent || exit_vent.welded)
|
||||
loc = entry_vent
|
||||
entry_vent = null
|
||||
return
|
||||
|
||||
loc = exit_vent.loc
|
||||
entry_vent = null
|
||||
var/area/new_area = get_area(loc)
|
||||
if(new_area)
|
||||
new_area.Entered(src)
|
||||
visible_message("<span class='danger'>[src] suddenly appears from [exit_vent.name] !</span>")
|
||||
else
|
||||
//Do we have a vent ? Good, let's take a look
|
||||
for(entry_vent in view(1, src))
|
||||
if(prob(75))
|
||||
return //Ignore that vent for this tick
|
||||
sleep(5) //Let's stop SCP-173 for half a second to take a look
|
||||
..()
|
||||
if(entry_vent.network && entry_vent.network.normal_members.len)
|
||||
var/list/vents = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in entry_vent.network.normal_members)
|
||||
vents.Add(temp_vent)
|
||||
if(!vents.len)
|
||||
entry_vent = null
|
||||
return
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/exit_vent = pick(vents)
|
||||
spawn()
|
||||
visible_message("<span class='danger'>[src] suddenly disappears into the vent !</span>")
|
||||
loc = exit_vent
|
||||
var/travel_time = round(get_dist(loc, exit_vent.loc)/2)
|
||||
spawn(travel_time)
|
||||
|
||||
if(!exit_vent || exit_vent.welded)
|
||||
loc = entry_vent
|
||||
entry_vent = null
|
||||
return
|
||||
|
||||
loc = exit_vent.loc
|
||||
entry_vent = null
|
||||
var/area/new_area = get_area(loc)
|
||||
if(new_area)
|
||||
new_area.Entered(src)
|
||||
visible_message("<span class='danger'>[src] suddenly appears from the vent !</span>")
|
||||
else
|
||||
entry_vent = null
|
||||
|
||||
/mob/living/simple_animal/sculpture/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
..()
|
||||
@@ -261,4 +260,4 @@
|
||||
GrabMob(AM)
|
||||
|
||||
/mob/living/simple_animal/sculpture/ex_act(var/severity)
|
||||
//You cannot destroy SCP-173, fool !
|
||||
//You cannot destroy SCP-173, fool !
|
||||
|
||||
@@ -105,7 +105,7 @@ var/list/alldepartments = list("Central Command")
|
||||
|
||||
if((dpt == "Central Command") | (dpt == "Nanotrasen HR"))
|
||||
if(dpt == "Central Command")
|
||||
Centcomm_fax(tofax.info, tofax.name, usr)
|
||||
Centcomm_fax(tofax, tofax.name, usr)
|
||||
if(dpt == "Nanotrasen HR")
|
||||
if(findtext(tofax.stamps, "magnetic"))
|
||||
if(findtext(tofax.name,"Demotion"))
|
||||
@@ -192,7 +192,7 @@ var/list/alldepartments = list("Central Command")
|
||||
user << "<span class='notice'>You [anchored ? "wrench" : "unwrench"] \the [src].</span>"
|
||||
return
|
||||
|
||||
/proc/Centcomm_fax(var/sent, var/sentname, var/mob/Sender)
|
||||
/proc/Centcomm_fax(var/obj/item/weapon/paper/sent, var/sentname, var/mob/Sender)
|
||||
|
||||
var/msg = "\blue <b><font color='orange'>CENTCOMM FAX: </font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) (<A HREF='?_src_=holder;adminplayerobservejump=\ref[Sender]'>JMP</A>) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<a href='?_src_=holder;CentcommFaxReply=\ref[Sender]'>RPLY</a>)</b>: Receiving '[sentname]' via secure connection ... <a href='?_src_=holder;CentcommFaxView=\ref[sent]'>view message</a>"
|
||||
admins << msg
|
||||
|
||||
@@ -5,6 +5,5 @@
|
||||
/obj/item/pod_parts/core
|
||||
name="Space Pod Core"
|
||||
icon_state = "core"
|
||||
construction_cost = list("iron"=5000,"uranium"=1000,"plasma"=5000)
|
||||
flags = FPRINT | CONDUCT
|
||||
origin_tech = "programming=2;materials=3;bluespace=2;engineering=3"
|
||||
@@ -396,13 +396,13 @@ mob/living/carbon/human/airflow_hit(atom/A)
|
||||
var/b_loss = airflow_speed * zas_settings.Get(/datum/ZAS_Setting/airflow_damage)
|
||||
|
||||
var/blocked = run_armor_check("head","melee")
|
||||
apply_damage(b_loss/3, BRUTE, "head", blocked, 0, "Airflow")
|
||||
apply_damage(b_loss/3, BRUTE, "head", blocked, 0, used_weapon = "Airflow")
|
||||
|
||||
blocked = run_armor_check("chest","melee")
|
||||
apply_damage(b_loss/3, BRUTE, "chest", blocked, 0, "Airflow")
|
||||
apply_damage(b_loss/3, BRUTE, "chest", blocked, 0, used_weapon = "Airflow")
|
||||
|
||||
blocked = run_armor_check("groin","melee")
|
||||
apply_damage(b_loss/3, BRUTE, "groin", blocked, 0, "Airflow")
|
||||
apply_damage(b_loss/3, BRUTE, "groin", blocked, 0, used_weapon = "Airflow")
|
||||
|
||||
if(zas_settings.Get(/datum/ZAS_Setting/airflow_push) || AirflowCanPush())
|
||||
if(airflow_speed > 10)
|
||||
|
||||
@@ -113,6 +113,36 @@ What are the archived variables for?
|
||||
update_values()
|
||||
return
|
||||
|
||||
//Takes a gas string, and the amount of moles to adjust by. Calls update_values() if update isn't 0.
|
||||
/datum/gas_mixture/proc/adjust_gas(gasid, moles, update = 1)
|
||||
if(moles == 0)
|
||||
return
|
||||
switch(gasid)
|
||||
if("oxygen")
|
||||
if (group_multiplier != 1)
|
||||
oxygen += moles/group_multiplier
|
||||
else
|
||||
oxygen += moles
|
||||
if("plasma")
|
||||
if (group_multiplier != 1)
|
||||
toxins += moles/group_multiplier
|
||||
else
|
||||
toxins += moles
|
||||
if("carbon_dioxide")
|
||||
if (group_multiplier != 1)
|
||||
carbon_dioxide += moles/group_multiplier
|
||||
else
|
||||
carbon_dioxide += moles
|
||||
if("nitrogen")
|
||||
if (group_multiplier != 1)
|
||||
nitrogen += moles/group_multiplier
|
||||
else
|
||||
nitrogen += moles
|
||||
|
||||
|
||||
if(update)
|
||||
update_values()
|
||||
|
||||
/*
|
||||
/datum/gas_mixture/proc/create_reagents(var/max_vol)
|
||||
aerosols = new /datum/reagents(max_vol)
|
||||
|
||||
@@ -13,11 +13,16 @@
|
||||
/proc/testing(msg)
|
||||
world.log << "## TESTING: [msg]"
|
||||
|
||||
/proc/log_admin(text)
|
||||
admin_log.Add(text)
|
||||
if (config.log_admin)
|
||||
diary << "\[[time_stamp()]]ADMIN: [text]"
|
||||
/proc/log_admin(raw_text)
|
||||
var/text_to_log = "\[[time_stamp()]]ADMIN: [raw_text]"
|
||||
|
||||
admin_log.Add(text_to_log)
|
||||
|
||||
if(config.log_admin)
|
||||
diary << text_to_log
|
||||
|
||||
if(config.log_admin_only)
|
||||
admin_diary << text_to_log
|
||||
|
||||
/proc/log_debug(text)
|
||||
if (config.log_debug)
|
||||
|
||||
@@ -219,32 +219,10 @@ proc/checkhtml(var/t)
|
||||
* Text modification
|
||||
*/
|
||||
/proc/replacetext(text, find, replacement)
|
||||
var/find_len = length(find)
|
||||
if(find_len < 1) return text
|
||||
. = ""
|
||||
var/last_found = 1
|
||||
while(1)
|
||||
var/found = findtext(text, find, last_found, 0)
|
||||
. += copytext(text, last_found, found)
|
||||
if(found)
|
||||
. += replacement
|
||||
last_found = found + find_len
|
||||
continue
|
||||
return .
|
||||
return list2text(text2list(text, find), replacement)
|
||||
|
||||
/proc/replacetextEx(text, find, replacement)
|
||||
var/find_len = length(find)
|
||||
if(find_len < 1) return text
|
||||
. = ""
|
||||
var/last_found = 1
|
||||
while(1)
|
||||
var/found = findtextEx(text, find, last_found, 0)
|
||||
. += copytext(text, last_found, found)
|
||||
if(found)
|
||||
. += replacement
|
||||
last_found = found + find_len
|
||||
continue
|
||||
return .
|
||||
return list2text(text2listEx(text, find), replacement)
|
||||
|
||||
//Adds 'u' number of zeros ahead of the text 't'
|
||||
/proc/add_zero(t, u)
|
||||
@@ -311,28 +289,6 @@ proc/checkhtml(var/t)
|
||||
return message
|
||||
return copytext(message, 1, length + 1)
|
||||
|
||||
/*
|
||||
* Misc
|
||||
*/
|
||||
|
||||
/proc/stringsplit(txt, character)
|
||||
var/cur_text = txt
|
||||
var/last_found = 1
|
||||
var/found_char = findtext(cur_text,character)
|
||||
var/list/list = list()
|
||||
if(found_char)
|
||||
var/fs = copytext(cur_text,last_found,found_char)
|
||||
list += fs
|
||||
last_found = found_char+length(character)
|
||||
found_char = findtext(cur_text,character,last_found)
|
||||
while(found_char)
|
||||
var/found_string = copytext(cur_text,last_found,found_char)
|
||||
last_found = found_char+length(character)
|
||||
list += found_string
|
||||
found_char = findtext(cur_text,character,last_found)
|
||||
list += copytext(cur_text,last_found,length(cur_text)+1)
|
||||
return list
|
||||
|
||||
/proc/stringmerge(var/text,var/compare,replace = "*")
|
||||
//This proc fills in all spaces with the "replace" var (* by default) with whatever
|
||||
//is in the other string at the same spot (assuming it is not a replace char).
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/*
|
||||
* Holds procs designed to change one type of value, into another.
|
||||
* Contains:
|
||||
* hex2num & num2hex
|
||||
* text2list & list2text
|
||||
* file2list
|
||||
* angle2dir
|
||||
@@ -9,96 +8,93 @@
|
||||
* worldtime2text
|
||||
*/
|
||||
|
||||
//Returns an integer given a hex input
|
||||
/proc/hex2num(hex)
|
||||
if (!( istext(hex) ))
|
||||
return
|
||||
// Concatenates a list of strings into a single string. A seperator may optionally be provided.
|
||||
/proc/list2text(list/ls, sep)
|
||||
if(ls.len <= 1) // Early-out code for empty or singleton lists.
|
||||
return ls.len ? ls[1] : ""
|
||||
|
||||
var/num = 0
|
||||
var/power = 0
|
||||
var/i = null
|
||||
i = length(hex)
|
||||
while(i > 0)
|
||||
var/char = copytext(hex, i, i + 1)
|
||||
switch(char)
|
||||
if("0")
|
||||
//Apparently, switch works with empty statements, yay! If that doesn't work, blame me, though. -- Urist
|
||||
if("9", "8", "7", "6", "5", "4", "3", "2", "1")
|
||||
num += text2num(char) * 16 ** power
|
||||
if("a", "A")
|
||||
num += 16 ** power * 10
|
||||
if("b", "B")
|
||||
num += 16 ** power * 11
|
||||
if("c", "C")
|
||||
num += 16 ** power * 12
|
||||
if("d", "D")
|
||||
num += 16 ** power * 13
|
||||
if("e", "E")
|
||||
num += 16 ** power * 14
|
||||
if("f", "F")
|
||||
num += 16 ** power * 15
|
||||
else
|
||||
return
|
||||
power++
|
||||
i--
|
||||
return num
|
||||
var/l = ls.len // Made local for sanic speed.
|
||||
var/i = 0 // Incremented every time a list index is accessed.
|
||||
|
||||
//Returns the hex value of a number given a value assumed to be a base-ten value
|
||||
/proc/num2hex(num, placeholder)
|
||||
if(sep != null)
|
||||
// Macros expand to long argument lists like so: sep, ls[++i], sep, ls[++i], sep, ls[++i], etc...
|
||||
#define S1 sep, ls[++i]
|
||||
#define S4 S1, S1, S1, S1
|
||||
#define S16 S4, S4, S4, S4
|
||||
#define S64 S16, S16, S16, S16
|
||||
|
||||
if (placeholder == null)
|
||||
placeholder = 2
|
||||
if (!( isnum(num) ))
|
||||
return
|
||||
if (!( num ))
|
||||
return "0"
|
||||
var/hex = ""
|
||||
var/i = 0
|
||||
while(16 ** i < num)
|
||||
i++
|
||||
var/power = null
|
||||
power = i - 1
|
||||
while(power >= 0)
|
||||
var/val = round(num / 16 ** power)
|
||||
num -= val * 16 ** power
|
||||
switch(val)
|
||||
if(9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0)
|
||||
hex += text("[]", val)
|
||||
if(10.0)
|
||||
hex += "A"
|
||||
if(11.0)
|
||||
hex += "B"
|
||||
if(12.0)
|
||||
hex += "C"
|
||||
if(13.0)
|
||||
hex += "D"
|
||||
if(14.0)
|
||||
hex += "E"
|
||||
if(15.0)
|
||||
hex += "F"
|
||||
else
|
||||
power--
|
||||
while(length(hex) < placeholder)
|
||||
hex = text("0[]", hex)
|
||||
return hex
|
||||
. = "[ls[++i]]" // Make sure the initial element is converted to text.
|
||||
|
||||
// Having the small concatenations come before the large ones boosted speed by an average of at least 5%.
|
||||
if(l-1 & 0x01) // 'i' will always be 1 here.
|
||||
. = text("[][][]", ., S1) // Append 1 element if the remaining elements are not a multiple of 2.
|
||||
if(l-i & 0x02)
|
||||
. = text("[][][][][]", ., S1, S1) // Append 2 elements if the remaining elements are not a multiple of 4.
|
||||
if(l-i & 0x04)
|
||||
. = text("[][][][][][][][][]", ., S4) // And so on....
|
||||
if(l-i & 0x08)
|
||||
. = text("[][][][][][][][][][][][][][][][][]", ., S4, S4)
|
||||
if(l-i & 0x10)
|
||||
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16)
|
||||
if(l-i & 0x20)
|
||||
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
|
||||
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16, S16)
|
||||
if(l-i & 0x40)
|
||||
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
|
||||
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
|
||||
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
|
||||
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64)
|
||||
while(l > i) // Chomp through the rest of the list, 128 elements at a time.
|
||||
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
|
||||
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
|
||||
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
|
||||
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
|
||||
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
|
||||
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
|
||||
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
|
||||
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64)
|
||||
|
||||
//Attaches each element of a list to a single string seperated by 'seperator'.
|
||||
/proc/dd_list2text(var/list/the_list, separator)
|
||||
var/total = the_list.len
|
||||
if(!total)
|
||||
return
|
||||
var/count = 2
|
||||
var/newText = "[the_list[1]]"
|
||||
while(count <= total)
|
||||
if(separator)
|
||||
newText += separator
|
||||
newText += "[the_list[count]]"
|
||||
count++
|
||||
return newText
|
||||
#undef S64
|
||||
#undef S16
|
||||
#undef S4
|
||||
#undef S1
|
||||
|
||||
else
|
||||
// Macros expand to long argument lists like so: ls[++i], ls[++i], ls[++i], etc...
|
||||
#define S1 ls[++i]
|
||||
#define S4 S1, S1, S1, S1
|
||||
#define S16 S4, S4, S4, S4
|
||||
#define S64 S16, S16, S16, S16
|
||||
|
||||
//slower then dd_list2text, but correctly processes associative lists.
|
||||
. = "[ls[++i]]" // Make sure the initial element is converted to text.
|
||||
|
||||
if(l-1 & 0x01) // 'i' will always be 1 here.
|
||||
. += S1 // Append 1 element if the remaining elements are not a multiple of 2.
|
||||
if(l-i & 0x02)
|
||||
. = text("[][][]", ., S1, S1) // Append 2 elements if the remaining elements are not a multiple of 4.
|
||||
if(l-i & 0x04)
|
||||
. = text("[][][][][]", ., S4) // And so on...
|
||||
if(l-i & 0x08)
|
||||
. = text("[][][][][][][][][]", ., S4, S4)
|
||||
if(l-i & 0x10)
|
||||
. = text("[][][][][][][][][][][][][][][][][]", ., S16)
|
||||
if(l-i & 0x20)
|
||||
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16, S16)
|
||||
if(l-i & 0x40)
|
||||
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
|
||||
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64)
|
||||
while(l > i) // Chomp through the rest of the list, 128 elements at a time.
|
||||
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
|
||||
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
|
||||
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
|
||||
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64)
|
||||
|
||||
#undef S64
|
||||
#undef S16
|
||||
#undef S4
|
||||
#undef S1
|
||||
|
||||
//slower then list2text, but correctly processes associative lists.
|
||||
proc/tg_list2text(list/list, glue=",")
|
||||
if(!istype(list) || !list.len)
|
||||
return
|
||||
@@ -122,56 +118,31 @@ proc/tg_list2text(list/list, glue=",")
|
||||
i++
|
||||
return output
|
||||
|
||||
//Converts a text string into a list by splitting the string at each seperator found in text (discarding the seperator)
|
||||
//Returns an empty list if the text cannot be split, or the split text in a list.
|
||||
//Not giving a "" seperator will cause the text to be broken into a list of single letters.
|
||||
/proc/text2list(text, seperator="\n")
|
||||
//Converts a string into a list by splitting the string at each delimiter found. (discarding the seperator)
|
||||
/proc/text2list(text, delimiter="\n")
|
||||
var/delim_len = length(delimiter)
|
||||
if(delim_len < 1) return list(text)
|
||||
. = list()
|
||||
var/last_found = 1
|
||||
var/found
|
||||
do
|
||||
found = findtext(text, delimiter, last_found, 0)
|
||||
. += copytext(text, last_found, found)
|
||||
last_found = found + delim_len
|
||||
while(found)
|
||||
|
||||
var/text_len = length(text) //length of the input text
|
||||
var/seperator_len = length(seperator) //length of the seperator text
|
||||
|
||||
if(text_len >= seperator_len)
|
||||
var/i
|
||||
var/last_i = 1
|
||||
|
||||
for(i=1,i<=(text_len+1-seperator_len),i++)
|
||||
if( cmptext(copytext(text,i,i+seperator_len), seperator) )
|
||||
if(i != last_i)
|
||||
. += copytext(text,last_i,i)
|
||||
last_i = i + seperator_len
|
||||
|
||||
if(last_i <= text_len)
|
||||
. += copytext(text, last_i, 0)
|
||||
else
|
||||
. += text
|
||||
return .
|
||||
|
||||
//Converts a text string into a list by splitting the string at each seperator found in text (discarding the seperator)
|
||||
//Returns an empty list if the text cannot be split, or the split text in a list.
|
||||
//Not giving a "" seperator will cause the text to be broken into a list of single letters.
|
||||
//Case Sensitive!
|
||||
/proc/text2listEx(text, seperator="\n")
|
||||
/proc/text2listEx(text, delimiter="\n")
|
||||
var/delim_len = length(delimiter)
|
||||
if(delim_len < 1) return list(text)
|
||||
. = list()
|
||||
|
||||
var/text_len = length(text) //length of the input text
|
||||
var/seperator_len = length(seperator) //length of the seperator text
|
||||
|
||||
if(text_len >= seperator_len)
|
||||
var/i
|
||||
var/last_i = 1
|
||||
|
||||
for(i=1,i<=(text_len+1-seperator_len),i++)
|
||||
if( cmptextEx(copytext(text,i,i+seperator_len), seperator) )
|
||||
if(i != last_i)
|
||||
. += copytext(text,last_i,i)
|
||||
last_i = i + seperator_len
|
||||
|
||||
if(last_i <= text_len)
|
||||
. += copytext(text, last_i, 0)
|
||||
else
|
||||
. += text
|
||||
return .
|
||||
var/last_found = 1
|
||||
var/found
|
||||
do
|
||||
found = findtextEx(text, delimiter, last_found, 0)
|
||||
. += copytext(text, last_found, found)
|
||||
last_found = found + delim_len
|
||||
while(found)
|
||||
|
||||
//Splits the text of a file at seperator and returns them in a list.
|
||||
/proc/file2list(filename, seperator="\n")
|
||||
|
||||
@@ -4,34 +4,6 @@
|
||||
* A large number of misc global procs.
|
||||
*/
|
||||
|
||||
//Inverts the colour of an HTML string
|
||||
/proc/invertHTML(HTMLstring)
|
||||
|
||||
if (!( istext(HTMLstring) ))
|
||||
CRASH("Given non-text argument!")
|
||||
return
|
||||
else
|
||||
if (length(HTMLstring) != 7)
|
||||
CRASH("Given non-HTML argument!")
|
||||
return
|
||||
var/textr = copytext(HTMLstring, 2, 4)
|
||||
var/textg = copytext(HTMLstring, 4, 6)
|
||||
var/textb = copytext(HTMLstring, 6, 8)
|
||||
var/r = hex2num(textr)
|
||||
var/g = hex2num(textg)
|
||||
var/b = hex2num(textb)
|
||||
textr = num2hex(255 - r)
|
||||
textg = num2hex(255 - g)
|
||||
textb = num2hex(255 - b)
|
||||
if (length(textr) < 2)
|
||||
textr = text("0[]", textr)
|
||||
if (length(textg) < 2)
|
||||
textr = text("0[]", textg)
|
||||
if (length(textb) < 2)
|
||||
textr = text("0[]", textb)
|
||||
return text("#[][][]", textr, textg, textb)
|
||||
return
|
||||
|
||||
//Returns the middle-most value
|
||||
/proc/dd_range(var/low, var/high, var/num)
|
||||
return max(low,min(high,num))
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
var/log_access = 0 // log login/logout
|
||||
var/log_say = 0 // log client say
|
||||
var/log_admin = 0 // log admin actions
|
||||
var/log_admin_only = FALSE
|
||||
var/log_debug = 1 // log debug output
|
||||
var/log_game = 0 // log game events
|
||||
var/log_vote = 0 // log voting
|
||||
@@ -147,6 +148,11 @@
|
||||
var/assistantlimit = 0 //enables assistant limiting
|
||||
var/assistantratio = 2 //how many assistants to security members
|
||||
|
||||
var/emag_energy = -1
|
||||
var/emag_starts_charged = 1
|
||||
var/emag_recharge_rate = 0
|
||||
var/emag_recharge_ticks = 0
|
||||
|
||||
/datum/configuration/New()
|
||||
. = ..()
|
||||
var/list/L = typesof(/datum/game_mode) - /datum/game_mode
|
||||
@@ -197,7 +203,7 @@
|
||||
if(type == "config")
|
||||
switch (name)
|
||||
if ("resource_urls")
|
||||
config.resource_urls = stringsplit(value, " ")
|
||||
config.resource_urls = text2list(value, " ")
|
||||
|
||||
if ("admin_legacy_system")
|
||||
config.admin_legacy_system = 1
|
||||
@@ -229,6 +235,9 @@
|
||||
if ("log_admin")
|
||||
config.log_admin = 1
|
||||
|
||||
if("log_admin_only")
|
||||
config.log_admin_only = TRUE
|
||||
|
||||
if ("log_debug")
|
||||
config.log_debug = text2num(value)
|
||||
|
||||
@@ -544,6 +553,14 @@
|
||||
config.limbs_can_break = value
|
||||
if("respawn_delay")
|
||||
config.respawn_delay = value
|
||||
if("emag_energy")
|
||||
config.emag_energy = value
|
||||
if("emag_starts_charged")
|
||||
config.emag_starts_charged = value
|
||||
if("emag_recharge_rate")
|
||||
config.emag_recharge_rate = value
|
||||
if("emag_recharge_ticks")
|
||||
config.emag_recharge_ticks = value
|
||||
else
|
||||
diary << "Unknown setting in configuration: '[name]'"
|
||||
|
||||
|
||||
@@ -109,6 +109,7 @@ datum/controller/game_controller/proc/setup_objects()
|
||||
for(var/atom/movable/object in world)
|
||||
object.initialize()
|
||||
|
||||
|
||||
world << "\red \b Initializing pipe networks"
|
||||
sleep(-1)
|
||||
for(var/obj/machinery/atmospherics/machine in machines)
|
||||
|
||||
@@ -296,7 +296,7 @@ var/list/advance_cures = list(
|
||||
for(var/datum/symptom/S in symptoms)
|
||||
L += S.id
|
||||
L = sortList(L) // Sort the list so it doesn't matter which order the symptoms are in.
|
||||
var/result = dd_list2text(L, ":")
|
||||
var/result = list2text(L, ":")
|
||||
id = result
|
||||
return result
|
||||
|
||||
|
||||
@@ -229,7 +229,7 @@
|
||||
if (!istype(user.loc,/turf))
|
||||
user << "<span class='warning'> You do not have enough space to write a proper rune.</span>"
|
||||
return
|
||||
var/list/runes = list("Teleport", "Item Teleport", "Spawn a Tome", "Change Construct Type", "Convert", "EMP", "Drain Blood", "See Invisible", "Resurrect", "Hide Runes", "Reveal Runes", "Astral Journey", "Manifest a Ghost", "Imbue Talisman", "Sacrifice", "Wall", "Free Cultist", "Summon Cultist", "Deafen", "Blind", "BloodBoil", "Communicate", "Stun")
|
||||
var/list/runes = list("Teleport", "Teleport Other", "Spawn a Tome", "Change Construct Type", "Convert", "EMP", "Drain Blood", "See Invisible", "Resurrect", "Hide Runes", "Reveal Runes", "Astral Journey", "Manifest a Ghost", "Imbue Talisman", "Sacrifice", "Wall", "Free Cultist", "Summon Cultist", "Deafen", "Blind", "BloodBoil", "Communicate", "Stun")
|
||||
r = input("Choose a rune to scribe", "Rune Scribing") in runes //not cancellable.
|
||||
var/obj/effect/rune/R = new /obj/effect/rune(user.loc)
|
||||
switch(r)
|
||||
@@ -244,7 +244,7 @@
|
||||
R.word2=cultwords["self"]
|
||||
R.word3=beacon
|
||||
R.check_icon()
|
||||
if("Item Teleport")
|
||||
if("Teleport Other")
|
||||
if(user.runecooldown >= 10)
|
||||
user.runecooldown = 0
|
||||
var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri")
|
||||
|
||||
@@ -169,8 +169,12 @@ var/list/all_supply_groups = list("Supplies","Clothing","Security","Hospitality"
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/clothing/mask/gas)
|
||||
cost = 35
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/machinery/bot/floorbot,
|
||||
/obj/machinery/bot/floorbot,
|
||||
/obj/machinery/bot/medbot,
|
||||
/obj/machinery/bot/medbot)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/internals
|
||||
containername = "Emergency Crate"
|
||||
group = "Supplies"
|
||||
@@ -337,17 +341,18 @@ var/list/all_supply_groups = list("Supplies","Clothing","Security","Hospitality"
|
||||
group = "Hydroponics"
|
||||
|
||||
/datum/supply_packs/exoticseeds
|
||||
name = "Exotic Seeds Crate"
|
||||
contains = list(/obj/item/seeds/nettleseed,
|
||||
name = "Exotic seeds crate"
|
||||
contains = list(/obj/item/seeds/replicapod,
|
||||
/obj/item/seeds/replicapod,
|
||||
/obj/item/seeds/replicapod,
|
||||
/obj/item/seeds/replicapod,
|
||||
/obj/item/seeds/plumpmycelium,
|
||||
/obj/item/seeds/libertymycelium,
|
||||
/obj/item/seeds/amanitamycelium,
|
||||
/obj/item/seeds/reishimycelium,
|
||||
/obj/item/seeds/bananaseed,
|
||||
/obj/item/seeds/eggyseed)
|
||||
/obj/item/seeds/random,
|
||||
/obj/item/seeds/random,
|
||||
/obj/item/seeds/random,
|
||||
/obj/item/seeds/random,
|
||||
/obj/item/seeds/random,
|
||||
/obj/item/seeds/random,
|
||||
/obj/item/seeds/kudzuseed)
|
||||
cost = 15
|
||||
containertype = /obj/structure/closet/crate/hydroponics
|
||||
containername = "Exotic Seeds crate"
|
||||
@@ -859,6 +864,7 @@ var/list/all_supply_groups = list("Supplies","Clothing","Security","Hospitality"
|
||||
containername = "Arts and Crafts crate"
|
||||
group = "Supplies"
|
||||
|
||||
|
||||
/datum/supply_packs/randomised/contraband
|
||||
num_contained = 5
|
||||
contains = list(/obj/item/seeds/bloodtomatoseed,
|
||||
|
||||
@@ -46,10 +46,10 @@ var/list/uplink_items = list()
|
||||
var/list/gamemodes = list() // Empty list means it is in all the gamemodes. Otherwise place the gamemode name here.
|
||||
var/list/job = null
|
||||
|
||||
/datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/device/uplink/U)
|
||||
/datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/device/uplink/U, mob/user)
|
||||
U.uses -= max(cost, 0)
|
||||
feedback_add_details("traitor_uplink_items_bought", name)
|
||||
return new item(loc)
|
||||
return new item(loc,user)
|
||||
|
||||
/datum/uplink_item/proc/buy(var/obj/item/device/uplink/hidden/U, var/mob/user)
|
||||
|
||||
@@ -69,7 +69,7 @@ var/list/uplink_items = list()
|
||||
if(cost > U.uses)
|
||||
return 0
|
||||
|
||||
var/obj/I = spawn_item(get_turf(user), U)
|
||||
var/obj/I = spawn_item(get_turf(user), U, user)
|
||||
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/A = user
|
||||
@@ -90,6 +90,14 @@ var/list/uplink_items = list()
|
||||
/datum/uplink_item/jobspecific
|
||||
category = "Job Specific Tools"
|
||||
|
||||
//Shaft Miner
|
||||
/datum/uplink_item/jobspecific/mastertrainer
|
||||
name = "Master Trainer's Belt"
|
||||
desc = "A Trainer's belt containing 6 random hostile mobs loyal to you alone."
|
||||
item = /obj/item/weapon/storage/belt/lazarus/antag
|
||||
cost = 4
|
||||
job = list("Shaft Miner")
|
||||
|
||||
//Clown
|
||||
/datum/uplink_item/jobspecific/clowngrenade
|
||||
name = "1 Banana Grenade"
|
||||
@@ -117,7 +125,7 @@ var/list/uplink_items = list()
|
||||
/datum/uplink_item/jobspecific/ambrosiacruciatus
|
||||
name = "Ambrosia Cruciatus Seeds"
|
||||
desc = "Part of the notorious Ambrosia family, this species is nearly indistinguishable from Ambrosia Vulgaris- but its' branches contain a revolting toxin. Eight units are enough to drive victims insane after a three-minute delay."
|
||||
item = /obj/item/seeds/ambrosiavulgarisseed/cruciatus
|
||||
item = /obj/item/seeds/ambrosiacruciatusseed
|
||||
cost = 2
|
||||
job = list("Botanist")
|
||||
|
||||
|
||||
@@ -1218,7 +1218,7 @@
|
||||
if(istype(user.loc,/turf/space))
|
||||
return
|
||||
user << "<span class='notice'>You plant the kudzu. You monster.</span>"
|
||||
new /obj/effect/spacevine_controller(user.loc)
|
||||
new /obj/effect/plantsegment_controller(user.loc)
|
||||
del(src)
|
||||
|
||||
|
||||
|
||||
@@ -804,8 +804,8 @@
|
||||
attack_verb = list("chopped", "sliced", "cut", "reaped")
|
||||
|
||||
/obj/item/weapon/scythe/afterattack(atom/A, mob/user as mob)
|
||||
if(istype(A, /obj/effect/spacevine))
|
||||
for(var/obj/effect/spacevine/B in orange(A,1))
|
||||
if(istype(A, /obj/effect/plantsegment))
|
||||
for(var/obj/effect/plantsegment/B in orange(A,1))
|
||||
if(prob(80))
|
||||
del B
|
||||
del A
|
||||
|
||||
@@ -485,6 +485,11 @@ its easier to just keep the beam vertical.
|
||||
//returns 1 if made bloody, returns 0 otherwise
|
||||
/atom/proc/add_blood(mob/living/carbon/human/M as mob)
|
||||
.=1
|
||||
if(!M)//if the blood is of non-human source
|
||||
if(!blood_DNA || !istype(blood_DNA, /list))
|
||||
blood_DNA = list()
|
||||
blood_color = "#A10808"
|
||||
return 1
|
||||
if (!( istype(M, /mob/living/carbon/human) ))
|
||||
return 0
|
||||
if (!istype(M.dna, /datum/dna))
|
||||
|
||||
@@ -259,7 +259,7 @@
|
||||
suffix = copytext(cword,length(cword)-1,length(cword) )
|
||||
if(length(cword))
|
||||
rearranged += cword
|
||||
return "[prefix][uppertext(dd_list2text(rearranged," "))]!!"
|
||||
return "[prefix][uppertext(list2text(rearranged," "))]!!"
|
||||
|
||||
// WAS: /datum/bioEffect/toxic_farts
|
||||
/datum/dna/gene/disability/toxic_farts
|
||||
|
||||
@@ -96,7 +96,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
|
||||
del(src)
|
||||
return
|
||||
else if(istype(I, /obj/item/weapon/nullrod))
|
||||
user << "\blue You disrupt the vile magic with the deadening field of the null rod!"
|
||||
user << "<span class='notice'>You disrupt the vile magic with the deadening field of the null rod!</span>"
|
||||
del(src)
|
||||
return
|
||||
return
|
||||
@@ -178,7 +178,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
|
||||
else
|
||||
usr.whisper(pick("B'ADMINES SP'WNIN SH'T","IC'IN O'OC","RO'SHA'M I'SA GRI'FF'N ME'AI","TOX'IN'S O'NM FI'RAH","IA BL'AME TOX'IN'S","FIR'A NON'AN RE'SONA","A'OI I'RS ROUA'GE","LE'OAN JU'STA SP'A'C Z'EE SH'EF","IA PT'WOBEA'RD, IA A'DMI'NEH'LP"))
|
||||
for (var/mob/V in viewers(src))
|
||||
V.show_message("\red The markings pulse with a small burst of light, then fall dark.", 3, "\red You hear a faint fizzle.", 2)
|
||||
V.show_message("<span class='warning'>The markings pulse with a small burst of light, then fall dark.</span>", 3, "<span class='warning'>You hear a faint fizzle.</span>", 2)
|
||||
return
|
||||
|
||||
/obj/effect/rune/proc/check_icon()
|
||||
@@ -356,8 +356,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
|
||||
if(istype(M,/mob/dead))
|
||||
M.invisibility = 0
|
||||
user.visible_message( \
|
||||
"\red [user] drags the ghost to our plan of reality!", \
|
||||
"\red You drag the ghost to our plan of reality!" \
|
||||
"<span class='warning'>[user] drags the ghost to our plan of reality!</span>", \
|
||||
"<span class='warning'>You drag the ghost to our plan of reality!</span>" \
|
||||
)
|
||||
return
|
||||
if(!istype(M))
|
||||
|
||||
@@ -34,7 +34,7 @@ var/list/sacrificed = list()
|
||||
allrunesloc.len = index
|
||||
allrunesloc[index] = R.loc
|
||||
if(index >= 5)
|
||||
user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric"
|
||||
user << "<span class='warning'>You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric</span>"
|
||||
if (istype(user, /mob/living))
|
||||
user.take_overall_damage(5, 0)
|
||||
del(src)
|
||||
@@ -51,7 +51,10 @@ var/list/sacrificed = list()
|
||||
user.visible_message("<span class='warning'> [user] disappears in a flash of red light!</span>", \
|
||||
"<span class='warning'> You feel as your body gets dragged through a tunnel of viscera !</span>", \
|
||||
"<span class='warning'> You hear a sickening crunch and sloshing of viscera.</span>")
|
||||
invocation("rune_teleport")
|
||||
|
||||
if(istype(src,/obj/effect/rune))
|
||||
invocation("rune_teleport")
|
||||
|
||||
user.loc = allrunesloc[rand(1,index)]
|
||||
return
|
||||
if(istype(src,/obj/effect/rune))
|
||||
@@ -70,6 +73,7 @@ var/list/sacrificed = list()
|
||||
var/runecount = 0
|
||||
var/obj/effect/rune/IP = null
|
||||
var/mob/living/user = usr
|
||||
var/swapping[] = null
|
||||
for(var/obj/effect/rune/R in world)
|
||||
if(R == src)
|
||||
continue
|
||||
@@ -77,7 +81,7 @@ var/list/sacrificed = list()
|
||||
IP = R
|
||||
runecount++
|
||||
if(runecount >= 2)
|
||||
user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric"
|
||||
user << "<span class='warning'>You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric</span>"
|
||||
if (istype(user, /mob/living))
|
||||
user.take_overall_damage(5, 0)
|
||||
del(src)
|
||||
@@ -86,14 +90,29 @@ var/list/sacrificed = list()
|
||||
culcount++
|
||||
if(culcount>=3)
|
||||
user.say("Sas[pick("'","`")]so c'arta forbici tarem!")
|
||||
user.visible_message("\red You feel air moving from the rune - like as it was swapped with somewhere else.", \
|
||||
"\red You feel air moving from the rune - like as it was swapped with somewhere else.", \
|
||||
"\red You smell ozone.")
|
||||
for(var/obj/O in src.loc)
|
||||
user.visible_message("<span class='warning'>You feel air moving from the rune - like as it was swapped with somewhere else.</span>", \
|
||||
"<span class='warning'>You feel air moving from the rune - like as it was swapped with somewhere else.</span>", \
|
||||
"<span class='warning'>You smell ozone.</span>")
|
||||
|
||||
swapping = list()
|
||||
for(var/obj/O in IP.loc)//filling a list with all the teleportable atoms on the other rune
|
||||
if(!O.anchored)
|
||||
swapping += O
|
||||
for(var/mob/M in IP.loc)
|
||||
swapping += M
|
||||
|
||||
for(var/obj/O in src.loc)//sending the items on the rune to the other rune
|
||||
if(!O.anchored)
|
||||
O.loc = IP.loc
|
||||
for(var/mob/M in src.loc)
|
||||
M.loc = IP.loc
|
||||
|
||||
for(var/obj/O in swapping)//bringing the items previously marked from the other rune to our rune
|
||||
O.loc = src.loc
|
||||
for(var/mob/M in swapping)
|
||||
M.loc = src.loc
|
||||
|
||||
swapping = 0
|
||||
return
|
||||
return fizzle()
|
||||
|
||||
@@ -105,9 +124,9 @@ var/list/sacrificed = list()
|
||||
usr.say("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!")
|
||||
else
|
||||
usr.whisper("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!")
|
||||
usr.visible_message("\red Rune disappears with a flash of red light, and in its place now a book lies.", \
|
||||
"\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a book.", \
|
||||
"\red You hear a pop and smell ozone.")
|
||||
usr.visible_message("<span class='warning'>Rune disappears with a flash of red light, and in its place now a book lies.</span>", \
|
||||
"<span class='warning'>You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a book.</span>", \
|
||||
"<span class='warning'>You hear a pop and smell ozone.</span>")
|
||||
if(istype(src,/obj/effect/rune))
|
||||
new /obj/item/weapon/tome(src.loc)
|
||||
else
|
||||
@@ -127,9 +146,9 @@ var/list/sacrificed = list()
|
||||
continue
|
||||
invocation("rune_convert")
|
||||
usr.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
|
||||
M.visible_message("\red [M] writhes in pain as the markings below him glow a bloody red.", \
|
||||
"\red AAAAAAHHHH!.", \
|
||||
"\red You hear an anguished scream.")
|
||||
M.visible_message("<span class='warning'>[M] writhes in pain as the markings below him glow a bloody red.</span>", \
|
||||
"<span class='danger'>AAAAAAHHHH!.</span>", \
|
||||
"<span class='warning'>You hear an anguished scream.</span>")
|
||||
if(is_convertable_to_cult(M.mind) && !jobban_isbanned(M, "cultist"))//putting jobban check here because is_convertable uses mind as argument
|
||||
ticker.mode.add_cultist(M.mind)
|
||||
M.mind.special_role = "Cultist"
|
||||
@@ -139,7 +158,7 @@ var/list/sacrificed = list()
|
||||
return 1
|
||||
else
|
||||
M << "<span class='sinister'>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</span>"
|
||||
M << "<font color=\"red\"><b>And you were able to force it out of your mind. You now know the truth, there's something horrible out there, stop it and its minions at all costs.</b></font>"
|
||||
M << "<span class='warning'><b>And you were able to force it out of your mind. You now know the truth, there's something horrible out there, stop it and its minions at all costs.</b></span>"
|
||||
return 0
|
||||
|
||||
usr.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
|
||||
@@ -194,22 +213,22 @@ var/list/sacrificed = list()
|
||||
for(var/mob/living/carbon/D in R.loc)
|
||||
if(D.stat!=2)
|
||||
var/bdrain = rand(1,25)
|
||||
D << "\red You feel weakened."
|
||||
D << "<span class='warning'>You feel weakened.</span>"
|
||||
D.take_overall_damage(bdrain, 0)
|
||||
drain += bdrain
|
||||
if(!drain)
|
||||
return fizzle()
|
||||
usr.say ("Yu[pick("'","`")]gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!")
|
||||
usr.visible_message("\red Blood flows from the rune into [usr]!", \
|
||||
"\red The blood starts flowing from the rune and into your frail mortal body. You feel... empowered.", \
|
||||
"\red You hear a liquid flowing.")
|
||||
"<span class='warning'>The blood starts flowing from the rune and into your frail mortal body. You feel... empowered.</span>", \
|
||||
"<span class='warning'>You hear a liquid flowing.</span>")
|
||||
var/mob/living/user = usr
|
||||
if(user.bhunger)
|
||||
user.bhunger = max(user.bhunger-2*drain,0)
|
||||
if(drain>=50)
|
||||
user.visible_message("\red [user]'s eyes give off eerie red glow!", \
|
||||
"\red ...but it wasn't nearly enough. You crave, crave for more. The hunger consumes you from within.", \
|
||||
"\red You hear a heartbeat.")
|
||||
"<span class='warning'>...but it wasn't nearly enough. You crave, crave for more. The hunger consumes you from within.</span>", \
|
||||
"<span class='warning'>You hear a heartbeat.</span>")
|
||||
user.bhunger += drain
|
||||
src = user
|
||||
spawn()
|
||||
@@ -235,22 +254,22 @@ var/list/sacrificed = list()
|
||||
if(usr.loc==src.loc)
|
||||
if(usr.seer==1)
|
||||
usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium viortia.")
|
||||
usr << "\red The world beyond fades from your vision."
|
||||
usr << "<span class='warning'>The world beyond fades from your vision.</span>"
|
||||
usr.see_invisible = SEE_INVISIBLE_LIVING
|
||||
usr.seer = 0
|
||||
else if(usr.see_invisible!=SEE_INVISIBLE_LIVING)
|
||||
usr << "\red The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision."
|
||||
usr << "<span class='warning'>The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision.</span>"
|
||||
usr.see_invisible = SEE_INVISIBLE_OBSERVER
|
||||
usr.seer = 0
|
||||
else
|
||||
usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium vivira. Itonis al'ra matum!")
|
||||
usr << "\red The world beyond opens to your eyes."
|
||||
usr << "<span class='warning'>The world beyond opens to your eyes.</span>"
|
||||
usr.see_invisible = SEE_INVISIBLE_OBSERVER
|
||||
usr.seer = 1
|
||||
return
|
||||
usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium vivira. Itonis al'ra matum!")
|
||||
usr.show_message("\red The markings pulse with a small burst of light, then fall dark.", 3, "\red You hear a faint fizzle.", 2)
|
||||
usr << "<span class='note'> You remembered the words correctly, but the rune isn't reacting. Maybe you should position yourself differently.</span>"
|
||||
usr.show_message("\<span class='warning'>The markings pulse with a small burst of light, then fall dark.</span>", 3, "<span class='warning'>You hear a faint fizzle.</span>", 2)
|
||||
usr << "<span class='notice'> You remembered the words correctly, but the rune isn't reacting. Maybe you should position yourself differently.</span>"
|
||||
|
||||
/////////////////////////////////////////EIGHTH RUNE
|
||||
|
||||
@@ -270,7 +289,7 @@ var/list/sacrificed = list()
|
||||
break
|
||||
if(!corpse_to_raise)
|
||||
if(is_sacrifice_target)
|
||||
usr << "\red The Geometer of blood wants this mortal for himself."
|
||||
usr << "<span class='warning'>The Geometer of blood wants this mortal for himself.</span>"
|
||||
return fizzle()
|
||||
|
||||
|
||||
@@ -288,9 +307,9 @@ var/list/sacrificed = list()
|
||||
|
||||
if(!body_to_sacrifice)
|
||||
if (is_sacrifice_target)
|
||||
usr << "\red The Geometer of blood wants that corpse for himself."
|
||||
usr << "<span class='warning'>The Geometer of blood wants that corpse for himself.</span>"
|
||||
else
|
||||
usr << "\red The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used."
|
||||
usr << "<span class='warning'>The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used.</span>"
|
||||
return fizzle()
|
||||
|
||||
var/mob/dead/observer/ghost
|
||||
@@ -301,7 +320,7 @@ var/list/sacrificed = list()
|
||||
break
|
||||
|
||||
if(!ghost)
|
||||
usr << "\red You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie."
|
||||
usr << "<span class='warning'>You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie.</span>"
|
||||
return fizzle()
|
||||
|
||||
corpse_to_raise.revive()
|
||||
@@ -309,12 +328,12 @@ var/list/sacrificed = list()
|
||||
corpse_to_raise.key = ghost.key //the corpse will keep its old mind! but a new player takes ownership of it (they are essentially possessed)
|
||||
//This means, should that player leave the body, the original may re-enter
|
||||
usr.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!")
|
||||
corpse_to_raise.visible_message("\red [corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.", \
|
||||
"\red Life... I'm alive again...", \
|
||||
"\red You hear a faint, slightly familiar whisper.")
|
||||
body_to_sacrifice.visible_message("\red [body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from his remains!", \
|
||||
"\red You feel as your blood boils, tearing you apart.", \
|
||||
"\red You hear a thousand voices, all crying in pain.")
|
||||
corpse_to_raise.visible_message("<span class='warning'>[corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.</span>", \
|
||||
"<span class='warning'>Life... I am alive again...</span>", \
|
||||
"<span class='warning'>You hear a faint, slightly familiar whisper.</span>")
|
||||
body_to_sacrifice.visible_message("<span class='warning'>[body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from his remains!</span>", \
|
||||
"<span class='warning'>You feel as your blood boils, tearing you apart.</span>", \
|
||||
"<span class='warning'>You hear a thousand voices, all crying in pain.</span>")
|
||||
body_to_sacrifice.gib()
|
||||
|
||||
// if(ticker.mode.name == "cult")
|
||||
@@ -346,10 +365,10 @@ var/list/sacrificed = list()
|
||||
del(src)
|
||||
else
|
||||
usr.whisper("Kla[pick("'","`")]atu barada nikt'o!")
|
||||
usr << "\red Your talisman turns into gray dust, veiling the surrounding runes."
|
||||
usr << "<span class='warning'>Your talisman turns into gray dust, veiling the surrounding runes.</span>"
|
||||
for (var/mob/V in orange(1,src))
|
||||
if(V!=usr)
|
||||
V.show_message("\red Dust emanates from [usr]'s hands for a moment.", 3)
|
||||
V.show_message("<span class='warning'>Dust emanates from [usr]'s hands for a moment.</span>", 3)
|
||||
|
||||
return
|
||||
if(istype(src,/obj/effect/rune))
|
||||
@@ -364,9 +383,9 @@ var/list/sacrificed = list()
|
||||
if(usr.loc==src.loc)
|
||||
var/mob/living/carbon/human/L = usr
|
||||
usr.say("Fwe[pick("'","`")]sh mah erl nyag r'ya!")
|
||||
usr.visible_message("\red [usr]'s eyes glow blue as \he freezes in place, absolutely motionless.", \
|
||||
"\red The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry...", \
|
||||
"\red You hear only complete silence for a moment.")
|
||||
usr.visible_message("<span class='warning'>[usr]'s eyes glow blue as \he freezes in place, absolutely motionless.</span>", \
|
||||
"<span class='warning'>The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry...</span>", \
|
||||
"<span class='warning'>You hear only complete silence for a moment.</span>")
|
||||
usr.ghostize(1)
|
||||
L.ajourn = 1
|
||||
while(L)
|
||||
@@ -452,9 +471,9 @@ var/list/sacrificed = list()
|
||||
user.take_organ_damage(1, 0)
|
||||
sleep(30)
|
||||
if(D)
|
||||
D.visible_message("\red [D] slowly dissipates into dust and bones.", \
|
||||
"\red You feel pain, as bonds formed between your soul and this homunculus break.", \
|
||||
"\red You hear faint rustle.")
|
||||
D.visible_message("<span class='warning'>[D] slowly dissipates into dust and bones.</span>", \
|
||||
"<span class='warning'>You feel pain, as bonds formed between your soul and this homunculus break.</span>", \
|
||||
"<span class='warning'>You hear faint rustle.</span>")
|
||||
D.dust()
|
||||
return
|
||||
|
||||
@@ -475,7 +494,7 @@ var/list/sacrificed = list()
|
||||
unsuitable_newtalisman = 1
|
||||
if (!newtalisman)
|
||||
if (unsuitable_newtalisman)
|
||||
usr << "\red The blank is tainted. It is unsuitable."
|
||||
usr << "<span class='warning'>The blank is tainted. It is unsuitable.</span>"
|
||||
return fizzle()
|
||||
|
||||
if (istype(newtalisman, /obj/item/weapon/paper/nano))//I mean, cult and technology don't mix well together right?
|
||||
@@ -539,7 +558,7 @@ var/list/sacrificed = list()
|
||||
break
|
||||
if (imbued_from)
|
||||
for (var/mob/V in viewers(src))
|
||||
V.show_message("\red The runes turn into dust, which then forms into an arcane image on the paper.", 3)
|
||||
V.show_message("<span class='warning'>The runes turn into dust, which then forms into an arcane image on the paper.</span>", 3)
|
||||
usr.say("H'drak v[pick("'","`")]loso, mir'kanas verbot!")
|
||||
del(imbued_from)
|
||||
del(newtalisman)
|
||||
@@ -555,9 +574,9 @@ var/list/sacrificed = list()
|
||||
user.say("Uhrast ka'hfa heldsagen ver[pick("'","`")]lot!")
|
||||
user.take_overall_damage(200, 0)
|
||||
runedec+=10
|
||||
user.visible_message("\red [user] keels over dead, his blood glowing blue as it escapes his body and dissipates into thin air.", \
|
||||
"\red In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.", \
|
||||
"\red You hear faint rustle.")
|
||||
user.visible_message("<span class='warning'>[user] keels over dead, his blood glowing blue as it escapes his body and dissipates into thin air.</span>", \
|
||||
"<span class='warning'>In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.</span>", \
|
||||
"<span class='warning'>You hear faint rustle.</span>")
|
||||
for(,user.stat==2)
|
||||
sleep(600)
|
||||
if (!user)
|
||||
@@ -589,7 +608,7 @@ var/list/sacrificed = list()
|
||||
usr.whisper("[input]")
|
||||
for(var/datum/mind/H in ticker.mode.cult)
|
||||
if (H.current)
|
||||
H.current << "\red \b [input]"
|
||||
H.current << "<span class='sinister'> \b [input]</span>"//changed from red to purple - Deity Link
|
||||
del(src)
|
||||
return 1
|
||||
|
||||
@@ -626,19 +645,19 @@ var/list/sacrificed = list()
|
||||
else
|
||||
H.gib()
|
||||
invocation("rune_sac")
|
||||
usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
|
||||
usr << "<span class='warning'>The Geometer of Blood accepts this sacrifice, your objective is now complete.</span>"
|
||||
else
|
||||
usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
|
||||
usr << "<span class='warning'>Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual.</span>"
|
||||
else
|
||||
if(cultsinrange.len >= 3)
|
||||
if(H.stat !=2)
|
||||
invocation("rune_sac")
|
||||
if(prob(80))
|
||||
usr << "\red The Geometer of Blood accepts this sacrifice."
|
||||
usr << "<span class='warning'>The Geometer of Blood accepts this sacrifice.</span>"
|
||||
ticker.mode:grant_runeword(usr)
|
||||
else
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
usr << "\red However, this soul was not enough to gain His favor."
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='warning'>However, this soul was not enough to gain His favor.</span>"
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
else
|
||||
@@ -646,26 +665,26 @@ var/list/sacrificed = list()
|
||||
else
|
||||
invocation("rune_sac")
|
||||
if(prob(40))
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
ticker.mode:grant_runeword(usr)
|
||||
else
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
usr << "\red However, a mere dead body is not enough to satisfy Him."
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='warning'>However, a mere dead body is not enough to satisfy Him.</span>"
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
else
|
||||
H.gib()
|
||||
else
|
||||
if(H.stat !=2)
|
||||
usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
|
||||
usr << "<span class='warning'>The victim is still alive, you will need more cultists chanting for the sacrifice to succeed.</span>"
|
||||
else
|
||||
invocation("rune_sac")
|
||||
if(prob(40))
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
ticker.mode:grant_runeword(usr)
|
||||
else
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
usr << "\red However, a mere dead body is not enough to satisfy Him."
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='warning'>However, a mere dead body is not enough to satisfy Him.</span>"
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
else
|
||||
@@ -675,11 +694,11 @@ var/list/sacrificed = list()
|
||||
if(H.stat !=2)
|
||||
invocation("rune_sac")
|
||||
if(prob(80))
|
||||
usr << "\red The Geometer of Blood accepts this sacrifice."
|
||||
usr << "<span class='warning'>The Geometer of Blood accepts this sacrifice.</span>"
|
||||
ticker.mode:grant_runeword(usr)
|
||||
else
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
usr << "\red However, this soul was not enough to gain His favor."
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='warning'>However, this soul was not enough to gain His favor.</span>"
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
else
|
||||
@@ -687,26 +706,26 @@ var/list/sacrificed = list()
|
||||
else
|
||||
invocation("rune_sac")
|
||||
if(prob(40))
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
ticker.mode:grant_runeword(usr)
|
||||
else
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
usr << "\red However, a mere dead body is not enough to satisfy Him."
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='warning'>However, a mere dead body is not enough to satisfy Him.</span>"
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
else
|
||||
H.gib()
|
||||
else
|
||||
if(H.stat !=2)
|
||||
usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
|
||||
usr << "<span class='warning'>The victim is still alive, you will need more cultists chanting for the sacrifice to succeed.</span>"
|
||||
else
|
||||
invocation("rune_sac")
|
||||
if(prob(40))
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
ticker.mode:grant_runeword(usr)
|
||||
else
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
usr << "\red However, a mere dead body is not enough to satisfy Him."
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='warning'>However, a mere dead body is not enough to satisfy Him.</span>"
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
else
|
||||
@@ -717,21 +736,21 @@ var/list/sacrificed = list()
|
||||
if(cultsinrange.len >= 3)
|
||||
sacrificed += M.mind
|
||||
invocation("rune_sac")
|
||||
usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
|
||||
usr << "<span class='warning'>The Geometer of Blood accepts this sacrifice, your objective is now complete.</span>"
|
||||
else
|
||||
usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
|
||||
usr << "<span class='warning'>Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual.</span>"
|
||||
continue
|
||||
else
|
||||
invocation("rune_sac")
|
||||
if(prob(20))
|
||||
usr << "\red The Geometer of Blood accepts your meager sacrifice."
|
||||
usr << "<span class='warning'>The Geometer of Blood accepts your meager sacrifice.</span>"
|
||||
ticker.mode:grant_runeword(usr)
|
||||
else
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
usr << "\red However, a mere monkey is not enough to satisfy Him."
|
||||
usr << "<span class='warning'>The Geometer of blood accepts this sacrifice.</span>"
|
||||
usr << "<span class='warning'>However, a mere monkey is not enough to satisfy Him.</span>"
|
||||
else
|
||||
invocation("rune_sac")
|
||||
usr << "\red The Geometer of Blood accepts your meager sacrifice."
|
||||
usr << "<span class='warning'>The Geometer of Blood accepts your meager sacrifice.</span>"
|
||||
if(prob(20))
|
||||
ticker.mode.grant_runeword(usr)
|
||||
M.gib()
|
||||
@@ -742,13 +761,13 @@ var/list/sacrificed = list()
|
||||
if (ticker.mode.name == "cult")
|
||||
invocation("rune_sac")
|
||||
if(prob(75))
|
||||
usr << "\red The Geometer of Blood accepts your exotic sacrifice."
|
||||
usr << "<span class='warning'>The Geometer of Blood accepts your exotic sacrifice.</span>"
|
||||
ticker.mode:grant_runeword(usr)
|
||||
else
|
||||
usr << "\red The Geometer of Blood accepts your exotic sacrifice."
|
||||
usr << "\red However, this alien is not enough to gain His favor."
|
||||
usr << "<span class='warning'>The Geometer of Blood accepts your exotic sacrifice.</span>"
|
||||
usr << "<span class='warning'>However, this alien is not enough to gain His favor.</span>"
|
||||
else
|
||||
usr << "\red The Geometer of Blood accepts your exotic sacrifice."
|
||||
usr << "<span class='warning'>The Geometer of Blood accepts your exotic sacrifice.</span>"
|
||||
return
|
||||
return fizzle() */
|
||||
|
||||
@@ -774,20 +793,20 @@ var/list/sacrificed = list()
|
||||
S=1
|
||||
if(S)
|
||||
if(istype(W,/obj/item/weapon/nullrod))
|
||||
usr << "\red Arcane markings suddenly glow from underneath a thin layer of dust!"
|
||||
usr << "<span class='warning'>Arcane markings suddenly glow from underneath a thin layer of dust!</span>"
|
||||
return
|
||||
if(istype(W,/obj/effect/rune))
|
||||
usr.say("Nikt[pick("'","`")]o barada kla'atu!")
|
||||
for (var/mob/V in viewers(src))
|
||||
V.show_message("\red The rune turns into red dust, reveaing the surrounding runes.", 3)
|
||||
V.show_message("<span class='warning'>The rune turns into red dust, reveaing the surrounding runes.</span>", 3)
|
||||
del(src)
|
||||
return
|
||||
if(istype(W,/obj/item/weapon/paper/talisman))
|
||||
usr.whisper("Nikt[pick("'","`")]o barada kla'atu!")
|
||||
usr << "\red Your talisman turns into red dust, revealing the surrounding runes."
|
||||
usr << "<span class='warning'>Your talisman turns into red dust, revealing the surrounding runes.</span>"
|
||||
for (var/mob/V in orange(1,usr.loc))
|
||||
if(V!=usr)
|
||||
V.show_message("\red Red dust emanates from [usr]'s hands for a moment.", 3)
|
||||
V.show_message("<span class='warning'>Red dust emanates from [usr]'s hands for a moment.</span>", 3)
|
||||
return
|
||||
return
|
||||
if(istype(W,/obj/effect/rune))
|
||||
@@ -804,9 +823,9 @@ var/list/sacrificed = list()
|
||||
var/mob/living/user = usr
|
||||
user.take_organ_damage(2, 0)
|
||||
if(src.density)
|
||||
usr << "\red Your blood flows into the rune, and you feel that the very space over the rune thickens."
|
||||
usr << "<span class='warning'>Your blood flows into the rune, and you feel that the very space over the rune thickens.</span>"
|
||||
else
|
||||
usr << "\red Your blood flows into the rune, and you feel as the rune releases its grasp on space."
|
||||
usr << "<span class='warning'>Your blood flows into the rune, and you feel as the rune releases its grasp on space.</span>"
|
||||
return
|
||||
|
||||
/////////////////////////////////////////EIGHTTEENTH RUNE
|
||||
@@ -834,7 +853,7 @@ var/list/sacrificed = list()
|
||||
(istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked) || \
|
||||
(istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) \
|
||||
))
|
||||
user << "\red The [cultist] is already free."
|
||||
user << "<span class='warning'>The [cultist] is already free.</span>"
|
||||
return
|
||||
cultist.buckled = null
|
||||
if (cultist.handcuffed)
|
||||
@@ -854,7 +873,7 @@ var/list/sacrificed = list()
|
||||
if(istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked)
|
||||
cultist.loc:locked = 0
|
||||
for(var/mob/living/carbon/C in users)
|
||||
user.take_overall_damage(15, 0)
|
||||
user.take_overall_damage(10, 0)
|
||||
C.say("Khari[pick("'","`")]d! Gual'te nikka!")
|
||||
del(src)
|
||||
return fizzle()
|
||||
@@ -878,18 +897,21 @@ var/list/sacrificed = list()
|
||||
if (cultist == user) //just to be sure.
|
||||
return
|
||||
if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet)))
|
||||
user << "\red You cannot summon the [cultist], for his shackles of blood are strong"
|
||||
user << "<span class='warning'>You cannot summon the [cultist], for his shackles of blood are strong</span>"
|
||||
return fizzle()
|
||||
var/turf/T = get_turf(cultist)
|
||||
T.invocanimation("rune_teleport")
|
||||
cultist.loc = src.loc
|
||||
cultist.lying = 1
|
||||
cultist.regenerate_icons()
|
||||
T << visible_message("<span class='warning'>[cultist] suddenly disappears in a flash of red light!</span>")
|
||||
for(var/mob/living/carbon/human/C in orange(1,src))
|
||||
if(iscultist(C) && !C.stat)
|
||||
C.say("N'ath reth sh'yro eth d[pick("'","`")]rekkathnor!")
|
||||
C.take_overall_damage(25, 0)
|
||||
user.visible_message("\red Rune disappears with a flash of red light, and in its place now a body lies.", \
|
||||
"\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \
|
||||
"\red You hear a pop and smell ozone.")
|
||||
C.take_overall_damage(15, 0)
|
||||
user.visible_message("<span class='warning'>The rune disappears with a flash of red light, and in its place now a body lies.</span>", \
|
||||
"<span class='warning'>You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.</span>", \
|
||||
"<span class='warning'>You hear a pop and smell ozone.</span>")
|
||||
del(src)
|
||||
return fizzle()
|
||||
|
||||
@@ -905,13 +927,13 @@ var/list/sacrificed = list()
|
||||
if(N)
|
||||
continue
|
||||
C.ear_deaf += 50
|
||||
C.show_message("\red The world around you suddenly becomes quiet.", 3)
|
||||
C.show_message("<span class='warning'>The world around you suddenly becomes quiet.</span>", 3)
|
||||
affected++
|
||||
if(prob(1))
|
||||
C.sdisabilities |= DEAF
|
||||
if(affected)
|
||||
usr.say("Sti[pick("'","`")] kaliedir!")
|
||||
usr << "\red The world becomes quiet as the deafening rune dissipates into fine dust."
|
||||
usr << "<span class='warning'>The world becomes quiet as the deafening rune dissipates into fine dust.</span>"
|
||||
del(src)
|
||||
else
|
||||
return fizzle()
|
||||
@@ -925,14 +947,14 @@ var/list/sacrificed = list()
|
||||
continue
|
||||
C.ear_deaf += 30
|
||||
//talismans is weaker.
|
||||
C.show_message("\red The world around you suddenly becomes quiet.", 3)
|
||||
C.show_message("\<span class='warning'>The world around you suddenly becomes quiet.</span>", 3)
|
||||
affected++
|
||||
if(affected)
|
||||
usr.whisper("Sti[pick("'","`")] kaliedir!")
|
||||
usr << "\red Your talisman turns into gray dust, deafening everyone around."
|
||||
usr << "<span class='warning'>Your talisman turns into gray dust, deafening everyone around.</span>"
|
||||
for (var/mob/V in orange(1,src))
|
||||
if(!(iscultist(V)))
|
||||
V.show_message("\red Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3)
|
||||
V.show_message("<span class='warning'>Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..</span>", 3)
|
||||
return
|
||||
|
||||
/obj/effect/rune/proc/blind()
|
||||
@@ -950,11 +972,11 @@ var/list/sacrificed = list()
|
||||
C.disabilities |= NEARSIGHTED
|
||||
if(prob(10))
|
||||
C.sdisabilities |= BLIND
|
||||
C.show_message("\red Suddenly you see red flash that blinds you.", 3)
|
||||
C.show_message("<span class='warning'>Suddenly you see red flash that blinds you.</span>", 3)
|
||||
affected++
|
||||
if(affected)
|
||||
usr.say("Sti[pick("'","`")] kaliesin!")
|
||||
usr << "\red The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust."
|
||||
usr << "<span class='warning'>The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust.</span>"
|
||||
del(src)
|
||||
else
|
||||
return fizzle()
|
||||
@@ -970,10 +992,10 @@ var/list/sacrificed = list()
|
||||
C.eye_blind += 10
|
||||
//talismans is weaker.
|
||||
affected++
|
||||
C.show_message("\red You feel a sharp pain in your eyes, and the world disappears into darkness..", 3)
|
||||
C.show_message("<span class='warning'>You feel a sharp pain in your eyes, and the world disappears into darkness..</span>", 3)
|
||||
if(affected)
|
||||
usr.whisper("Sti[pick("'","`")] kaliesin!")
|
||||
usr << "\red Your talisman turns into gray dust, blinding those who not follow the Nar-Sie."
|
||||
usr << "<span class='warning'>Your talisman turns into gray dust, blinding those who not follow the Nar-Sie.</span>"
|
||||
return
|
||||
|
||||
|
||||
@@ -997,7 +1019,7 @@ var/list/sacrificed = list()
|
||||
if(N)
|
||||
continue
|
||||
M.take_overall_damage(51,51)
|
||||
M << "\red Your blood boils!"
|
||||
M << "<span class='warning'>Your blood boils!</span>"
|
||||
if(prob(5))
|
||||
spawn(5)
|
||||
M.gib()
|
||||
@@ -1026,16 +1048,16 @@ var/list/sacrificed = list()
|
||||
for(var/mob/living/M in orange(2,R))
|
||||
M.take_overall_damage(0,15)
|
||||
if (R.invisibility>M.see_invisible)
|
||||
M << "\red Aargh it burns!"
|
||||
M << "<span class='warning'>Aargh it burns!</span>"
|
||||
else
|
||||
M << "\red Rune suddenly ignites, burning you!"
|
||||
M << "<span class='warning'>The rune suddenly ignites, burning you!</span>"
|
||||
var/turf/T = get_turf(R)
|
||||
T.hotspot_expose(700,125,surfaces=1)
|
||||
for(var/obj/effect/decal/cleanable/blood/B in world)
|
||||
if(B.blood_DNA == src.blood_DNA)
|
||||
for(var/mob/living/M in orange(1,B))
|
||||
M.take_overall_damage(0,5)
|
||||
M << "\red Blood suddenly ignites, burning you!"
|
||||
M << "<span class='warning'>The blood suddenly ignites, burning you!</span>"
|
||||
var/turf/T = get_turf(B)
|
||||
T.hotspot_expose(700,125,surfaces=1)
|
||||
del(B)
|
||||
@@ -1055,22 +1077,22 @@ var/list/sacrificed = list()
|
||||
C.stuttering = 1
|
||||
C.Weaken(1)
|
||||
C.Stun(1)
|
||||
C.show_message("\red The rune explodes in a bright flash.", 3)
|
||||
C.show_message("<span class='warning'>The rune explodes in a bright flash.</span>", 3)
|
||||
|
||||
else if(issilicon(L))
|
||||
var/mob/living/silicon/S = L
|
||||
S.Weaken(5)
|
||||
S.show_message("\red BZZZT... The rune has exploded in a bright flash.", 3)
|
||||
S.show_message("<span class='warning'>BZZZT... The rune has exploded in a bright flash.</span>", 3)
|
||||
del(src)
|
||||
else ///When invoked as talisman, stun and mute the target mob.
|
||||
usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!")
|
||||
var/obj/item/weapon/nullrod/N = locate() in T
|
||||
if(N)
|
||||
for(var/mob/O in viewers(T, null))
|
||||
O.show_message(text("\red <B>[] invokes a talisman at [], but they are unaffected!</B>", usr, T), 1)
|
||||
O.show_message(text("<span class='warning'><B>[] invokes a talisman at [], but they are unaffected!</B></span>", usr, T), 1)
|
||||
else
|
||||
for(var/mob/O in viewers(T, null))
|
||||
O.show_message(text("\red <B>[] invokes a talisman at []</B>", usr, T), 1)
|
||||
O.show_message(text("<span class='warning'><B>[] invokes a talisman at []</B></span>", usr, T), 1)
|
||||
|
||||
if(issilicon(T))
|
||||
T.Weaken(15)
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/paper/talisman/New()
|
||||
..()
|
||||
pixel_x=0
|
||||
pixel_y=0
|
||||
|
||||
@@ -29,7 +30,11 @@
|
||||
if("revealrunes")
|
||||
call(/obj/effect/rune/proc/revealrunes)(src)
|
||||
if("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri")
|
||||
var/turf/T1 = get_turf(user)
|
||||
call(/obj/effect/rune/proc/teleport)(imbue)
|
||||
var/turf/T2 = get_turf(user)
|
||||
if(T1!=T2)
|
||||
T1.invocanimation("rune_teleport")
|
||||
if("communicate")
|
||||
//If the user cancels the talisman this var will be set to 0
|
||||
delete = call(/obj/effect/rune/proc/communicate)()
|
||||
|
||||
@@ -1,247 +1,3 @@
|
||||
// SPACE VINES (Note that this code is very similar to Biomass code)
|
||||
/obj/effect/spacevine
|
||||
name = "space vines"
|
||||
desc = "An extremely expansionistic species of vine."
|
||||
icon = 'icons/effects/spacevines.dmi'
|
||||
icon_state = "Light1"
|
||||
anchored = 1
|
||||
density = 0
|
||||
layer = 5
|
||||
pass_flags = PASSTABLE | PASSGRILLE
|
||||
var/energy = 0
|
||||
var/obj/effect/spacevine_controller/master = null
|
||||
var/mob/living/buckled_mob
|
||||
|
||||
New()
|
||||
return
|
||||
|
||||
Destroy()
|
||||
if(master)
|
||||
master.vines -= src
|
||||
master.growth_queue -= src
|
||||
..()
|
||||
|
||||
|
||||
/obj/effect/spacevine/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
|
||||
else
|
||||
manual_unbuckle(user)
|
||||
return
|
||||
//Plant-b-gone damage is handled in its entry in chemistry-reagents.dm
|
||||
..()
|
||||
|
||||
|
||||
/obj/effect/spacevine/attack_hand(mob/user as mob)
|
||||
manual_unbuckle(user)
|
||||
|
||||
|
||||
/obj/effect/spacevine/attack_paw(mob/user as mob)
|
||||
manual_unbuckle(user)
|
||||
|
||||
/obj/effect/spacevine/proc/unbuckle()
|
||||
if(buckled_mob)
|
||||
if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt
|
||||
buckled_mob.buckled = null
|
||||
buckled_mob.anchored = initial(buckled_mob.anchored)
|
||||
buckled_mob.update_canmove()
|
||||
buckled_mob = null
|
||||
return
|
||||
|
||||
/obj/effect/spacevine/proc/manual_unbuckle(mob/user as mob)
|
||||
if(buckled_mob)
|
||||
if(prob(50))
|
||||
if(buckled_mob.buckled == src)
|
||||
if(buckled_mob != user)
|
||||
buckled_mob.visible_message(\
|
||||
"<span class='notice'>[user.name] frees [buckled_mob.name] from the vines.</span>",\
|
||||
"<span class='notice'>[user.name] frees you from the vines.</span>",\
|
||||
"<span class='warning'>You hear shredding and ripping.</span>")
|
||||
else
|
||||
buckled_mob.visible_message(\
|
||||
"<span class='notice'>[buckled_mob.name] struggles free of the vines.</span>",\
|
||||
"<span class='notice'>You untangle the vines from around yourself.</span>",\
|
||||
"<span class='warning'>You hear shredding and ripping.</span>")
|
||||
unbuckle()
|
||||
else
|
||||
var/text = pick("rips","tears","pulls")
|
||||
user.visible_message(\
|
||||
"<span class='notice'>[user.name] [text] at the vines.</span>",\
|
||||
"<span class='notice'>You [text] at the vines.</span>",\
|
||||
"<span class='warning'>You hear shredding and ripping.</span>")
|
||||
return
|
||||
|
||||
/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)
|
||||
|
||||
Destroy()
|
||||
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.buckle_mob()
|
||||
|
||||
//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/buckle_mob()
|
||||
if(!buckled_mob && prob(25))
|
||||
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.loc = src.loc
|
||||
V.update_canmove()
|
||||
src.buckled_mob = V
|
||||
V << "<span class='danger'>The vines [pick("wind", "tangle", "tighten")] around you!</span>"
|
||||
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)
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(90))
|
||||
qdel(src)
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(50))
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/effect/spacevine/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) //hotspots kill vines
|
||||
qdel(src)
|
||||
|
||||
//Carn: Spacevines random event.
|
||||
/proc/spacevine_infestation()
|
||||
|
||||
@@ -256,5 +12,5 @@
|
||||
|
||||
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
|
||||
new/obj/effect/plant_controller(T) //spawn a controller at turf
|
||||
message_admins("\blue Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])")
|
||||
|
||||
@@ -6,14 +6,14 @@
|
||||
var/const/meteorannouncedelay_l = 6000 //Lower bound on announcement, here 10 minutes
|
||||
var/const/meteorannouncedelay_h = 9000 //Upper bound on announcement, here 15 minutes
|
||||
var/meteorannouncedelay = 7500 //Final announcement delay, this is a failsafe value
|
||||
var/const/supplydelay = 100 //Delay before meteor supplies are spawned in tenth of seconds
|
||||
var/const/supplydelay = 300 //Delay before meteor supplies are spawned in tenth of seconds
|
||||
var/const/meteordelay_l = 1800 //Lower bound to meteor arrival, here 3 minutes
|
||||
var/const/meteordelay_h = 3000 //Higher bound to meteor arrival, here 5 minutes
|
||||
var/const/meteorshuttlemultiplier = 4 //How much more will we need to hold out ? Here 40 minutes until shuttle arrives. 1 is 10 minutes
|
||||
var/const/meteorshuttlemultiplier = 6 //How much more will we need to hold out ? Here a full hour until the shuttle arrives. 1 is 10 minutes
|
||||
var/meteordelay = 2400 //Final meteor delay, failsafe as above
|
||||
var/nometeors = 1 //Can we send the meteors ?
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread
|
||||
required_players = 0
|
||||
required_players = 20
|
||||
|
||||
uplink_welcome = "EVIL METEOR Uplink Console:"
|
||||
uplink_uses = 10
|
||||
@@ -41,7 +41,7 @@
|
||||
meteordelay = rand((meteordelay_l/600), (meteordelay_h/600))*600 //Ditto above
|
||||
spawn(450) //Give everything 45 seconds to initialize, this does not delay the rest of post_setup() nor the game and ensures deadmins aren't aware in advance and the admins are
|
||||
|
||||
message_admins("Meteor storm confirmed by Space Weather Incorporated. Announcement arrives in [round((meteorannouncedelay-450)/600)] minutes, actual meteors in [round((meteordelay+meteorannouncedelay-450)/600)] minutes. Shuttle will take [10*meteorshuttlemultiplier] minutes to arrive when and supplies will be dispatched in the Bar.")
|
||||
message_admins("Meteor storm confirmed by Space Weather Incorporated. Announcement arrives in [round((meteorannouncedelay-450)/600)] minutes, actual meteors in [round((meteordelay+meteorannouncedelay-450)/600)] minutes. Shuttle will take [10*meteorshuttlemultiplier] minutes to arrive and supplies will be dispatched in the Bar.")
|
||||
|
||||
|
||||
spawn(rand(waittime_l, waittime_h))
|
||||
@@ -276,7 +276,7 @@
|
||||
|
||||
/datum/game_mode/meteor/process()
|
||||
if(!nometeors)
|
||||
meteors_in_wave = (rand(2,20))*5 //Between 10 and 100 meteors in 5 intervals, figures
|
||||
meteors_in_wave = (rand(4,10))*5 //Between 20 and 50 meteors in intervals of 5, figures
|
||||
meteor_wave(meteors_in_wave)
|
||||
return
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#define METEOR_TEMPERATURE
|
||||
|
||||
/var/meteor_wave_delay = 200 //Failsafe wait between waves in tenths of seconds
|
||||
/var/meteor_wave_delay = 225 //Failsafe wait between waves in tenths of seconds
|
||||
//Set it above 100 (10s delay) if you want to minimize lag for some reason
|
||||
|
||||
/var/meteors_in_wave = 10 //Failsafe in case a number isn't called
|
||||
@@ -10,9 +10,9 @@
|
||||
if(!ticker || meteorwavecurrent)
|
||||
return
|
||||
meteorwavecurrent = 1
|
||||
meteor_wave_delay = (rand(10,30))*10 //Between 10 and 30 seconds, makes everything more chaotic
|
||||
meteor_wave_delay = (rand(10,20))*10 //Between 10 and 20 seconds, makes everything more chaotic
|
||||
for(var/i = 0 to number)
|
||||
spawn(rand(5,15)) //0.5 to 1.5 seconds between meteors
|
||||
spawn(rand(5,10)) //0.5 to 1 seconds between meteors
|
||||
spawn_meteor()
|
||||
spawn(meteor_wave_delay)
|
||||
meteorwavecurrent = 0
|
||||
@@ -25,7 +25,7 @@
|
||||
var/endy
|
||||
var/turf/pickedstart
|
||||
var/turf/pickedgoal
|
||||
var/max_i = 3 //number of tries to spawn meteor. Was 10, now 3 as an attempt to minimize lag
|
||||
var/max_i = 3 //Try only three times maximum
|
||||
|
||||
|
||||
do
|
||||
@@ -102,12 +102,12 @@
|
||||
if(A)
|
||||
A.meteorhit(src)
|
||||
playsound(get_turf(src), "explosion", 50, 1) //Medium boom
|
||||
explosion(src.loc, 1, 3, 4, 8, 0) //Medium meteor, medium boom
|
||||
explosion(src.loc, 2, 4, 6, 8, 0) //Medium meteor, medium boom
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/meteor/ex_act(severity)
|
||||
|
||||
if (severity < 4)
|
||||
if(severity < 4)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
var/bees_in_hive = 0
|
||||
var/list/owned_bee_swarms = list()
|
||||
var/hydrotray_type = /obj/machinery/hydroponics
|
||||
var/hydrotray_type = /obj/machinery/portable_atmospherics/hydroponics
|
||||
|
||||
machine_flags = FIXED2WORK | WRENCHMOVE
|
||||
|
||||
@@ -180,14 +180,14 @@
|
||||
bees_in_hive -= 1
|
||||
|
||||
//find some plants, harvest
|
||||
for(var/obj/machinery/hydroponics/H in view(7, src))
|
||||
if(H.planted && !H.dead && H.myseed && prob(owned_bee_swarms.len * 10))
|
||||
for(var/obj/machinery/portable_atmospherics/hydroponics/H in view(7, src))
|
||||
if(H.seed && !H.dead && prob(owned_bee_swarms.len * 10))
|
||||
src.nutrilevel++
|
||||
H.nutrilevel++
|
||||
if(mut < H.mutmod - 1)
|
||||
mut = H.mutmod - 1
|
||||
else if(mut > H.mutmod - 1)
|
||||
H.mutmod = mut
|
||||
if(mut < H.mutation_mod - 1)
|
||||
mut = H.mutation_mod - 1
|
||||
else if(mut > H.mutation_mod - 1)
|
||||
H.mutation_mod = mut
|
||||
|
||||
//flowers give us pollen (nutrients)
|
||||
/* - All plants should be giving nutrients to the hive.
|
||||
@@ -199,11 +199,11 @@
|
||||
if(prob(10))
|
||||
H.lastcycle -= 5
|
||||
if(prob(10))
|
||||
H.myseed.lifespan = max(initial(H.myseed.lifespan) * 1.5, H.myseed.lifespan + 1)
|
||||
H.seed.lifespan = max(initial(H.seed.lifespan) * 1.5, H.seed.lifespan + 1)
|
||||
if(prob(10))
|
||||
H.myseed.endurance = max(initial(H.myseed.endurance) * 1.5, H.myseed.endurance + 1)
|
||||
if(H.toxic && prob(10))
|
||||
H.toxic = min(0, H.toxic - 1)
|
||||
H.seed.endurance = max(initial(H.seed.endurance) * 1.5, H.seed.endurance + 1)
|
||||
if(H.toxins && prob(10))
|
||||
H.toxins = min(0, H.toxins - 1)
|
||||
toxic++
|
||||
|
||||
/obj/machinery/apiary/proc/die()
|
||||
|
||||
@@ -48,21 +48,21 @@
|
||||
cost=10
|
||||
name="E-Z-Nutrient"
|
||||
other_amounts=list(5)
|
||||
result=/obj/item/nutrient/ez
|
||||
result=/obj/item/weapon/reagent_containers/glass/fertilizer/ez
|
||||
|
||||
/datum/biogen_recipe/nutrient/l4z
|
||||
id="l4z"
|
||||
cost=20
|
||||
name="Left 4 Zed"
|
||||
other_amounts=list(5)
|
||||
result=/obj/item/nutrient/l4z
|
||||
result=/obj/item/weapon/reagent_containers/glass/fertilizer/l4z
|
||||
|
||||
/datum/biogen_recipe/nutrient/rh
|
||||
id="rh"
|
||||
cost=25
|
||||
name="Robust Harvest"
|
||||
other_amounts=list(5)
|
||||
result=/obj/item/nutrient/rh
|
||||
result=/obj/item/weapon/reagent_containers/glass/fertilizer/rh
|
||||
|
||||
/datum/biogen_recipe/leather
|
||||
category="Leather"
|
||||
@@ -105,7 +105,7 @@
|
||||
id="pest"
|
||||
name="Pest Spray"
|
||||
other_amounts=list(5)
|
||||
result=/obj/item/weapon/pestspray
|
||||
result=/obj/item/weapon/plantspray/pests
|
||||
|
||||
/datum/biogen_recipe/misc/beez
|
||||
cost=40
|
||||
|
||||
@@ -31,7 +31,7 @@ Here it is: Buttbot.
|
||||
playsound(get_turf(src), 'sound/misc/fart.ogg', 50, 1)
|
||||
sincelastfart = world.timeofday
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/machinery/bot/buttbot/proc/speak(var/message)
|
||||
@@ -60,7 +60,7 @@ Here it is: Buttbot.
|
||||
|
||||
split_phrase[index] = "butt"
|
||||
|
||||
speak(sanitize(dd_list2text(split_phrase," ")))
|
||||
speak(sanitize(list2text(split_phrase," ")))
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -93,7 +93,7 @@
|
||||
|
||||
/obj/machinery/bot/farmbot/proc/get_total_ferts()
|
||||
var total_fert = 0
|
||||
for (var/obj/item/nutrient/fert in contents)
|
||||
for (var/obj/item/weapon/reagent_containers/glass/fertilizer/fert in contents)
|
||||
total_fert++
|
||||
return total_fert
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
setting_ignoreMushrooms = !setting_ignoreMushrooms
|
||||
else if (href_list["eject"] )
|
||||
flick("farmbot_hatch",src)
|
||||
for (var/obj/item/nutrient/fert in contents)
|
||||
for (var/obj/item/weapon/reagent_containers/glass/fertilizer/fert in contents)
|
||||
fert.loc = get_turf(src)
|
||||
|
||||
src.updateUsrDialog()
|
||||
@@ -170,7 +170,7 @@
|
||||
else
|
||||
user << "\red Access denied."
|
||||
|
||||
else if (istype(W, /obj/item/nutrient))
|
||||
else if (istype(W, /obj/item/weapon/reagent_containers/glass/fertilizer))
|
||||
if ( get_total_ferts() >= Max_Fertilizers )
|
||||
user << "The fertilizer storage is full!"
|
||||
return
|
||||
@@ -212,7 +212,7 @@
|
||||
if ( tank )
|
||||
tank.loc = Tsec
|
||||
|
||||
for ( var/obj/item/nutrient/fert in contents )
|
||||
for ( var/obj/item/weapon/reagent_containers/glass/fertilizer/fert in contents )
|
||||
if ( prob(50) )
|
||||
fert.loc = Tsec
|
||||
|
||||
@@ -267,15 +267,15 @@
|
||||
target = null
|
||||
return 0
|
||||
|
||||
if ( !emagged && !istype(target,/obj/machinery/hydroponics) && !istype(target,/obj/structure/sink) ) // Humans are not plants!
|
||||
if ( !emagged && !istype(target,/obj/machinery/portable_atmospherics/hydroponics) && !istype(target,/obj/structure/sink) ) // Humans are not plants!
|
||||
mode = 0
|
||||
target = null
|
||||
return 0
|
||||
|
||||
if ( mode == FARMBOT_MODE_FERTILIZE )
|
||||
//Find which fertilizer to use
|
||||
var/obj/item/nutrient/fert
|
||||
for ( var/obj/item/nutrient/nut in contents )
|
||||
var/obj/item/weapon/reagent_containers/glass/fertilizer/fert
|
||||
for ( var/obj/item/weapon/reagent_containers/glass/fertilizer/nut in contents )
|
||||
fert = nut
|
||||
break
|
||||
if ( !fert )
|
||||
@@ -317,7 +317,7 @@
|
||||
target = source
|
||||
mode = FARMBOT_MODE_REFILL
|
||||
return 1
|
||||
for ( var/obj/machinery/hydroponics/tray in view(7,src) )
|
||||
for ( var/obj/machinery/portable_atmospherics/hydroponics/tray in view(7,src) )
|
||||
var newMode = GetNeededMode(tray)
|
||||
if ( newMode )
|
||||
mode = newMode
|
||||
@@ -325,12 +325,8 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/machinery/bot/farmbot/proc/GetNeededMode(obj/machinery/hydroponics/tray)
|
||||
if ( !tray.planted || tray.dead )
|
||||
return 0
|
||||
if ( tray.myseed.plant_type == 1 && setting_ignoreWeeds )
|
||||
return 0
|
||||
if ( tray.myseed.plant_type == 2 && setting_ignoreMushrooms )
|
||||
/obj/machinery/bot/farmbot/proc/GetNeededMode(obj/machinery/portable_atmospherics/hydroponics/tray)
|
||||
if ( !tray.seed || tray.dead )
|
||||
return 0
|
||||
|
||||
if ( setting_water && tray.waterlevel <= 10 && tank && tank.reagents.total_volume >= 1 )
|
||||
@@ -387,7 +383,7 @@
|
||||
src.frustration++
|
||||
|
||||
|
||||
/obj/machinery/bot/farmbot/proc/fertilize(obj/item/nutrient/fert)
|
||||
/obj/machinery/bot/farmbot/proc/fertilize(var/obj/item/weapon/reagent_containers/glass/fertilizer/fert)
|
||||
if ( !fert )
|
||||
target = null
|
||||
mode = 0
|
||||
@@ -405,12 +401,11 @@
|
||||
return 1
|
||||
|
||||
else // feed them plants~
|
||||
var /obj/machinery/hydroponics/tray = target
|
||||
var/obj/machinery/portable_atmospherics/hydroponics/tray = target
|
||||
tray.nutrilevel = 10
|
||||
tray.yieldmod = fert.yieldmod
|
||||
tray.mutmod = fert.mutmod
|
||||
fert.reagents.trans_to(tray.reagents, fert.reagents.total_volume)
|
||||
del fert
|
||||
tray.updateicon()
|
||||
//tray.updateicon()
|
||||
icon_state = "farmbot_fertile"
|
||||
mode = FARMBOT_MODE_WAITING
|
||||
|
||||
@@ -450,9 +445,9 @@
|
||||
spawn(FARMBOT_ACTION_DELAY)
|
||||
mode = 0
|
||||
|
||||
var /obj/machinery/hydroponics/tray = target
|
||||
var /obj/machinery/portable_atmospherics/hydroponics/tray = target
|
||||
tray.weedlevel = 0
|
||||
tray.updateicon()
|
||||
//tray.updateicon()
|
||||
|
||||
/obj/machinery/bot/farmbot/proc/water()
|
||||
if ( !tank || tank.reagents.total_volume < 1 )
|
||||
@@ -479,7 +474,7 @@
|
||||
spawn(FARMBOT_EMAG_DELAY)
|
||||
mode = 0
|
||||
else
|
||||
var /obj/machinery/hydroponics/tray = target
|
||||
var /obj/machinery/portable_atmospherics/hydroponics/tray = target
|
||||
var/b_amount = tank.reagents.get_reagent_amount("water")
|
||||
if(b_amount > 0 && tray.waterlevel < 100)
|
||||
if(b_amount + tray.waterlevel > 100)
|
||||
@@ -489,11 +484,11 @@
|
||||
playsound(get_turf(src), 'sound/effects/slosh.ogg', 25, 1)
|
||||
|
||||
// Toxicity dilutation code. The more water you put in, the lesser the toxin concentration.
|
||||
tray.toxic -= round(b_amount/4)
|
||||
if (tray.toxic < 0 ) // Make sure it won't go overboard
|
||||
tray.toxic = 0
|
||||
tray.toxins -= round(b_amount/4)
|
||||
if (tray.toxins < 0 ) // Make sure it won't go overboard
|
||||
tray.toxins = 0
|
||||
|
||||
tray.updateicon()
|
||||
//tray.updateicon()
|
||||
mode = FARMBOT_MODE_WAITING
|
||||
spawn(FARMBOT_ACTION_DELAY)
|
||||
mode = 0
|
||||
|
||||
@@ -650,7 +650,7 @@ Auto Patrol: []"},
|
||||
if(M.stat == DEAD)
|
||||
continue
|
||||
// Ignore lazarus-injected mobs.
|
||||
if(M.faction == "lazarus")
|
||||
if(dd_hasprefix(C.faction, "lazarus"))
|
||||
continue
|
||||
// Minebots only, I hope.
|
||||
if(M.faction == "neutral")
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
var/blocked = 0 //Player cannot attack/heal while set
|
||||
|
||||
machine_flags = EMAGGABLE | SCREWTOGGLE | CROWDESTROY | WRENCHMOVE | FIXED2WORK
|
||||
emag_cost = 0 // because fun
|
||||
|
||||
l_color = "#00FF00"
|
||||
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
#define TAXI_SHUTTLE_COOLDOWN 300
|
||||
|
||||
////////////////////
|
||||
// TAXI SHUTTLE A //
|
||||
// TAXI SHUTTLES //
|
||||
////////////////////
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_a
|
||||
/obj/machinery/computer/taxi_shuttle
|
||||
name = "taxi shuttle terminal"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "syndishuttle"
|
||||
@@ -13,45 +13,56 @@
|
||||
var/area/curr_location
|
||||
var/moving = 0
|
||||
var/lastMove = 0
|
||||
var/id_tag = ""
|
||||
var/letter = ""
|
||||
|
||||
l_color = "#B40000"
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_a/New()
|
||||
curr_location= locate(/area/shuttle/taxi_a/engineering_cargo_station)
|
||||
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_a/proc/taxi_a_move_to(area/destination as area)
|
||||
if(moving) return
|
||||
if(lastMove + TAXI_SHUTTLE_COOLDOWN > world.time) return
|
||||
/obj/machinery/computer/taxi_shuttle/proc/taxi_move_to(area/destination as area, area/transit as area, var/wait_time)
|
||||
if(moving)
|
||||
return
|
||||
if(lastMove + TAXI_SHUTTLE_COOLDOWN > world.time)
|
||||
return
|
||||
var/area/dest_location = locate(destination)
|
||||
if(curr_location == dest_location) return
|
||||
if(curr_location == dest_location)
|
||||
return
|
||||
|
||||
broadcast("Taxi [letter] will move in [wait_time / 10] seconds.")
|
||||
sleep(wait_time)
|
||||
moving = 1
|
||||
lastMove = world.time
|
||||
|
||||
if(curr_location.z != dest_location.z)
|
||||
var/area/transit_location = locate(/area/shuttle/taxi_a/transit)
|
||||
var/area/transit_location = locate(transit)
|
||||
curr_location.move_contents_to(transit_location)
|
||||
curr_location = transit_location
|
||||
curr_location = get_area(src)
|
||||
sleep(TAXI_SHUTTLE_MOVE_TIME)
|
||||
|
||||
curr_location.move_contents_to(dest_location)
|
||||
curr_location = dest_location
|
||||
curr_location = get_area(src) //test code. Manually setting curr is bad
|
||||
moving = 0
|
||||
return 1
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle/proc/broadcast(var/message = "")
|
||||
if(message)
|
||||
src.visible_message("\icon [src]" + message)
|
||||
for(var/obj/machinery/door_control/taxi/TB in world)
|
||||
if(id_tag == TB.id_tag)
|
||||
TB.visible_message("\icon [TB] " + message)
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_a/attackby(obj/item/I as obj, mob/user as mob)
|
||||
/obj/machinery/computer/taxi_shuttle/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(..())
|
||||
return 1
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_a/attack_ai(mob/user as mob)
|
||||
/obj/machinery/computer/taxi_shuttle/attack_ai(mob/user as mob)
|
||||
src.add_hiddenprint(user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_a/attack_paw(mob/user as mob)
|
||||
/obj/machinery/computer/taxi_shuttle/attack_paw(mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_a/attack_hand(mob/user as mob)
|
||||
/obj/machinery/computer/taxi_shuttle/attack_hand(mob/user as mob)
|
||||
if(!allowed(user))
|
||||
user << "\red Access Denied"
|
||||
return
|
||||
@@ -63,125 +74,93 @@
|
||||
<a href='?src=\ref[src];med_sili=1'>Medical and Silicon Station</a><br>
|
||||
<a href='?src=\ref[src];engi_cargo=1'>Engineering and Cargo Station</a><br>
|
||||
<a href='?src=\ref[src];sec_sci=1'>Security and Science Station</a><br>
|
||||
<a href='?src=\ref[src];abandoned=1'>Abandoned Station</a><br>"}
|
||||
[emagged ? "<a href='?src=\ref[src];abandoned=1'>Abandoned Station</a><br>" : ""]"}
|
||||
|
||||
user << browse(dat, "window=computer;size=575x450")
|
||||
onclose(user, "computer")
|
||||
return
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle/emag(mob/user)
|
||||
if(!emagged)
|
||||
emagged = 1
|
||||
req_access = list()
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_a/Topic(href, href_list)
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle/Topic(href, href_list)
|
||||
if(!isliving(usr)) return
|
||||
var/mob/living/user = usr
|
||||
|
||||
if(in_range(src, user) || istype(user, /mob/living/silicon))
|
||||
user.set_machine(src)
|
||||
|
||||
if(href_list["med_sili"])
|
||||
taxi_a_move_to(/area/shuttle/taxi_a/medcal_silicon_station)
|
||||
else if(href_list["engi_cargo"])
|
||||
taxi_a_move_to(/area/shuttle/taxi_a/engineering_cargo_station)
|
||||
else if(href_list["sec_sci"])
|
||||
taxi_a_move_to(/area/shuttle/taxi_a/security_science_station)
|
||||
else if(href_list["abandoned"])
|
||||
taxi_a_move_to(/area/shuttle/taxi_a/abandoned_station)
|
||||
for(var/place in href_list)
|
||||
if(href_list[place])
|
||||
callTo(place, 30)
|
||||
|
||||
add_fingerprint(usr)
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_a/bullet_act(var/obj/item/projectile/Proj)
|
||||
/obj/machinery/computer/taxi_shuttle/proc/callTo(var/place = "")
|
||||
return
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle/bullet_act(var/obj/item/projectile/Proj)
|
||||
visible_message("[Proj] ricochets off [src]!")
|
||||
|
||||
|
||||
////////////////////
|
||||
// TAXI SHUTTLE A //
|
||||
////////////////////
|
||||
/obj/machinery/computer/taxi_shuttle/taxi_a
|
||||
name = "taxi shuttle terminal A"
|
||||
id_tag = "taxi_a"
|
||||
letter = "A"
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle/taxi_a/New()
|
||||
curr_location= locate(/area/shuttle/taxi_a/engineering_cargo_station)
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle/taxi_a/callTo(var/place = "", var/wait_time)
|
||||
switch(place)
|
||||
if("med_sili")
|
||||
if (taxi_move_to(/area/shuttle/taxi_a/medcal_silicon_station, /area/shuttle/taxi_a/transit, wait_time))
|
||||
return 1
|
||||
if("engi_cargo")
|
||||
if (taxi_move_to(/area/shuttle/taxi_a/engineering_cargo_station, /area/shuttle/taxi_a/transit, wait_time))
|
||||
return 1
|
||||
if("sec_sci")
|
||||
if (taxi_move_to(/area/shuttle/taxi_a/security_science_station, /area/shuttle/taxi_a/transit, wait_time))
|
||||
return 1
|
||||
if("abandoned")
|
||||
if (taxi_move_to(/area/shuttle/taxi_a/abandoned_station, /area/shuttle/taxi_a/transit, wait_time))
|
||||
return 1
|
||||
return
|
||||
|
||||
////////////////////
|
||||
// TAXI SHUTTLE B //
|
||||
////////////////////
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_b
|
||||
name = "taxi shuttle terminal"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "syndishuttle"
|
||||
req_access = list(access_taxi)
|
||||
var/area/curr_location
|
||||
var/moving = 0
|
||||
var/lastMove = 0
|
||||
/obj/machinery/computer/taxi_shuttle/taxi_b
|
||||
name = "taxi shuttle terminal B"
|
||||
id_tag = "taxi_b"
|
||||
letter = "B"
|
||||
|
||||
l_color = "#B40000"
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_b/New()
|
||||
/obj/machinery/computer/taxi_shuttle/taxi_b/New()
|
||||
curr_location= locate(/area/shuttle/taxi_b/engineering_cargo_station)
|
||||
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_b/proc/taxi_b_move_to(area/destination as area)
|
||||
if(moving) return
|
||||
if(lastMove + TAXI_SHUTTLE_COOLDOWN > world.time) return
|
||||
var/area/dest_location = locate(destination)
|
||||
if(curr_location == dest_location) return
|
||||
|
||||
moving = 1
|
||||
lastMove = world.time
|
||||
|
||||
if(curr_location.z != dest_location.z)
|
||||
var/area/transit_location = locate(/area/shuttle/taxi_b/transit)
|
||||
curr_location.move_contents_to(transit_location)
|
||||
curr_location = transit_location
|
||||
sleep(TAXI_SHUTTLE_MOVE_TIME)
|
||||
|
||||
curr_location.move_contents_to(dest_location)
|
||||
curr_location = dest_location
|
||||
moving = 0
|
||||
return 1
|
||||
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_b/attackby(obj/item/I as obj, mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_b/attack_ai(mob/user as mob)
|
||||
src.add_hiddenprint(user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_b/attack_paw(mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_b/attack_hand(mob/user as mob)
|
||||
if(!allowed(user))
|
||||
user << "\red Access Denied"
|
||||
return
|
||||
|
||||
user.set_machine(src)
|
||||
|
||||
var/dat = {"Location: [curr_location]<br>
|
||||
Ready to move[max(lastMove + TAXI_SHUTTLE_COOLDOWN - world.time, 0) ? " in [max(round((lastMove + TAXI_SHUTTLE_COOLDOWN - world.time) * 0.1), 0)] seconds" : ": now"]<br><br>
|
||||
<a href='?src=\ref[src];med_sili=1'>Medical and Silicon Station</a><br>
|
||||
<a href='?src=\ref[src];engi_cargo=1'>Engineering and Cargo Station</a><br>
|
||||
<a href='?src=\ref[src];sec_sci=1'>Security and Science Station</a><br>
|
||||
<a href='?src=\ref[src];abandoned=1'>Abandoned Station</a><br>"}
|
||||
|
||||
user << browse(dat, "window=computer;size=575x450")
|
||||
onclose(user, "computer")
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_b/Topic(href, href_list)
|
||||
if(!isliving(usr)) return
|
||||
var/mob/living/user = usr
|
||||
|
||||
if(in_range(src, user) || istype(user, /mob/living/silicon))
|
||||
user.set_machine(src)
|
||||
|
||||
if(href_list["med_sili"])
|
||||
taxi_b_move_to(/area/shuttle/taxi_b/medcal_silicon_station)
|
||||
else if(href_list["engi_cargo"])
|
||||
taxi_b_move_to(/area/shuttle/taxi_b/engineering_cargo_station)
|
||||
else if(href_list["sec_sci"])
|
||||
taxi_b_move_to(/area/shuttle/taxi_b/security_science_station)
|
||||
else if(href_list["abandoned"])
|
||||
taxi_b_move_to(/area/shuttle/taxi_b/abandoned_station)
|
||||
|
||||
add_fingerprint(usr)
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/taxi_shuttle_b/bullet_act(var/obj/item/projectile/Proj)
|
||||
visible_message("[Proj] ricochets off [src]!")
|
||||
/obj/machinery/computer/taxi_shuttle/taxi_b/callTo(var/place = "", var/wait_time)
|
||||
switch(place)
|
||||
if("med_sili")
|
||||
if (taxi_move_to(/area/shuttle/taxi_b/medcal_silicon_station, /area/shuttle/taxi_b/transit, wait_time))
|
||||
return 1
|
||||
if("engi_cargo")
|
||||
if (taxi_move_to(/area/shuttle/taxi_b/engineering_cargo_station, /area/shuttle/taxi_b/transit, wait_time))
|
||||
return 1
|
||||
if("sec_sci")
|
||||
if (taxi_move_to(/area/shuttle/taxi_b/security_science_station, /area/shuttle/taxi_b/transit, wait_time))
|
||||
return 1
|
||||
if("abandoned")
|
||||
if (taxi_move_to(/area/shuttle/taxi_b/abandoned_station, /area/shuttle/taxi_b/transit, wait_time))
|
||||
return 1
|
||||
return
|
||||
@@ -290,7 +290,7 @@ to destroy them and players will be able to make replacements.
|
||||
|
||||
/obj/item/weapon/circuitboard/protolathe
|
||||
name = "Circuit board (Protolathe)"
|
||||
build_path = "/obj/machinery/r_n_d/protolathe"
|
||||
build_path = "/obj/machinery/r_n_d/fabricator/protolathe"
|
||||
board_type = "machine"
|
||||
origin_tech = "engineering=2;programming=2"
|
||||
frame_desc = "Requires 2 Matter Bins, 2 Manipulators, and 2 Beakers."
|
||||
@@ -310,7 +310,7 @@ to destroy them and players will be able to make replacements.
|
||||
|
||||
/obj/item/weapon/circuitboard/circuit_imprinter
|
||||
name = "Circuit board (Circuit Imprinter)"
|
||||
build_path = "/obj/machinery/r_n_d/circuit_imprinter"
|
||||
build_path = "/obj/machinery/r_n_d/fabricator/circuit_imprinter"
|
||||
board_type = "machine"
|
||||
origin_tech = "engineering=2;programming=2"
|
||||
frame_desc = "Requires 1 Matter Bin, 1 Manipulator, and 2 Beakers."
|
||||
|
||||
@@ -49,6 +49,8 @@
|
||||
autoclose = 1
|
||||
var/busy = 0
|
||||
|
||||
emag_cost = 1 // in MJ
|
||||
|
||||
/obj/machinery/door/airlock/Destroy()
|
||||
if(wires)
|
||||
wires.Destroy()
|
||||
@@ -105,6 +107,7 @@
|
||||
name = "Vault"
|
||||
icon = 'icons/obj/doors/vault.dmi'
|
||||
opacity = 1
|
||||
emag_cost = 2 // in MJ
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites.
|
||||
|
||||
/obj/machinery/door/airlock/freezer
|
||||
@@ -284,6 +287,7 @@
|
||||
name = "High Tech Security Airlock"
|
||||
icon = 'icons/obj/doors/hightechsecurity.dmi'
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity
|
||||
emag_cost = 2 // in MJ
|
||||
|
||||
/*
|
||||
About the new airlock wires panel:
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
/obj/machinery/door/window/New()
|
||||
..()
|
||||
|
||||
machine_flags |= EMAGGABLE
|
||||
machine_flags |= EMAGGABLE // Why is this here?
|
||||
|
||||
if (src.req_access && src.req_access.len)
|
||||
src.icon_state = "[src.icon_state]"
|
||||
|
||||
@@ -34,6 +34,18 @@
|
||||
|
||||
else
|
||||
user << "\red The machine only accepts monkeys!"
|
||||
else if(istype(O, /mob/living/carbon/monkey))
|
||||
var/mob/living/carbon/monkey/target = O
|
||||
if(target.stat == 0)
|
||||
user << "\red The monkey is struggling far too much to put it in the recycler."
|
||||
else
|
||||
user.drop_item()
|
||||
del(target)
|
||||
user << "\blue You stuff the monkey in the machine."
|
||||
playsound(get_turf(src), 'sound/machines/juicer.ogg', 50, 1)
|
||||
use_power(500)
|
||||
src.grinded++
|
||||
user << "\blue The machine now has [grinded] monkeys worth of material stored."
|
||||
return
|
||||
|
||||
/obj/machinery/monkey_recycler/attack_hand(var/mob/user as mob)
|
||||
@@ -48,3 +60,6 @@
|
||||
else
|
||||
user << "\red The machine needs at least 3 monkeys worth of material to produce a monkey cube. It only has [grinded]."
|
||||
return
|
||||
|
||||
/obj/machinery/monkey_recycler/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
|
||||
attackby(O,user)
|
||||
@@ -192,4 +192,5 @@
|
||||
src.visible_message("<span class='notice'>[src] is done.</span>", \
|
||||
"You hear [src] stop")
|
||||
|
||||
|
||||
/obj/machinery/processor/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
|
||||
attackby(O,user)
|
||||
@@ -116,7 +116,15 @@ Class Procs:
|
||||
var/custom_aghost_alerts=0
|
||||
var/panel_open = 0
|
||||
|
||||
var/machine_flags = 0//this is what you use for flags.
|
||||
/**
|
||||
* Machine construction/destruction/emag flags.
|
||||
*/
|
||||
var/machine_flags = 0
|
||||
|
||||
/**
|
||||
* Emag energy cost (in MJ).
|
||||
*/
|
||||
var/emag_cost = 1
|
||||
|
||||
var/inMachineList = 1 // For debugging.
|
||||
|
||||
@@ -447,29 +455,49 @@ Class Procs:
|
||||
return 1
|
||||
return -1
|
||||
|
||||
/**
|
||||
* Handle emags.
|
||||
* @param user /mob The mob that used the emag.
|
||||
*/
|
||||
/obj/machinery/proc/emag(mob/user as mob)
|
||||
return
|
||||
// Disable emaggability.
|
||||
machine_flags &= ~EMAGGABLE
|
||||
|
||||
/**
|
||||
* Returns the cost of emagging this machine (emag_cost by default)
|
||||
* @param user /mob The mob that used the emag.
|
||||
* @param emag /obj/item/weapon/card/emag The emag used on this device.
|
||||
* @return number Cost to emag.
|
||||
*/
|
||||
/obj/machinery/proc/getEmagCost(var/mob/user, var/obj/item/weapon/card/emag/emag)
|
||||
return emag_cost
|
||||
|
||||
/obj/machinery/attackby(var/obj/O, var/mob/user)
|
||||
if(istype(O, /obj/item/weapon/card/emag) && machine_flags &EMAGGABLE)
|
||||
emag(user)
|
||||
return
|
||||
if(istype(O, /obj/item/weapon/wrench) && machine_flags &WRENCHMOVE) //make sure this is BEFORE the fixed2work check
|
||||
if(istype(O, /obj/item/weapon/card/emag) && machine_flags & EMAGGABLE)
|
||||
var/obj/item/weapon/card/emag/E = O
|
||||
if(E.canUse(user,src))
|
||||
emag(user)
|
||||
return
|
||||
|
||||
if(istype(O, /obj/item/weapon/wrench) && machine_flags & WRENCHMOVE) //make sure this is BEFORE the fixed2work check
|
||||
if(!panel_open)
|
||||
return wrenchAnchor(user)
|
||||
else
|
||||
user <<"<span class='warning'>\The [src]'s maintenance panel must be closed first!</span>"
|
||||
return -1 //we return -1 rather than 0 for the if(..()) checks
|
||||
if(istype(O, /obj/item/weapon/screwdriver) && machine_flags &SCREWTOGGLE)
|
||||
|
||||
if(istype(O, /obj/item/weapon/screwdriver) && machine_flags & SCREWTOGGLE)
|
||||
return togglePanelOpen(O, user)
|
||||
if(istype(O, /obj/item/weapon/crowbar) && machine_flags &CROWDESTROY)
|
||||
|
||||
if(istype(O, /obj/item/weapon/crowbar) && machine_flags & CROWDESTROY)
|
||||
if(panel_open)
|
||||
if(crowbarDestroy(user) == 1)
|
||||
qdel(src)
|
||||
return 1
|
||||
else
|
||||
return -1
|
||||
if(!anchored && machine_flags &FIXED2WORK)
|
||||
|
||||
if(!anchored && machine_flags & FIXED2WORK)
|
||||
return user << "<span class='warning'>\The [src] must be anchored first!</span>"
|
||||
|
||||
/obj/machinery/proc/shock(mob/user, prb, var/siemenspassed = -1)
|
||||
@@ -485,4 +513,4 @@ Class Procs:
|
||||
if (electrocute_mob(user, get_area(src), src, siemenspassed))
|
||||
return 1
|
||||
else
|
||||
return -1
|
||||
return -1
|
||||
|
||||
@@ -21,6 +21,10 @@
|
||||
|
||||
req_access = list(access_security)
|
||||
|
||||
/obj/machinery/detector/New(loc)
|
||||
..(loc)
|
||||
machine_flags |= WRENCHMOVE | FIXED2WORK
|
||||
|
||||
/obj/machinery/detector/proc/assess_perp(mob/living/carbon/human/perp as mob)
|
||||
var/threatcount = 0
|
||||
if(!(istype(perp, /mob/living/carbon)))
|
||||
@@ -159,19 +163,18 @@
|
||||
icon_state = "[base_state]1"
|
||||
// src.sd_SetLuminosity(0)
|
||||
|
||||
/obj/machinery/detector/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/weapon/wirecutters))
|
||||
/obj/machinery/detector/attackby(obj/item/W, mob/user)
|
||||
if(..(W, user) == 1)
|
||||
return 1 // resolved for click code!
|
||||
|
||||
/*if (istype(W, /obj/item/weapon/wirecutters))
|
||||
add_fingerprint(user)
|
||||
src.disable = !src.disable
|
||||
if (src.disable)
|
||||
user.visible_message("\red [user] has disconnected the detector array!", "\red You disconnect the detector array!")
|
||||
if (!src.disable)
|
||||
user.visible_message("\red [user] has connected the detector array!", "\red You connect the detector array!")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
*/
|
||||
|
||||
/obj/machinery/detector/Topic(href, href_list)
|
||||
if(..()) return
|
||||
|
||||
@@ -3,7 +3,7 @@ Injecting a pod person with a blood sample will grow a pod person with the memor
|
||||
Growing it to term with nothing injected will grab a ghost from the observers. */
|
||||
#define DIONA_COOLDOWN 18000 // 30 minutes between being diona
|
||||
var/global/list/hasbeendiona = list() // Stores ckeys and a timestamp for ghost dionas to be picked again, removes the same guy being diona 5 times in 10 minutes.
|
||||
/obj/item/seeds/replicapod
|
||||
/*/obj/item/seeds/replicapod
|
||||
name = "pack of dionaea-replicant seeds"
|
||||
desc = "These seeds grow into 'replica pods' or 'dionaea', a form of strange sapient plantlife."
|
||||
icon_state = "seed-replicapod"
|
||||
@@ -26,7 +26,7 @@ var/global/list/hasbeendiona = list() // Stores ckeys and a timestamp for ghost
|
||||
gender = MALE
|
||||
var/obj/machinery/hydroponics/parent = null
|
||||
var/list/found_player = list()
|
||||
var/beingharvested = 0
|
||||
var/beingharvested = 0*/
|
||||
|
||||
/obj/item/seeds/replicapod/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
|
||||
|
||||
@@ -453,7 +453,7 @@ Status: []<BR>"},
|
||||
if(C.stat)
|
||||
continue
|
||||
// Ignore lazarus-injected mobs.
|
||||
if(C.faction == "lazarus")
|
||||
if(dd_hasprefix(C.faction, "lazarus"))
|
||||
continue
|
||||
targets += C
|
||||
|
||||
|
||||
@@ -27,44 +27,33 @@
|
||||
RefreshParts()
|
||||
|
||||
obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/))
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O
|
||||
user.drop_item()
|
||||
user << "<span class='notice'>You extract some seeds from the [F.name].</span>"
|
||||
var/seed = text2path(F.seed)
|
||||
var/t_amount = 0
|
||||
var/t_max = rand(1,4)
|
||||
while(t_amount < t_max)
|
||||
var/obj/item/seeds/t_prod = new seed(loc)
|
||||
t_prod.species = F.species
|
||||
t_prod.lifespan = F.lifespan
|
||||
t_prod.endurance = F.endurance
|
||||
t_prod.maturation = F.maturation
|
||||
t_prod.production = F.production
|
||||
t_prod.yield = F.yield
|
||||
t_prod.potency = F.potency
|
||||
t_amount++
|
||||
del(O)
|
||||
|
||||
else if(istype(O, /obj/item/weapon/grown/))
|
||||
var/obj/item/weapon/grown/F = O
|
||||
user.drop_item()
|
||||
user << "<span class='notice'>You extract some seeds from the [F.name].</span>"
|
||||
var/seed = text2path(F.seed)
|
||||
var/t_amount = 0
|
||||
var/t_max = rand(1,4)
|
||||
while(t_amount < t_max)
|
||||
var/obj/item/seeds/t_prod = new seed(loc)
|
||||
t_prod.species = F.species
|
||||
t_prod.lifespan = F.lifespan
|
||||
t_prod.endurance = F.endurance
|
||||
t_prod.maturation = F.maturation
|
||||
t_prod.production = F.production
|
||||
t_prod.yield = F.yield
|
||||
t_prod.potency = F.potency
|
||||
t_amount++
|
||||
|
||||
// Fruits and vegetables.
|
||||
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown) || istype(O, /obj/item/weapon/grown))
|
||||
|
||||
user.drop_item(O)
|
||||
|
||||
var/datum/seed/new_seed_type
|
||||
if(istype(O, /obj/item/weapon/grown))
|
||||
var/obj/item/weapon/grown/F = O
|
||||
new_seed_type = seed_types[F.plantname]
|
||||
else
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O
|
||||
new_seed_type = seed_types[F.plantname]
|
||||
|
||||
if(new_seed_type)
|
||||
user << "<span class='notice'>You extract some seeds from [O].</span>"
|
||||
var/produce = rand(1,4)
|
||||
for(var/i = 0;i<=produce;i++)
|
||||
var/obj/item/seeds/seeds = new(get_turf(src))
|
||||
seeds.seed_type = new_seed_type.name
|
||||
seeds.update_seed()
|
||||
else
|
||||
user << "[O] doesn't seem to have any usable seeds inside it."
|
||||
|
||||
del(O)
|
||||
|
||||
//Grass.
|
||||
else if(istype(O, /obj/item/stack/tile/grass))
|
||||
var/obj/item/stack/tile/grass/S = O
|
||||
user << "<span class='notice'>You extract some seeds from the [S.name].</span>"
|
||||
|
||||
55
code/game/machinery/taxi_buttons.dm
Normal file
55
code/game/machinery/taxi_buttons.dm
Normal file
@@ -0,0 +1,55 @@
|
||||
/obj/machinery/door_control/taxi
|
||||
name = "taxi caller"
|
||||
desc = "TAXI!"
|
||||
var/destination
|
||||
power_channel = ENVIRON
|
||||
req_access = list(access_taxi)
|
||||
|
||||
|
||||
/obj/machinery/door_control/taxi/attack_hand(mob/user as mob)
|
||||
src.add_fingerprint(usr)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
|
||||
var/wait_time = 30
|
||||
if(!allowed(user) && (wires & 1))
|
||||
wait_time = 150
|
||||
|
||||
use_power(5)
|
||||
icon_state = "doorctrl1"
|
||||
add_fingerprint(user)
|
||||
|
||||
for(var/obj/machinery/computer/taxi_shuttle/TS in world)
|
||||
if(id_tag == TS.id_tag)
|
||||
if(!TS.callTo(destination, wait_time))
|
||||
src.visible_message("Taxi engines are on cooldown. Please wait before trying again.")
|
||||
break
|
||||
|
||||
spawn(30)
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
/obj/machinery/door_control/taxi/abandoned
|
||||
name = "taxi caller"
|
||||
desc = "...Taxi?"
|
||||
destination = "abandoned"
|
||||
id_tag = "taxi_null"
|
||||
req_access = list()
|
||||
|
||||
/obj/machinery/door_control/taxi/abandoned/attack_hand(mob/user as mob)
|
||||
src.add_fingerprint(usr)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
|
||||
if(!allowed(user) && (wires & 1))
|
||||
user << "<span class='rose'>Access Denied</span>"
|
||||
flick("doorctrl-denied",src)
|
||||
return
|
||||
|
||||
use_power(5)
|
||||
icon_state = "doorctrl1"
|
||||
add_fingerprint(user)
|
||||
|
||||
src.visible_message("<span class='rose'>UNKNOWN TAXI engines are on cooldown. Plea-</span>")
|
||||
|
||||
spawn(30)
|
||||
icon_state = initial(icon_state)
|
||||
@@ -34,7 +34,7 @@
|
||||
var/vend_ready = 1 //Are we ready to vend?? Is it time??
|
||||
var/vend_delay = 10 //How long does it take to vend?
|
||||
var/datum/data/vending_product/currently_vending = null // A /datum/data/vending_product instance of what we're paying for right now.
|
||||
|
||||
var/delay_product_spawn // If set, uses sleep() in product spawn proc (mostly for seeds to retrieve correct names).
|
||||
// To be filled out at compile time
|
||||
var/list/products = list() // For each, use the following pattern:
|
||||
var/list/contraband = list() // list(/type/path = amount,/type/path2 = amount2)
|
||||
@@ -144,7 +144,6 @@
|
||||
|
||||
var/atom/temp = new typepath(null)
|
||||
var/datum/data/vending_product/R = new /datum/data/vending_product()
|
||||
R.product_name = temp.name
|
||||
R.product_path = typepath
|
||||
R.amount = amount
|
||||
R.price = price
|
||||
@@ -159,6 +158,13 @@
|
||||
else
|
||||
R.category=CAT_NORMAL
|
||||
product_records += R
|
||||
|
||||
if(delay_product_spawn)
|
||||
sleep(1)
|
||||
R.product_name = temp.name
|
||||
else
|
||||
R.product_name = temp.name
|
||||
|
||||
// world << "Added: [R.product_name]] - [R.amount] - [R.product_path]"
|
||||
|
||||
/obj/machinery/vending/emag(mob/user)
|
||||
@@ -774,7 +780,7 @@
|
||||
product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..."
|
||||
icon_state = "nutri"
|
||||
icon_deny = "nutri-deny"
|
||||
products = list(/obj/item/beezeez = 45,/obj/item/nutrient/ez = 35,/obj/item/nutrient/l4z = 25,/obj/item/nutrient/rh = 15,/obj/item/weapon/pestspray = 20,
|
||||
products = list(/obj/item/beezeez = 45,/obj/item/weapon/reagent_containers/glass/fertilizer/ez = 35,/obj/item/weapon/reagent_containers/glass/fertilizer/l4z = 25,/obj/item/weapon/reagent_containers/glass/fertilizer/rh = 15,/obj/item/weapon/plantspray/pests = 20,
|
||||
/obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/storage/bag/plants = 5)
|
||||
contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
|
||||
|
||||
@@ -789,9 +795,9 @@
|
||||
/obj/item/seeds/sunflowerseed = 3,/obj/item/seeds/tomatoseed = 3,/obj/item/seeds/towermycelium = 3,/obj/item/seeds/wheatseed = 3,/obj/item/seeds/appleseed = 3,
|
||||
/obj/item/seeds/poppyseed = 3,/obj/item/seeds/ambrosiavulgarisseed = 3,/obj/item/seeds/whitebeetseed = 3,/obj/item/seeds/sugarcaneseed = 3,/obj/item/seeds/watermelonseed = 3,/obj/item/seeds/limeseed = 3,
|
||||
/obj/item/seeds/lemonseed = 3,/obj/item/seeds/orangeseed = 3,/obj/item/seeds/grassseed = 3,/obj/item/seeds/cocoapodseed = 3,
|
||||
/obj/item/seeds/cabbageseed = 3,/obj/item/seeds/grapeseed = 3,/obj/item/seeds/pumpkinseed = 3,/obj/item/seeds/cherryseed = 3,/obj/item/seeds/plastiseed = 3,/obj/item/seeds/riceseed = 3,/obj/item/seeds/synthmeatseed = 3)
|
||||
/obj/item/seeds/cabbageseed = 3,/obj/item/seeds/grapeseed = 3,/obj/item/seeds/pumpkinseed = 3,/obj/item/seeds/cherryseed = 3,/obj/item/seeds/plastiseed = 3,/obj/item/seeds/riceseed = 3)//,/obj/item/seeds/synthmeatseed = 3)
|
||||
contraband = list(/obj/item/seeds/amanitamycelium = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/libertymycelium = 2,/obj/item/seeds/nettleseed = 2,
|
||||
/obj/item/seeds/plumpmycelium = 2,/obj/item/seeds/reishimycelium = 2,/obj/item/seeds/harebell = 3,/obj/item/seeds/synthbuttseed = 3)
|
||||
/obj/item/seeds/plumpmycelium = 2,/obj/item/seeds/reishimycelium = 2,/obj/item/seeds/harebell = 3)//,/obj/item/seeds/synthbuttseed = 3)
|
||||
premium = list(/obj/item/toy/waterflower = 1)
|
||||
|
||||
|
||||
|
||||
@@ -8,8 +8,6 @@
|
||||
icon_state = "mecha_equip"
|
||||
force = 5
|
||||
origin_tech = "materials=2"
|
||||
construction_time = 100
|
||||
construction_cost = list("metal"=10000)
|
||||
var/equip_cooldown = 0
|
||||
var/equip_ready = 1
|
||||
var/energy_drain = 0
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
origin_tech = "programming=2;biotech=3"
|
||||
energy_drain = 20
|
||||
range = MELEE
|
||||
construction_cost = list("iron"=5000,"glass"=10000)
|
||||
reliability = 1000
|
||||
equip_cooldown = 20
|
||||
var/mob/living/carbon/occupant = null
|
||||
@@ -400,8 +399,6 @@
|
||||
range = MELEE|RANGED
|
||||
equip_cooldown = 10
|
||||
origin_tech = "materials=3;biotech=4;magnets=4;programming=3"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=3000,"glass"=2000)
|
||||
|
||||
New()
|
||||
..()
|
||||
|
||||
183
code/game/mecha/equipment/tools/sec_tools.dm
Normal file
183
code/game/mecha/equipment/tools/sec_tools.dm
Normal file
@@ -0,0 +1,183 @@
|
||||
#define MECH_JAIL_TIME 10
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jail
|
||||
name = "Mounted Jail Cell"
|
||||
desc = "Mounted Jail Cell, capable of holding up to two prisoners for a limited time. (Can be attached to Gygax)"
|
||||
icon_state = "mecha_jail"
|
||||
origin_tech = "biotech=2;combat=4"
|
||||
energy_drain = 20
|
||||
range = MELEE
|
||||
reliability = 1000
|
||||
equip_cooldown = 50 //very long time to actually load someone up
|
||||
var/list/cells = list("cell1" = list("mob" = null, "timer" = 0), "cell2" = list("mob" = null, "timer" = 0))
|
||||
var/datum/global_iterator/pr_mech_jail
|
||||
salvageable = 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jail/can_attach(obj/mecha/combat/gygax/G)
|
||||
if(..())
|
||||
if(istype(G))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jail/New()
|
||||
. = ..()
|
||||
pr_mech_jail = new /datum/global_iterator/mech_jail(list(src),0)
|
||||
pr_mech_jail.set_delay(equip_cooldown)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jail/allow_drop()
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jail/destroy()
|
||||
for(var/atom/movable/AM in src)
|
||||
AM.forceMove(get_turf(src))
|
||||
for(var/list/cell in cells) //safety nets
|
||||
var/celldetails = cells[cell]
|
||||
if(celldetails["mob"])
|
||||
var/mob/living/carbon/occupant = celldetails["mob"]
|
||||
occupant.loc = get_turf(src)
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jail/Exit(atom/movable/O)
|
||||
return 0
|
||||
|
||||
//is there an open cell for a mob?
|
||||
//returns the cell that's got a space
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jail/proc/CellFree()
|
||||
for(var/cell in cells)
|
||||
var/list/celldetails = cells[cell]
|
||||
if(!celldetails["mob"])
|
||||
return celldetails
|
||||
return
|
||||
|
||||
//are all our cells empty?
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jail/proc/AllFree()
|
||||
var/allfree = 1
|
||||
for(var/cell in cells)
|
||||
var/list/celldetails = cells[cell]
|
||||
if(celldetails["mob"])
|
||||
allfree = 0
|
||||
break
|
||||
return allfree
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jail/action(var/mob/living/carbon/target)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
if(!istype(target))
|
||||
return
|
||||
if(target.buckled)
|
||||
occupant_message("[target] will not fit into the jail cell because they are buckled to [target.buckled].")
|
||||
return
|
||||
if(!CellFree())
|
||||
occupant_message("The jail cells are already occupied")
|
||||
return
|
||||
if(!(target.handcuffed || target.legcuffed))
|
||||
occupant_message("[target] must be restrained before they can be properly placed in the holding cell.")
|
||||
return
|
||||
for(var/mob/living/carbon/slime/M in range(1,target))
|
||||
if(M.Victim == target)
|
||||
occupant_message("[target] will not fit into the jail cell because they have a slime latched onto their head.")
|
||||
return
|
||||
occupant_message("You start putting [target] into [src].")
|
||||
chassis.visible_message("[chassis] starts putting [target] into the [src].")
|
||||
var/C = chassis.loc
|
||||
var/T = target.loc
|
||||
if(do_after_cooldown(target))
|
||||
if(chassis.loc!=C || target.loc!=T)
|
||||
return
|
||||
if(!CellFree())
|
||||
occupant_message("<font color=\"red\"><B>The jail cells are already occupied!</B></font>")
|
||||
return
|
||||
target.forceMove(src)
|
||||
var/list/chosencell = CellFree()
|
||||
chosencell["mob"] = target
|
||||
chosencell["timer"] = MECH_JAIL_TIME
|
||||
if(!CellFree())
|
||||
set_ready_state(0)
|
||||
target.reset_view(src)
|
||||
/*
|
||||
if(target.client)
|
||||
target.client.perspective = EYE_PERSPECTIVE
|
||||
target.client.eye = chassis
|
||||
*/
|
||||
if(CellFree()) //because the process can't have been already going if both cells were empty
|
||||
pr_mech_jail.start()
|
||||
occupant_message("<font color='blue'>[target] successfully loaded into [src].")
|
||||
chassis.visible_message("[chassis] loads [target] into [src].")
|
||||
log_message("[target] loaded.")
|
||||
return 1
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jail/proc/go_out(var/list/L)
|
||||
var/mob/living/ejected = L["mob"]
|
||||
if(!ejected)
|
||||
return
|
||||
ejected.forceMove(get_turf(src))
|
||||
occupant_message("[ejected] ejected.")
|
||||
log_message("[ejected] ejected.")
|
||||
L["timer"] = 0
|
||||
ejected.reset_view()
|
||||
/*
|
||||
if(occupant.client)
|
||||
occupant.client.eye = occupant.client.mob
|
||||
occupant.client.perspective = MOB_PERSPECTIVE
|
||||
*/
|
||||
L["mob"] = null
|
||||
ejected = null
|
||||
if(AllFree())
|
||||
pr_mech_jail.stop()
|
||||
set_ready_state(1)
|
||||
return 1
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jail/detach()
|
||||
if(!AllFree())
|
||||
occupant_message("Unable to detach [src] - equipment occupied.")
|
||||
return
|
||||
pr_mech_jail.stop()
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jail/get_equip_info()
|
||||
var/output = ..()
|
||||
if(output)
|
||||
var/temp = ""
|
||||
for(var/cell in cells)
|
||||
var/list/celldetails = cells[cell]
|
||||
var/mob/living/carbon/occupant = celldetails["mob"]
|
||||
var/timer = celldetails["timer"]
|
||||
temp += "<br />\[Occupant: [occupant ? "[occupant] (Health: [occupant.health]%)" : "none"]\]<br />|Time left: [timer * 3]|<a href='?src=\ref[src];eject[cell]=1'>Eject</a>"
|
||||
return "[output] [temp]"
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jail/Topic(href,href_list)
|
||||
..()
|
||||
var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
|
||||
for(var/cell in cells)
|
||||
if(filter.get("eject[cell]"))
|
||||
go_out(cells[cell])
|
||||
return
|
||||
|
||||
/datum/global_iterator/mech_jail/process(var/obj/item/mecha_parts/mecha_equipment/tool/jail/J)
|
||||
//log_admin("Timer 1: [J.ctimer1], Timer 2: [J.ctimer2]")
|
||||
if(!J.chassis)
|
||||
J.set_ready_state(1)
|
||||
return stop()
|
||||
if(!J.chassis.has_charge(J.energy_drain))
|
||||
J.set_ready_state(1)
|
||||
J.log_message("Deactivated.")
|
||||
J.occupant_message("[src] deactivated - no power.")
|
||||
for(var/cell in J.cells)
|
||||
J.go_out(J.cells[cell])
|
||||
return stop()
|
||||
if(J.AllFree())
|
||||
return stop()
|
||||
for(var/cell in J.cells)
|
||||
var/list/thiscell = J.cells[cell]
|
||||
if (thiscell["mob"])
|
||||
thiscell["timer"]--
|
||||
if (thiscell["timer"] <= 0)
|
||||
J.go_out(thiscell)
|
||||
else if(thiscell["timer"] == 1)
|
||||
J.occupant_message("<span class='warning'>[thiscell["mob"]] will be ejected in 3 seconds!</span>")
|
||||
J.chassis.use_power(J.energy_drain)
|
||||
J.update_equip_info()
|
||||
return
|
||||
@@ -143,7 +143,6 @@
|
||||
desc = "This is an upgraded version of the drill that'll pierce the heavens! (Can be attached to: Combat and Engineering Exosuits)"
|
||||
icon_state = "mecha_diamond_drill"
|
||||
origin_tech = "materials=4;engineering=3"
|
||||
construction_cost = list("iron"=10000,"diamond"=6500)
|
||||
equip_cooldown = 20
|
||||
force = 15
|
||||
|
||||
@@ -284,8 +283,6 @@
|
||||
equip_cooldown = 10
|
||||
energy_drain = 250
|
||||
range = MELEE|RANGED
|
||||
construction_time = 1200
|
||||
construction_cost = list("iron"=30000,"plasma"=25000,"silver"=20000,"gold"=20000)
|
||||
var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock.
|
||||
var/disabled = 0 //malf
|
||||
|
||||
@@ -535,7 +532,6 @@
|
||||
equip_cooldown = 10
|
||||
energy_drain = 50
|
||||
range = 0
|
||||
construction_cost = list("iron"=20000,"silver"=5000)
|
||||
var/deflect_coeff = 1.15
|
||||
var/damage_coeff = 0.8
|
||||
|
||||
@@ -586,7 +582,6 @@
|
||||
equip_cooldown = 10
|
||||
energy_drain = 50
|
||||
range = 0
|
||||
construction_cost = list("iron"=20000,"gold"=5000)
|
||||
var/deflect_coeff = 1.15
|
||||
var/damage_coeff = 0.8
|
||||
|
||||
@@ -658,7 +653,6 @@
|
||||
equip_cooldown = 20
|
||||
energy_drain = 100
|
||||
range = 0
|
||||
construction_cost = list("iron"=10000,"gold"=1000,"silver"=2000,"glass"=5000)
|
||||
var/health_boost = 2
|
||||
var/datum/global_iterator/pr_repair_droid
|
||||
var/icon/droid_overlay
|
||||
@@ -748,7 +742,6 @@
|
||||
equip_cooldown = 10
|
||||
energy_drain = 0
|
||||
range = 0
|
||||
construction_cost = list("iron"=10000,"gold"=2000,"silver"=3000,"glass"=2000)
|
||||
var/datum/global_iterator/pr_energy_relay
|
||||
var/coeff = 100
|
||||
var/list/use_channels = list(EQUIP,ENVIRON,LIGHT)
|
||||
@@ -860,7 +853,6 @@
|
||||
equip_cooldown = 10
|
||||
energy_drain = 0
|
||||
range = MELEE
|
||||
construction_cost = list("iron"=10000,"silver"=500,"glass"=1000)
|
||||
var/datum/global_iterator/pr_mech_generator
|
||||
var/coeff = 100
|
||||
var/obj/item/stack/sheet/fuel
|
||||
@@ -997,7 +989,6 @@
|
||||
desc = "Generates power using uranium. Pollutes the environment."
|
||||
icon_state = "tesla"
|
||||
origin_tech = "powerstorage=3;engineering=3"
|
||||
construction_cost = list("iron"=10000,"silver"=500,"glass"=1000)
|
||||
max_fuel = 50000
|
||||
fuel_per_cycle_idle = 10
|
||||
fuel_per_cycle_active = 30
|
||||
|
||||
@@ -104,8 +104,6 @@
|
||||
energy_drain = 200
|
||||
equip_cooldown = 150
|
||||
range = MELEE|RANGED
|
||||
construction_time = 500
|
||||
construction_cost = list("iron"=20000,"clown"=10000)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/honker/can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
@@ -334,7 +332,6 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang//Because I am a heartless bastard -Sieve
|
||||
name = "SOP-6 Grenade Launcher"
|
||||
projectile = /obj/item/weapon/grenade/flashbang/clusterbang
|
||||
construction_cost = list("iron"=20000,"gold"=6000,"uranium"=6000)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited/get_equip_info()//Limited version of the clusterbang launcher that can't reload
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [chassis.selected==src?"<b>":"<a href='?src=\ref[chassis];select_equip=\ref[src]'>"][src.name][chassis.selected==src?"</b>":"</a>"]\[[src.projectiles]\]"
|
||||
@@ -351,8 +348,6 @@
|
||||
missile_speed = 1.5
|
||||
projectile_energy_cost = 100
|
||||
equip_cooldown = 20
|
||||
construction_time = 300
|
||||
construction_cost = list("iron"=20000,"clown"=5000)
|
||||
|
||||
can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
@@ -381,8 +376,6 @@
|
||||
missile_speed = 1.5
|
||||
projectile_energy_cost = 100
|
||||
equip_cooldown = 10
|
||||
construction_time = 300
|
||||
construction_cost = list("iron"=20000,"clown"=5000)
|
||||
|
||||
can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
@@ -412,8 +405,6 @@
|
||||
missile_range = 30
|
||||
projectile_energy_cost = 50
|
||||
equip_cooldown = 10
|
||||
construction_time = 300
|
||||
construction_cost = list("iron"=20000)
|
||||
|
||||
can_attach(obj/mecha/combat/gygax/M as obj)
|
||||
if(..())
|
||||
|
||||
@@ -18,27 +18,21 @@
|
||||
#define MECH_SCREEN_SPACE_POD 12
|
||||
#define MECH_SCREEN_MISC 13
|
||||
|
||||
|
||||
#define MECH_BUILD_TIME 1
|
||||
|
||||
/obj/machinery/r_n_d/fabricator/mech
|
||||
name = "Exosuit Fabricator"
|
||||
desc = "Nothing is being built."
|
||||
desc = "A specialised fabricator for robotic and mechatronic components."
|
||||
icon = 'icons/obj/robotics.dmi'
|
||||
icon_state = "fab"
|
||||
req_one_access = list(access_robotics)
|
||||
time_coeff = 1.5 //can be upgraded with research
|
||||
resource_coeff = 1.5 //can be upgraded with research
|
||||
has_mat_overlays = 1
|
||||
|
||||
research_flags = NANOTOUCH | HASOUTPUT | HASMAT_OVER | TAKESMATIN | ACCESS_EMAG | LOCKBOXES
|
||||
|
||||
nano_file = "exofab.tmpl"
|
||||
|
||||
locked_parts = list(
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon
|
||||
)
|
||||
|
||||
unlocked_parts = list(
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/honker
|
||||
)
|
||||
build_time = MECH_BUILD_TIME
|
||||
build_number = 16
|
||||
|
||||
screen = MECH_SCREEN_MAIN
|
||||
part_sets = list( //set names must be unique
|
||||
@@ -95,7 +89,7 @@
|
||||
/obj/item/mecha_parts/part/durand_right_leg,
|
||||
/obj/item/mecha_parts/part/durand_armour
|
||||
),
|
||||
"Honk"=list(
|
||||
"HONK"=list(
|
||||
/obj/item/mecha_parts/chassis/honker,
|
||||
/obj/item/mecha_parts/part/honker_torso,
|
||||
/obj/item/mecha_parts/part/honker_head,
|
||||
|
||||
@@ -85,8 +85,6 @@
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "motion2"
|
||||
origin_tech = "programming=2;magnets=2"
|
||||
construction_time = 50
|
||||
construction_cost = list("metal"=500)
|
||||
|
||||
proc/get_mecha_info()
|
||||
if(!in_mecha())
|
||||
|
||||
457
code/game/mecha/mecha_designs.dm
Normal file
457
code/game/mecha/mecha_designs.dm
Normal file
@@ -0,0 +1,457 @@
|
||||
//Contains the designs for, in this order:
|
||||
//Ripley parts
|
||||
//Odysseus parts
|
||||
//Gygax parts
|
||||
//Durand parts
|
||||
//Honker parts
|
||||
//Phazon parts
|
||||
|
||||
#define MECHFAB 16 //from designs.dm
|
||||
|
||||
/datum/design/ripley/chassis
|
||||
name = "Exosuit Structure (Ripley chassis)"
|
||||
desc = "Used to build a Ripley chassis."
|
||||
id = "ripley_chassis"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/chassis/ripley
|
||||
category = "Ripley"
|
||||
materials = list("$iron"=20000)
|
||||
|
||||
/datum/design/ripley/torso
|
||||
name = "Exosuit Structure (Ripley torso)"
|
||||
desc = "Used to build a Ripley torso."
|
||||
id = "ripley_torso"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/ripley_torso
|
||||
category = "Ripley"
|
||||
materials = list("$iron"=40000,"$glass"=15000)
|
||||
|
||||
/datum/design/ripley/l_arm
|
||||
name = "Exosuit Structure (Ripley left arm)"
|
||||
desc = "Used to build a Ripley left arm."
|
||||
id = "ripley_larm"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/ripley_left_arm
|
||||
category = "Ripley"
|
||||
materials = list("$iron"=25000)
|
||||
|
||||
/datum/design/ripley/r_arm
|
||||
name = "Exosuit Structure (Ripley right arm)"
|
||||
desc = "Used to build a Ripley right arm."
|
||||
id = "ripley_rarm"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/ripley_right_arm
|
||||
category = "Ripley"
|
||||
materials = list("$iron"=25000)
|
||||
|
||||
/datum/design/ripley/l_leg
|
||||
name = "Exosuit Structure (Ripley left leg)"
|
||||
desc = "Used to build a Ripley left leg."
|
||||
id = "ripley_lleg"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/ripley_left_leg
|
||||
category = "Ripley"
|
||||
materials = list("$iron"=30000)
|
||||
|
||||
/datum/design/ripley/r_leg
|
||||
name = "Exosuit Structure (Ripley right leg)"
|
||||
desc = "Used to build a Ripley right leg."
|
||||
id = "ripley_rleg"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/ripley_right_leg
|
||||
category = "Ripley"
|
||||
materials = list("$iron"=30000)
|
||||
|
||||
////////////////
|
||||
////ODYSSEUS////
|
||||
////////////////
|
||||
|
||||
/datum/design/odysseus/chassis
|
||||
name = "Exosuit Structure (Odysseus chassis)"
|
||||
desc = "Used to build a Odysseus chassis."
|
||||
id = "odysseus_chassis"
|
||||
req_tech = list("biotech" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/chassis/odysseus
|
||||
category = "Odysseus"
|
||||
materials = list("$iron"=20000)
|
||||
|
||||
/datum/design/odysseus/torso
|
||||
name = "Exosuit Structure (Odysseus torso)"
|
||||
desc = "Used to build a Odysseus torso."
|
||||
id = "odysseus_torso"
|
||||
req_tech = list("biotech" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/odysseus_torso
|
||||
category = "Odysseus"
|
||||
materials = list("$iron"=25000)
|
||||
|
||||
/datum/design/odysseus/l_arm
|
||||
name = "Exosuit Structure (Odysseus left arm)"
|
||||
desc = "Used to build a Odysseus left arm."
|
||||
id = "odysseus_larm"
|
||||
req_tech = list("biotech" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/odysseus_left_arm
|
||||
category = "Odysseus"
|
||||
materials = list("$iron"=10000)
|
||||
|
||||
/datum/design/odysseus/r_arm
|
||||
name = "Exosuit Structure (Odysseus right arm)"
|
||||
desc = "Used to build a Odysseus right arm."
|
||||
id = "odysseus_rarm"
|
||||
req_tech = list("biotech" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/odysseus_right_arm
|
||||
category = "Odysseus"
|
||||
materials = list("$iron"=10000)
|
||||
|
||||
/datum/design/odysseus/l_leg
|
||||
name = "Exosuit Structure (Odysseus left leg)"
|
||||
desc = "Used to build a Odysseus left leg."
|
||||
id = "odysseus_lleg"
|
||||
req_tech = list("biotech" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/odysseus_left_leg
|
||||
category = "Odysseus"
|
||||
materials = list("$iron"=15000)
|
||||
|
||||
/datum/design/odysseus/r_leg
|
||||
name = "Exosuit Structure (Odysseus right leg)"
|
||||
desc = "Used to build a Odysseus right leg."
|
||||
id = "odysseus_rleg"
|
||||
req_tech = list("biotech" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/odysseus_right_leg
|
||||
category = "Odysseus"
|
||||
materials = list("$iron"=15000)
|
||||
|
||||
/datum/design/odysseus/head
|
||||
name = "Exosuit Structure (Odysseus head)"
|
||||
desc = "Used to build a Odysseus head."
|
||||
id = "odysseus_head"
|
||||
req_tech = list("biotech" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/odysseus_head
|
||||
category = "Odysseus"
|
||||
materials = list("$iron"=2000,"$glass"=10000)
|
||||
|
||||
////////////////
|
||||
/////GYGAX//////
|
||||
////////////////
|
||||
/datum/design/gygax/chassis
|
||||
name = "Exosuit Structure (Gygax chassis)"
|
||||
desc = "Used to build a Gygax chassis."
|
||||
id = "gygax_chassis"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/chassis/gygax
|
||||
category = "Gygax"
|
||||
materials = list("$iron"=25000)
|
||||
|
||||
/datum/design/gygax/torso
|
||||
name = "Exosuit Structure (Gygax torso)"
|
||||
desc = "Used to build a Gygax torso."
|
||||
id = "gygax_torso"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/gygax_torso
|
||||
category = "Gygax"
|
||||
materials = list("$iron"=50000,"$glass"=20000)
|
||||
|
||||
/datum/design/gygax/l_arm
|
||||
name = "Exosuit Structure (Gygax left arm)"
|
||||
desc = "Used to build a Gygax left arm."
|
||||
id = "gygax_larm"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/gygax_left_arm
|
||||
category = "Gygax"
|
||||
materials = list("$iron"=30000)
|
||||
|
||||
/datum/design/gygax/r_arm
|
||||
name = "Exosuit Structure (Gygax right arm)"
|
||||
desc = "Used to build a Gygax right arm."
|
||||
id = "gygax_rarm"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/gygax_right_arm
|
||||
category = "Gygax"
|
||||
materials = list("$iron"=30000)
|
||||
|
||||
/datum/design/gygax/l_leg
|
||||
name = "Exosuit Structure (Gygax left leg)"
|
||||
desc = "Used to build a Gygax left leg."
|
||||
id = "gygax_lleg"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/gygax_left_leg
|
||||
category = "Gygax"
|
||||
materials = list("$iron"=35000)
|
||||
|
||||
/datum/design/gygax/r_leg
|
||||
name = "Exosuit Structure (Gygax right leg)"
|
||||
desc = "Used to build a Gygax right leg."
|
||||
id = "gygax_rleg"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/gygax_right_leg
|
||||
category = "Gygax"
|
||||
materials = list("$iron"=35000)
|
||||
|
||||
/datum/design/gygax/head
|
||||
name = "Exosuit Structure (Gygax head)"
|
||||
desc = "Used to build a Gygax head."
|
||||
id = "gygax_head"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/gygax_head
|
||||
category = "Gygax"
|
||||
materials = list("$iron"=20000,"$glass"=10000)
|
||||
|
||||
/datum/design/gygax/armor
|
||||
name = "Exosuit Structure (Gygax plates)"
|
||||
desc = "Used to build Gygax armor plates."
|
||||
id = "gygax_armor"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/gygax_armour
|
||||
category = "Gygax"
|
||||
materials = list("$iron"=50000,"$diamond"=10000)
|
||||
|
||||
///////////////
|
||||
////DURAND/////
|
||||
///////////////
|
||||
|
||||
/datum/design/durand/chassis
|
||||
name = "Exosuit Structure (Durand chassis)"
|
||||
desc = "Used to build a Durand chassis."
|
||||
id = "durand_chassis"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/chassis/durand
|
||||
category = "Durand"
|
||||
materials = list("$iron"=25000)
|
||||
|
||||
/datum/design/durand/torso
|
||||
name = "Exosuit Structure (Durand torso)"
|
||||
desc = "Used to build a Durand torso."
|
||||
id = "durand_torso"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/durand_torso
|
||||
category = "Durand"
|
||||
materials = list("$iron"=55000,"$glass"=20000,"$silver"=10000)
|
||||
|
||||
/datum/design/durand/l_arm
|
||||
name = "Exosuit Structure (Durand left arm)"
|
||||
desc = "Used to build a Durand left arm."
|
||||
id = "durand_larm"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/durand_left_arm
|
||||
category = "Durand"
|
||||
materials = list("$iron"=35000,"$silver"=3000)
|
||||
|
||||
/datum/design/durand/r_arm
|
||||
name = "Exosuit Structure (Durand right arm)"
|
||||
desc = "Used to build a Durand right arm."
|
||||
id = "durand_rarm"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/durand_right_arm
|
||||
category = "Durand"
|
||||
materials = list("$iron"=35000,"$silver"=3000)
|
||||
|
||||
/datum/design/durand/l_leg
|
||||
name = "Exosuit Structure (Durand left leg)"
|
||||
desc = "Used to build a Durand left leg."
|
||||
id = "durand_lleg"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/durand_left_leg
|
||||
category = "Durand"
|
||||
materials = list("$iron"=40000,"$silver"=3000)
|
||||
|
||||
/datum/design/durand/r_leg
|
||||
name = "Exosuit Structure (Durand right leg)"
|
||||
desc = "Used to build a Durand right leg."
|
||||
id = "durand_rleg"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/durand_right_leg
|
||||
category = "Durand"
|
||||
materials = list("$iron"=40000,"$silver"=3000)
|
||||
|
||||
/datum/design/durand/head
|
||||
name = "Exosuit Structure (Durand head)"
|
||||
desc = "Used to build a Durand head."
|
||||
id = "durand_head"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/durand_head
|
||||
category = "Durand"
|
||||
materials = list("$iron"=25000,"$glass"=10000,"$silver"=3000)
|
||||
|
||||
/datum/design/durand/armor
|
||||
name = "Exosuit Structure (Durand plates)"
|
||||
desc = "Used to build Durand armor plates."
|
||||
id = "durand_armor"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/durand_armour
|
||||
category = "Durand"
|
||||
materials = list("$iron"=50000,"uranium"=10000)
|
||||
|
||||
////////////////
|
||||
////HONK////////
|
||||
////////////////
|
||||
/datum/design/honker/chassis
|
||||
name = "Exosuit Structure (H.O.N.K. chassis)"
|
||||
desc = "Used to build a H.O.N.K. chassis."
|
||||
id = "honker_chassis"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/chassis/honker
|
||||
category = "HONK"
|
||||
materials = list("$iron"=20000)
|
||||
|
||||
/datum/design/honker/torso
|
||||
name = "Exosuit Structure (H.O.N.K. torso)"
|
||||
desc = "Used to build a H.O.N.K. torso."
|
||||
id = "honker_torso"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/honker_torso
|
||||
category = "HONK"
|
||||
materials = list("$iron"=35000,"$glass"=10000,"$clown"=10000)
|
||||
|
||||
/datum/design/honker/l_arm
|
||||
name = "Exosuit Structure (H.O.N.K. left arm)"
|
||||
desc = "Used to build a H.O.N.K. left arm."
|
||||
id = "honker_larm"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/honker_left_arm
|
||||
category = "HONK"
|
||||
materials = list("$iron"=20000,"$clown"=5000)
|
||||
|
||||
/datum/design/honker/r_arm
|
||||
name = "Exosuit Structure (H.O.N.K. right arm)"
|
||||
desc = "Used to build a H.O.N.K. right arm."
|
||||
id = "honker_rarm"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/honker_right_arm
|
||||
category = "HONK"
|
||||
materials = list("$iron"=20000,"$clown"=5000)
|
||||
|
||||
/datum/design/honker/l_leg
|
||||
name = "Exosuit Structure (H.O.N.K. left leg)"
|
||||
desc = "Used to build a H.O.N.K. left leg."
|
||||
id = "honker_lleg"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/honker_left_leg
|
||||
category = "HONK"
|
||||
materials = list("$iron"=20000,"$clown"=5000)
|
||||
|
||||
/datum/design/honker/r_leg
|
||||
name = "Exosuit Structure (H.O.N.K. right leg)"
|
||||
desc = "Used to build a H.O.N.K. right leg."
|
||||
id = "honker_rleg"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/honker_right_leg
|
||||
category = "HONK"
|
||||
materials = list("$iron"=20000,"$clown"=5000)
|
||||
|
||||
/datum/design/honker/head
|
||||
name = "Exosuit Structure (H.O.N.K. head)"
|
||||
desc = "Used to build a H.O.N.K. head."
|
||||
id = "honker_head"
|
||||
req_tech = list("combat" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/honker_head
|
||||
category = "HONK"
|
||||
materials = list("$iron"=15000,"$glass"=5000,"$clown"=5000)
|
||||
|
||||
//////////////
|
||||
/////PHAZON///
|
||||
//////////////
|
||||
|
||||
/datum/design/phazon/chassis
|
||||
name = "Exosuit Structure (Phazon chassis)"
|
||||
desc = "Used to build a Phazon chassis."
|
||||
id = "phazon_chassis"
|
||||
req_tech = list("bluespace" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/chassis/phazon
|
||||
category = "Phazon"
|
||||
materials = list("$iron"=25000)
|
||||
|
||||
/datum/design/phazon/torso
|
||||
name = "Exosuit Structure (Phazon torso)"
|
||||
desc = "Used to build a Phazon torso."
|
||||
id = "phazon_torso"
|
||||
req_tech = list("bluespace" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/phazon_torso
|
||||
category = "Phazon"
|
||||
materials = list("$iron"=35000,"$glass"=10000,"$plasma"=20000, "$phazon"=5000)
|
||||
|
||||
/datum/design/phazon/l_arm
|
||||
name = "Exosuit Structure (Phazon left arm)"
|
||||
desc = "Used to build a Phazon left arm."
|
||||
id = "phazon_larm"
|
||||
req_tech = list("bluespace" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/phazon_left_arm
|
||||
category = "Phazon"
|
||||
materials = list("$iron"=20000,"$plasma"=10000, "$phazon"=2500)
|
||||
|
||||
/datum/design/phazon/r_arm
|
||||
name = "Exosuit Structure (Phazon right arm)"
|
||||
desc = "Used to build a Phazon right arm."
|
||||
id = "phazon_rarm"
|
||||
req_tech = list("bluespace" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/phazon_right_arm
|
||||
category = "Phazon"
|
||||
materials = list("$iron"=20000,"$plasma"=10000, "$phazon"=2500)
|
||||
|
||||
/datum/design/phazon/l_leg
|
||||
name = "Exosuit Structure (Phazon left leg)"
|
||||
desc = "Used to build a Phazon left leg."
|
||||
id = "phazon_lleg"
|
||||
req_tech = list("bluespace" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/phazon_left_leg
|
||||
category = "Phazon"
|
||||
materials = list("$iron"=20000,"$plasma"=10000, "$phazon"=2500)
|
||||
|
||||
/datum/design/phazon/r_leg
|
||||
name = "Exosuit Structure (Phazon right leg)"
|
||||
desc = "Used to build a Phazon right leg."
|
||||
id = "phazon_rleg"
|
||||
req_tech = list("bluespace" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/phazon_right_leg
|
||||
category = "Phazon"
|
||||
materials = list("$iron"=20000,"$plasma"=10000, "$phazon"=2500)
|
||||
|
||||
/datum/design/phazon/head
|
||||
name = "Exosuit Structure (Phazon head)"
|
||||
desc = "Used to build a Phazon head."
|
||||
id = "phazon_head"
|
||||
req_tech = list("bluespace" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/phazon_head
|
||||
category = "Phazon"
|
||||
materials = list("$iron"=15000,"$glass"=5000,"$plasma"=10000, "$phazon"=2500)
|
||||
@@ -9,15 +9,12 @@
|
||||
w_class = 20
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
origin_tech = "programming=2;materials=2"
|
||||
var/construction_time = 100
|
||||
var/list/construction_cost = list("iron"=20000,"glass"=5000)
|
||||
|
||||
|
||||
/obj/item/mecha_parts/chassis
|
||||
name="Mecha Chassis"
|
||||
icon_state = "backbone"
|
||||
var/datum/construction/construct
|
||||
construction_cost = list("iron"=20000)
|
||||
flags = FPRINT | CONDUCT
|
||||
|
||||
attackby(obj/item/W as obj, mob/user as mob)
|
||||
@@ -42,46 +39,35 @@
|
||||
desc="A torso part of Ripley APLU. Contains power unit, processing core and life support systems."
|
||||
icon_state = "ripley_harness"
|
||||
origin_tech = "programming=2;materials=2;biotech=2;engineering=2"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=40000,"glass"=15000)
|
||||
|
||||
/obj/item/mecha_parts/part/ripley_left_arm
|
||||
name="Ripley Left Arm"
|
||||
desc="A Ripley APLU left arm. Data and power sockets are compatible with most exosuit tools."
|
||||
icon_state = "ripley_l_arm"
|
||||
origin_tech = "programming=2;materials=2;engineering=2"
|
||||
construction_time = 150
|
||||
construction_cost = list("iron"=25000)
|
||||
|
||||
/obj/item/mecha_parts/part/ripley_right_arm
|
||||
name="Ripley Right Arm"
|
||||
desc="A Ripley APLU right arm. Data and power sockets are compatible with most exosuit tools."
|
||||
icon_state = "ripley_r_arm"
|
||||
origin_tech = "programming=2;materials=2;engineering=2"
|
||||
construction_time = 150
|
||||
construction_cost = list("iron"=25000)
|
||||
|
||||
/obj/item/mecha_parts/part/ripley_left_leg
|
||||
name="Ripley Left Leg"
|
||||
desc="A Ripley APLU left leg. Contains somewhat complex servodrives and balance maintaining systems."
|
||||
icon_state = "ripley_l_leg"
|
||||
origin_tech = "programming=2;materials=2;engineering=2"
|
||||
construction_time = 150
|
||||
construction_cost = list("iron"=30000)
|
||||
|
||||
/obj/item/mecha_parts/part/ripley_right_leg
|
||||
name="Ripley Right Leg"
|
||||
desc="A Ripley APLU right leg. Contains somewhat complex servodrives and balance maintaining systems."
|
||||
icon_state = "ripley_r_leg"
|
||||
origin_tech = "programming=2;materials=2;engineering=2"
|
||||
construction_time = 150
|
||||
construction_cost = list("iron"=30000)
|
||||
|
||||
///////// Gygax
|
||||
|
||||
/obj/item/mecha_parts/chassis/gygax
|
||||
name = "Gygax Chassis"
|
||||
construction_cost = list("iron"=25000)
|
||||
|
||||
New()
|
||||
..()
|
||||
@@ -92,60 +78,45 @@
|
||||
desc="A torso part of Gygax. Contains power unit, processing core and life support systems. Has an additional equipment slot."
|
||||
icon_state = "gygax_harness"
|
||||
origin_tech = "programming=2;materials=2;biotech=3;engineering=3"
|
||||
construction_time = 300
|
||||
construction_cost = list("iron"=50000,"glass"=20000)
|
||||
|
||||
/obj/item/mecha_parts/part/gygax_head
|
||||
name="Gygax Head"
|
||||
desc="A Gygax head. Houses advanced surveilance and targeting sensors."
|
||||
icon_state = "gygax_head"
|
||||
origin_tech = "programming=2;materials=2;magnets=3;engineering=3"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=20000,"glass"=10000)
|
||||
|
||||
/obj/item/mecha_parts/part/gygax_left_arm
|
||||
name="Gygax Left Arm"
|
||||
desc="A Gygax left arm. Data and power sockets are compatible with most exosuit tools and weapons."
|
||||
icon_state = "gygax_l_arm"
|
||||
origin_tech = "programming=2;materials=2;engineering=3"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=30000)
|
||||
|
||||
/obj/item/mecha_parts/part/gygax_right_arm
|
||||
name="Gygax Right Arm"
|
||||
desc="A Gygax right arm. Data and power sockets are compatible with most exosuit tools and weapons."
|
||||
icon_state = "gygax_r_arm"
|
||||
origin_tech = "programming=2;materials=2;engineering=3"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=30000)
|
||||
|
||||
/obj/item/mecha_parts/part/gygax_left_leg
|
||||
name="Gygax Left Leg"
|
||||
icon_state = "gygax_l_leg"
|
||||
origin_tech = "programming=2;materials=2;engineering=3"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=35000)
|
||||
|
||||
/obj/item/mecha_parts/part/gygax_right_leg
|
||||
name="Gygax Right Leg"
|
||||
icon_state = "gygax_r_leg"
|
||||
origin_tech = "programming=2;materials=2;engineering=3"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=35000)
|
||||
|
||||
/obj/item/mecha_parts/part/gygax_armour
|
||||
name="Gygax Armour Plates"
|
||||
icon_state = "gygax_armour"
|
||||
origin_tech = "materials=6;combat=4;engineering=5"
|
||||
construction_time = 600
|
||||
construction_cost = list("iron"=50000,"diamond"=10000)
|
||||
|
||||
|
||||
//////////// Durand
|
||||
|
||||
/obj/item/mecha_parts/chassis/durand
|
||||
name = "Durand Chassis"
|
||||
construction_cost = list("iron"=25000)
|
||||
|
||||
New()
|
||||
..()
|
||||
@@ -155,50 +126,36 @@
|
||||
name="Durand Torso"
|
||||
icon_state = "durand_harness"
|
||||
origin_tech = "programming=2;materials=3;biotech=3;engineering=3"
|
||||
construction_time = 300
|
||||
construction_cost = list("iron"=55000,"glass"=20000,"silver"=10000)
|
||||
|
||||
/obj/item/mecha_parts/part/durand_head
|
||||
name="Durand Head"
|
||||
icon_state = "durand_head"
|
||||
origin_tech = "programming=2;materials=3;magnets=3;engineering=3"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=25000,"glass"=10000,"silver"=3000)
|
||||
|
||||
/obj/item/mecha_parts/part/durand_left_arm
|
||||
name="Durand Left Arm"
|
||||
icon_state = "durand_l_arm"
|
||||
origin_tech = "programming=2;materials=3;engineering=3"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=35000,"silver"=3000)
|
||||
|
||||
/obj/item/mecha_parts/part/durand_right_arm
|
||||
name="Durand Right Arm"
|
||||
icon_state = "durand_r_arm"
|
||||
origin_tech = "programming=2;materials=3;engineering=3"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=35000,"silver"=3000)
|
||||
|
||||
/obj/item/mecha_parts/part/durand_left_leg
|
||||
name="Durand Left Leg"
|
||||
icon_state = "durand_l_leg"
|
||||
origin_tech = "programming=2;materials=3;engineering=3"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=40000,"silver"=3000)
|
||||
|
||||
/obj/item/mecha_parts/part/durand_right_leg
|
||||
name="Durand Right Leg"
|
||||
icon_state = "durand_r_leg"
|
||||
origin_tech = "programming=2;materials=3;engineering=3"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=40000,"silver"=3000)
|
||||
|
||||
/obj/item/mecha_parts/part/durand_armour
|
||||
name="Durand Armour Plates"
|
||||
icon_state = "durand_armour"
|
||||
origin_tech = "materials=5;combat=4;engineering=5"
|
||||
construction_time = 600
|
||||
construction_cost = list("iron"=50000,"uranium"=10000)
|
||||
|
||||
|
||||
|
||||
@@ -244,38 +201,26 @@
|
||||
/obj/item/mecha_parts/part/honker_torso
|
||||
name="H.O.N.K Torso"
|
||||
icon_state = "honker_harness"
|
||||
construction_time = 300
|
||||
construction_cost = list("iron"=35000,"glass"=10000,"clown"=10000)
|
||||
|
||||
/obj/item/mecha_parts/part/honker_head
|
||||
name="H.O.N.K Head"
|
||||
icon_state = "honker_head"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=15000,"glass"=5000,"clown"=5000)
|
||||
|
||||
/obj/item/mecha_parts/part/honker_left_arm
|
||||
name="H.O.N.K Left Arm"
|
||||
icon_state = "honker_l_arm"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=20000,"clown"=5000)
|
||||
|
||||
/obj/item/mecha_parts/part/honker_right_arm
|
||||
name="H.O.N.K Right Arm"
|
||||
icon_state = "honker_r_arm"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=20000,"clown"=5000)
|
||||
|
||||
/obj/item/mecha_parts/part/honker_left_leg
|
||||
name="H.O.N.K Left Leg"
|
||||
icon_state = "honker_l_leg"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=20000,"clown"=5000)
|
||||
|
||||
/obj/item/mecha_parts/part/honker_right_leg
|
||||
name="H.O.N.K Right Leg"
|
||||
icon_state = "honker_r_leg"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=20000,"clown"=5000)
|
||||
|
||||
|
||||
////////// Phazon
|
||||
@@ -291,51 +236,37 @@
|
||||
/obj/item/mecha_parts/part/phazon_torso
|
||||
name="Phazon Torso"
|
||||
icon_state = "phazon_harness"
|
||||
construction_time = 300
|
||||
construction_cost = list("iron"=35000,"glass"=10000,"plasma"=20000, "phazon"=5000)
|
||||
origin_tech = "programming=5;materials=9;bluespace=10;powerstorage=6"
|
||||
|
||||
/obj/item/mecha_parts/part/phazon_head
|
||||
name="Phazon Head"
|
||||
icon_state = "phazon_head"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=15000,"glass"=5000,"plasma"=10000, "phazon"=2500)
|
||||
origin_tech = "programming=5;materials=9;magnets=6"
|
||||
|
||||
/obj/item/mecha_parts/part/phazon_left_arm
|
||||
name="Phazon Left Arm"
|
||||
icon_state = "phazon_l_arm"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=20000,"plasma"=10000, "phazon"=2500)
|
||||
origin_tech = "materials=9;bluespace=6;magnets=2"
|
||||
|
||||
/obj/item/mecha_parts/part/phazon_right_arm
|
||||
name="Phazon Right Arm"
|
||||
icon_state = "phazon_r_arm"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=20000,"plasma"=10000, "phazon"=2500)
|
||||
origin_tech = "materials=9;bluespace=6;magnets=2"
|
||||
|
||||
/obj/item/mecha_parts/part/phazon_left_leg
|
||||
name="Phazon Left Leg"
|
||||
icon_state = "phazon_l_leg"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=20000,"plasma"=10000, "phazon"=2500)
|
||||
origin_tech = "materials=9;bluespace=6;magnets=3"
|
||||
|
||||
/obj/item/mecha_parts/part/phazon_right_leg
|
||||
name="Phazon Right Leg"
|
||||
icon_state = "phazon_r_leg"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=20000,"plasma"=10000, "phazon"=2500)
|
||||
origin_tech = "materials=9;bluespace=6;magnets=3"
|
||||
|
||||
/obj/item/mecha_parts/part/phazon_phase_array
|
||||
name="Phase Array"
|
||||
icon_state = "phazon_phase_array"
|
||||
origin_tech = "materials=9;bluespace=10;magnets=3"
|
||||
construction_time = 1200
|
||||
construction_cost = list("iron"=5000,"phazon"=2000)
|
||||
|
||||
///////// Odysseus
|
||||
|
||||
@@ -350,8 +281,6 @@
|
||||
/obj/item/mecha_parts/part/odysseus_head
|
||||
name="Odysseus Head"
|
||||
icon_state = "odysseus_head"
|
||||
construction_time = 100
|
||||
construction_cost = list("iron"=2000,"glass"=10000)
|
||||
origin_tech = "programming=3;materials=2"
|
||||
|
||||
/obj/item/mecha_parts/part/odysseus_torso
|
||||
@@ -359,47 +288,37 @@
|
||||
desc="A torso part of Odysseus. Contains power unit, processing core and life support systems."
|
||||
icon_state = "odysseus_torso"
|
||||
origin_tech = "programming=2;materials=2;biotech=2;engineering=2"
|
||||
construction_time = 180
|
||||
construction_cost = list("iron"=25000)
|
||||
|
||||
/obj/item/mecha_parts/part/odysseus_left_arm
|
||||
name="Odysseus Left Arm"
|
||||
desc="An Odysseus left arm. Data and power sockets are compatible with most exosuit tools."
|
||||
icon_state = "odysseus_l_arm"
|
||||
origin_tech = "programming=2;materials=2;engineering=2"
|
||||
construction_time = 120
|
||||
construction_cost = list("iron"=10000)
|
||||
|
||||
/obj/item/mecha_parts/part/odysseus_right_arm
|
||||
name="Odysseus Right Arm"
|
||||
desc="An Odysseus right arm. Data and power sockets are compatible with most exosuit tools."
|
||||
icon_state = "odysseus_r_arm"
|
||||
origin_tech = "programming=2;materials=2;engineering=2"
|
||||
construction_time = 120
|
||||
construction_cost = list("iron"=10000)
|
||||
|
||||
/obj/item/mecha_parts/part/odysseus_left_leg
|
||||
name="Odysseus Left Leg"
|
||||
desc="An Odysseus left leg. Contains somewhat complex servodrives and balance maintaining systems."
|
||||
icon_state = "odysseus_l_leg"
|
||||
origin_tech = "programming=2;materials=2;engineering=2"
|
||||
construction_time = 130
|
||||
construction_cost = list("iron"=15000)
|
||||
|
||||
/obj/item/mecha_parts/part/odysseus_right_leg
|
||||
name="Odysseus Right Leg"
|
||||
desc="A Odysseus right leg. Contains somewhat complex servodrives and balance maintaining systems."
|
||||
icon_state = "odysseus_r_leg"
|
||||
origin_tech = "programming=2;materials=2;engineering=2"
|
||||
construction_time = 130
|
||||
construction_cost = list("iron"=15000)
|
||||
|
||||
/*/obj/item/mecha_parts/part/odysseus_armour
|
||||
name="Odysseus Carapace"
|
||||
icon_state = "odysseus_armour"
|
||||
origin_tech = "materials=3;engineering=3"
|
||||
construction_time = 200
|
||||
construction_cost = list("iron"=15000)*/
|
||||
materials = list("$iron"=15000)*/
|
||||
|
||||
|
||||
///////// Circuitboards
|
||||
|
||||
@@ -7,11 +7,6 @@
|
||||
anchored = 1
|
||||
w_type=NOT_RECYCLABLE
|
||||
|
||||
/obj/effect/decal/point/point()
|
||||
set src in oview()
|
||||
set hidden = 1
|
||||
return
|
||||
|
||||
// Used for spray that you spray at walls, tables, hydrovats etc
|
||||
/obj/effect/decal/spraystill
|
||||
density = 0
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
|
||||
var/nonplant_seed_type
|
||||
|
||||
|
||||
/obj/item/Destroy()
|
||||
if(istype(src.loc, /mob))
|
||||
var/mob/H = src.loc
|
||||
@@ -725,7 +726,8 @@
|
||||
/obj/item/add_blood(mob/living/carbon/human/M as mob)
|
||||
if (!..())
|
||||
return 0
|
||||
|
||||
if(!M)
|
||||
return
|
||||
if(istype(src, /obj/item/weapon/melee/energy))
|
||||
return
|
||||
|
||||
|
||||
@@ -1066,7 +1066,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
tnote += "<i><b>→ To [P.owner]:</b></i><br>[t]<br>"
|
||||
P.tnote += "<i><b>← From <a href='byond://?src=\ref[P];choice=Message;target=\ref[src]'>[owner]</a> ([ownjob]):</b></i><br>[t]<br>"
|
||||
for(var/mob/dead/observer/M in player_list)
|
||||
if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS)) // src.client is so that ghosts don't have to listen to mice
|
||||
if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTPDA)) // src.client is so that ghosts don't have to listen to mice
|
||||
M.show_message("<span class='game say'>PDA Message - <span class='name'>[owner]</span> -> <span class='name'>[P.owner]</span>: <span class='message'>[t]</span></span>")
|
||||
|
||||
|
||||
|
||||
@@ -208,8 +208,6 @@
|
||||
desc = "When a problem arises, SCIENCE is the solution."
|
||||
icon_state = "sflash"
|
||||
origin_tech = "magnets=2;combat=1"
|
||||
var/construction_cost = list("metal"=750,"glass"=750)
|
||||
var/construction_time=100
|
||||
|
||||
/obj/item/device/flash/synthetic/attack(mob/living/M as mob, mob/user as mob)
|
||||
..()
|
||||
|
||||
139
code/game/objects/items/devices/mat_synth.dm
Normal file
139
code/game/objects/items/devices/mat_synth.dm
Normal file
@@ -0,0 +1,139 @@
|
||||
#define MAX_MATSYNTH_MATTER 60
|
||||
#define MAT_SYNTH_ROBO 100
|
||||
|
||||
#define MAT_COST_COMMON 1
|
||||
#define MAT_COST_MEDIUM 5
|
||||
#define MAT_COST_RARE 15
|
||||
|
||||
/obj/item/device/material_synth
|
||||
name = "material synthesizer"
|
||||
desc = "A device capable of producing very little material with a great deal of investment. Use wisely."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "mat_synthoff"
|
||||
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
w_class = 3.0
|
||||
origin_tech = "engineering=4;materials=5;power=3"
|
||||
|
||||
var/mode = 0 //0 is material selection, 1 is material production
|
||||
var/emagged = 0
|
||||
|
||||
var/obj/item/stack/sheet/active_material = /obj/item/stack/sheet/metal
|
||||
var/list/materials_scanned = list( "metal" = /obj/item/stack/sheet/metal,
|
||||
"glass" = /obj/item/stack/sheet/glass,
|
||||
"reinforced glass" = /obj/item/stack/sheet/rglass,
|
||||
"plasteel" = /obj/item/stack/sheet/plasteel)
|
||||
var/matter = 0
|
||||
|
||||
/obj/item/device/material_synth/update_icon()
|
||||
icon_state = "mat_synth[mode ? "on" : "off"]"
|
||||
|
||||
/obj/item/device/material_synth/afterattack(var/obj/target, mob/user)
|
||||
//message_admins("This fired with [target.type]")
|
||||
if(istype(target, /obj/item/stack/sheet))
|
||||
//message_admins("Yes it is")
|
||||
for(var/matID in materials_scanned)
|
||||
if(materials_scanned[matID] == target.type)
|
||||
//message_admins("WE'RE GETTING KICKED OUT")
|
||||
user <<"<span class='rose'>You've already scanned \the [target].</span>"
|
||||
return
|
||||
materials_scanned["[initial(target.name)]"] = target.type
|
||||
user <<"<span class='notice'>You successfully scan \the [target] into \the [src]'s material banks.</span>"
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/obj/item/device/material_synth/attackby(var/obj/O, mob/user)
|
||||
if(istype(O, /obj/item/weapon/rcd_ammo))
|
||||
var/obj/item/weapon/rcd_ammo/RA = O
|
||||
if(matter + 10 > MAX_MATSYNTH_MATTER)
|
||||
user <<"\The [src] can't take any more material right now."
|
||||
return
|
||||
else
|
||||
matter += 10
|
||||
qdel(RA)
|
||||
if(istype(O, /obj/item/weapon/card/emag))
|
||||
if(!emagged)
|
||||
emagged = 1
|
||||
var/matter_rng = rand(5, 25)
|
||||
if(matter >= matter_rng)
|
||||
var/obj/item/device/spawn_item = pick(typesof(/obj/item/device) - /obj/item/device) //we make any kind of device. It's a surprise!
|
||||
user.visible_message("<span class='rose'>\The [src] in [user]'s hands appears to be trying to synthesize... \a [initial(spawn_item.name)]?</span>",
|
||||
"You hear a loud popping noise.")
|
||||
user <<"<span class='warning'>\The [src] pops and fizzles in your hands, before creating... \a [initial(spawn_item.name)]?</span>"
|
||||
sleep(10)
|
||||
new spawn_item(get_turf(src))
|
||||
matter -= matter_rng
|
||||
return 1
|
||||
else
|
||||
user<<"<span class='danger'>The lack of matter in \the [src] shorts out the device!</span>"
|
||||
explosion(src.loc, 0,0,1,2) //traitors - fuck them, am I right?
|
||||
qdel(src)
|
||||
else
|
||||
user<<"You don't think you can do that again..."
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/device/material_synth/attack_self(mob/user)
|
||||
switch(mode)
|
||||
if(0)
|
||||
if(materials_scanned.len)
|
||||
var/selection = materials_scanned[input("Select the material you'd like to synthesize", "Change Material Type") in materials_scanned]
|
||||
if(selection)
|
||||
active_material = selection
|
||||
user << "<span class='notice'>You switch \the [src] to synthesize [initial(active_material.name)]</span>"
|
||||
if(1)
|
||||
var/mat_name = initial(active_material.name)
|
||||
if(isrobot(user))
|
||||
var/mob/living/silicon/robot/r_user = user
|
||||
if(active_material && r_user.cell.charge)
|
||||
var/modifier = MAT_COST_COMMON
|
||||
if(initial(active_material.perunit) < 3750)
|
||||
modifier = MAT_COST_MEDIUM
|
||||
if(initial(active_material.perunit) < 2000)
|
||||
modifier = MAT_COST_RARE
|
||||
var/tospawn = max(0, round(input("How many sheets of [mat_name] do you want to synthesize?") as num))
|
||||
if(tospawn)
|
||||
if(TakeCost(tospawn, modifier, r_user))
|
||||
var/obj/item/stack/sheet/spawned_sheet = new active_material(get_turf(src))
|
||||
spawned_sheet.amount = tospawn
|
||||
else
|
||||
r_user <<"<span class='warning'>You can't make that much [mat_name] without shutting down!</span>"
|
||||
return
|
||||
else if(r_user.cell.charge)
|
||||
user <<"You must select a sheet type first!"
|
||||
return
|
||||
else
|
||||
if(active_material && matter)
|
||||
var/modifier = MAT_COST_COMMON
|
||||
if(initial(active_material.perunit) < 3750) //synthesizing is EXPENSIVE
|
||||
modifier = MAT_COST_MEDIUM
|
||||
if(initial(active_material.perunit) < 2000)
|
||||
modifier = MAT_COST_RARE
|
||||
var/tospawn = Clamp(round(input("How many sheets of [mat_name] do you want to synthesize? (0 - [matter / modifier])") as num), 0, round(matter / modifier))
|
||||
if(tospawn)
|
||||
var/obj/item/stack/sheet/spawned_sheet = new active_material(get_turf(src))
|
||||
spawned_sheet.amount = tospawn
|
||||
TakeCost(tospawn, modifier, user)
|
||||
else if(matter)
|
||||
user <<"You must select a sheet type first!"
|
||||
return
|
||||
else
|
||||
user <<"\The [src] is empty!"
|
||||
|
||||
/obj/item/device/material_synth/proc/TakeCost(var/spawned, var/modifier, mob/user)
|
||||
if(spawned)
|
||||
matter -= round(spawned * modifier)
|
||||
|
||||
/obj/item/device/material_synth/verb/togglemode()
|
||||
set category = "Object"
|
||||
set name = "Toggle Mode"
|
||||
mode = !mode
|
||||
usr <<"<span class='notice'>You successfully toggle \the [src]'s state to [mode ? "synthesis" : "scanning"].</span>"
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
/obj/item/device/material_synth/cyborg/TakeCost(var/spawned, var/modifier, mob/user)
|
||||
if(isrobot(user))
|
||||
var/mob/living/silicon/robot/R = user
|
||||
return R.cell.use(spawned*modifier*MAT_SYNTH_ROBO)
|
||||
return
|
||||
@@ -100,7 +100,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
|
||||
if (href_list["buy_item"])
|
||||
|
||||
var/item = href_list["buy_item"]
|
||||
var/list/split = stringsplit(item, ":") // throw away variable
|
||||
var/list/split = text2list(item, ":") // throw away variable
|
||||
|
||||
if(split.len == 2)
|
||||
// Collect category and number
|
||||
|
||||
133
code/game/objects/items/robot/robot_designs.dm
Normal file
133
code/game/objects/items/robot/robot_designs.dm
Normal file
@@ -0,0 +1,133 @@
|
||||
//contains all the robot part and component designs
|
||||
|
||||
#define MECHFAB 16 //from designs.dm
|
||||
|
||||
/datum/design/robot/chassis
|
||||
name = "Cyborg Component (Robot endoskeleton)"
|
||||
desc = "Used to build a Robot endoskeleton."
|
||||
id = "robot_chassis"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/robot_suit
|
||||
category = "Robot"
|
||||
materials = list("$iron"=50000)
|
||||
|
||||
/datum/design/robot/torso
|
||||
name = "Cyborg Component (Robot torso)"
|
||||
desc = "Used to build a Robot torso."
|
||||
id = "robot_torso"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/chest
|
||||
category = "Robot"
|
||||
materials = list("$iron"=40000)
|
||||
|
||||
/datum/design/robot/l_arm
|
||||
name = "Cyborg Component (Robot left arm)"
|
||||
desc = "Used to build a Robot left arm."
|
||||
id = "robot_larm"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/l_arm
|
||||
category = "Robot"
|
||||
materials = list("$iron"=18000)
|
||||
|
||||
/datum/design/robot/r_arm
|
||||
name = "Cyborg Component (Robot right arm)"
|
||||
desc = "Used to build a Robot right arm."
|
||||
id = "robot_rarm"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/r_arm
|
||||
category = "Robot"
|
||||
materials = list("$iron"=18000)
|
||||
|
||||
/datum/design/robot/l_leg
|
||||
name = "Cyborg Component (Robot left leg)"
|
||||
desc = "Used to build a Robot left leg."
|
||||
id = "robot_lleg"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/l_leg
|
||||
category = "Robot"
|
||||
materials = list("$iron"=15000)
|
||||
|
||||
/datum/design/robot/r_leg
|
||||
name = "Cyborg Component (Robot right leg)"
|
||||
desc = "Used to build a Robot right leg."
|
||||
id = "robot_rleg"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/r_leg
|
||||
category = "Robot"
|
||||
materials = list("$iron"=15000)
|
||||
|
||||
/datum/design/robot/head
|
||||
name = "Cyborg Component (Robot head)"
|
||||
desc = "Used to build a Robot head."
|
||||
id = "robot_head"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/head
|
||||
category = "Robot"
|
||||
materials = list("$iron"=25000)
|
||||
|
||||
/datum/design/robot/binary_commucation_device
|
||||
name = "Cyborg Component (Binary Communication Device)"
|
||||
desc = "Used to build a binary communication device."
|
||||
id = "robot_bin_comms"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/robot_component/binary_communication_device
|
||||
category = "Robot"
|
||||
materials = list("$iron"=5000)
|
||||
|
||||
/datum/design/robot/radio
|
||||
name = "Cyborg Component (Radio)"
|
||||
desc = "Used to build a radio."
|
||||
id = "robot_radio"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/robot_component/radio
|
||||
category = "Robot"
|
||||
materials = list("$iron"=5000)
|
||||
|
||||
/datum/design/robot/actuator
|
||||
name = "Cyborg Component (Actuator)"
|
||||
desc = "Used to build an actuator."
|
||||
id = "robot_actuator"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/robot_component/actuator
|
||||
category = "Robot"
|
||||
materials = list("$iron"=5000)
|
||||
|
||||
/datum/design/robot/diagnosis_unit
|
||||
name = "Cyborg Component (Diagnosis Unit)"
|
||||
desc = "Used to build a diagnosis unit."
|
||||
id = "robot_diagnosis_unit"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/robot_component/diagnosis_unit
|
||||
category = "Robot"
|
||||
materials = list("$iron"=5000)
|
||||
|
||||
/datum/design/robot/camera
|
||||
name = "Cyborg Component (Camera)"
|
||||
desc = "Used to build a diagnosis unit."
|
||||
id = "robot_camera"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/robot_component/camera
|
||||
category = "Robot"
|
||||
materials = list("$iron"=5000)
|
||||
|
||||
/datum/design/robot/armour
|
||||
name = "Cyborg Component (Armor)"
|
||||
desc = "Used to build cyborg armor."
|
||||
id = "robot_armour"
|
||||
req_tech = list("engineering" = 1)
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/robot_component/armour
|
||||
category = "Robot"
|
||||
materials = list("$iron"=5000)
|
||||
@@ -6,13 +6,12 @@
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
w_type=RECYK_ELECTRONIC
|
||||
var/construction_time = 100
|
||||
var/list/construction_cost = list("metal"=20000,"glass"=5000)
|
||||
var/list/part = null
|
||||
var/sabotaged = 0 //Emagging limbs can have repercussions when installed as prosthetics.
|
||||
|
||||
/*
|
||||
/obj/item/robot_parts/recycle(var/datum/materials/rec)
|
||||
for(var/material in construction_cost)
|
||||
for(var/material in materials)
|
||||
var/rec_mat=material
|
||||
var/CCPS=CC_PER_SHEET_MISC
|
||||
if(rec_mat=="metal")
|
||||
@@ -20,47 +19,38 @@
|
||||
CCPS=CC_PER_SHEET_METAL
|
||||
if(rec_mat=="glass")
|
||||
CCPS=CC_PER_SHEET_GLASS
|
||||
rec.addAmount(material,construction_cost[material]/CCPS)
|
||||
rec.addAmount(material,materials[material]/CCPS)
|
||||
return 1
|
||||
*/
|
||||
|
||||
/obj/item/robot_parts/l_arm
|
||||
name = "robot left arm"
|
||||
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
|
||||
icon_state = "l_arm"
|
||||
construction_time = 200
|
||||
construction_cost = list("metal"=18000)
|
||||
part = list("l_arm","l_hand")
|
||||
|
||||
/obj/item/robot_parts/r_arm
|
||||
name = "robot right arm"
|
||||
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
|
||||
icon_state = "r_arm"
|
||||
construction_time = 200
|
||||
construction_cost = list("metal"=18000)
|
||||
part = list("r_arm","r_hand")
|
||||
|
||||
/obj/item/robot_parts/l_leg
|
||||
name = "robot left leg"
|
||||
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
|
||||
icon_state = "l_leg"
|
||||
construction_time = 200
|
||||
construction_cost = list("metal"=15000)
|
||||
part = list("l_leg","l_foot")
|
||||
|
||||
/obj/item/robot_parts/r_leg
|
||||
name = "robot right leg"
|
||||
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
|
||||
icon_state = "r_leg"
|
||||
construction_time = 200
|
||||
construction_cost = list("metal"=15000)
|
||||
part = list("r_leg","r_foot")
|
||||
|
||||
/obj/item/robot_parts/chest
|
||||
name = "robot torso"
|
||||
desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell."
|
||||
icon_state = "chest"
|
||||
construction_time = 350
|
||||
construction_cost = list("metal"=40000)
|
||||
var/wires = 0.0
|
||||
var/obj/item/weapon/cell/cell = null
|
||||
|
||||
@@ -68,8 +58,6 @@
|
||||
name = "robot head"
|
||||
desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals."
|
||||
icon_state = "head"
|
||||
construction_time = 350
|
||||
construction_cost = list("metal"=25000)
|
||||
var/obj/item/device/flash/flash1 = null
|
||||
var/obj/item/device/flash/flash2 = null
|
||||
|
||||
@@ -77,8 +65,6 @@
|
||||
name = "robot endoskeleton"
|
||||
desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors."
|
||||
icon_state = "robo_suit"
|
||||
construction_time = 500
|
||||
construction_cost = list("metal"=50000)
|
||||
var/obj/item/robot_parts/l_arm/l_arm = null
|
||||
var/obj/item/robot_parts/r_arm/r_arm = null
|
||||
var/obj/item/robot_parts/l_leg/l_leg = null
|
||||
|
||||
@@ -6,15 +6,14 @@
|
||||
desc = "Protected by FRM."
|
||||
icon = 'icons/obj/module.dmi'
|
||||
icon_state = "cyborg_upgrade"
|
||||
var/construction_time = 120
|
||||
var/construction_cost = list("metal"=10000)
|
||||
var/locked = 0
|
||||
var/require_module = 0
|
||||
var/installed = 0
|
||||
w_type=RECYK_ELECTRONIC
|
||||
|
||||
/*
|
||||
/obj/item/borg/upgrade/recycle(var/datum/materials/rec)
|
||||
for(var/material in construction_cost)
|
||||
for(var/material in materials)
|
||||
var/rec_mat=material
|
||||
var/CCPS=CC_PER_SHEET_MISC
|
||||
if(rec_mat=="metal")
|
||||
@@ -22,8 +21,9 @@
|
||||
CCPS=CC_PER_SHEET_METAL
|
||||
if(rec_mat=="glass")
|
||||
CCPS=CC_PER_SHEET_GLASS
|
||||
rec.addAmount(material,construction_cost[material]/CCPS)
|
||||
rec.addAmount(material,materials[material]/CCPS)
|
||||
return w_type
|
||||
*/
|
||||
|
||||
/obj/item/borg/upgrade/proc/action(var/mob/living/silicon/robot/R)
|
||||
if(R.stat == DEAD)
|
||||
@@ -41,7 +41,6 @@
|
||||
name = "medical module board"
|
||||
desc = "Used to give a medical cyborg advanced care tools."
|
||||
icon_state = "cyborg_upgrade"
|
||||
construction_cost = list("metal"=80000 , "glass"=6000)
|
||||
require_module = 1
|
||||
|
||||
/obj/item/borg/upgrade/medical/surgery/action(var/mob/living/silicon/robot/R)
|
||||
@@ -93,7 +92,6 @@
|
||||
name = "robot reclassification board"
|
||||
desc = "Used to rename a cyborg."
|
||||
icon_state = "cyborg_upgrade1"
|
||||
construction_cost = list("metal"=35000)
|
||||
var/heldname = "default name"
|
||||
|
||||
/obj/item/borg/upgrade/rename/attack_self(mob/user as mob)
|
||||
@@ -110,7 +108,6 @@
|
||||
/obj/item/borg/upgrade/restart
|
||||
name = "robot emergency restart module"
|
||||
desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online."
|
||||
construction_cost = list("metal"=60000 , "glass"=5000)
|
||||
icon_state = "cyborg_upgrade1"
|
||||
|
||||
|
||||
@@ -131,7 +128,6 @@
|
||||
/obj/item/borg/upgrade/vtec
|
||||
name = "robotic VTEC Module"
|
||||
desc = "Used to kick in a robot's VTEC systems, increasing their speed."
|
||||
construction_cost = list("metal"=80000 , "glass"=6000 , "gold"= 5000)
|
||||
icon_state = "cyborg_upgrade2"
|
||||
require_module = 1
|
||||
|
||||
@@ -148,7 +144,6 @@
|
||||
/obj/item/borg/upgrade/tasercooler
|
||||
name = "robotic Rapid Taser Cooling Module"
|
||||
desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate."
|
||||
construction_cost = list("metal"=80000 , "glass"=6000 , "gold"= 2000, "diamond" = 500)
|
||||
icon_state = "cyborg_upgrade3"
|
||||
require_module = 1
|
||||
|
||||
@@ -183,7 +178,6 @@
|
||||
/obj/item/borg/upgrade/jetpack
|
||||
name = "mining robot jetpack"
|
||||
desc = "A carbon dioxide jetpack suitable for low-gravity mining operations."
|
||||
construction_cost = list("metal"=10000,"plasma"=15000,"uranium" = 20000)
|
||||
icon_state = "cyborg_upgrade3"
|
||||
require_module = 1
|
||||
|
||||
@@ -205,7 +199,6 @@
|
||||
/obj/item/borg/upgrade/syndicate/
|
||||
name = "Illegal Equipment Module"
|
||||
desc = "Unlocks the hidden, deadlier functions of a robot"
|
||||
construction_cost = list("metal"=10000,"glass"=15000,"diamond" = 10000)
|
||||
icon_state = "cyborg_upgrade3"
|
||||
require_module = 1
|
||||
|
||||
|
||||
@@ -327,6 +327,8 @@
|
||||
origin_tech = "materials=3;plasmatech=2"
|
||||
created_window = /obj/structure/window/plasmabasic
|
||||
full_window = /obj/structure/window/full/plasmabasic
|
||||
|
||||
perunit = 2875 //average of plasma and glass
|
||||
melt_temperature = MELTPOINT_STEEL+500
|
||||
|
||||
/obj/item/stack/sheet/glass/plasmaglass/recycle(var/datum/materials/rec)
|
||||
@@ -368,6 +370,7 @@
|
||||
origin_tech = "materials=4;plasmatech=2"
|
||||
created_window = /obj/structure/window/plasmareinforced
|
||||
full_window = /obj/structure/window/full/plasmareinforced
|
||||
perunit = 2875
|
||||
|
||||
/obj/item/stack/sheet/glass/plasmarglass/recycle(var/datum/materials/rec)
|
||||
rec.addAmount("plasma",1*src.amount)
|
||||
|
||||
@@ -32,7 +32,7 @@ Mineral Sheets
|
||||
melt_temperature = MELTPOINT_GLASS
|
||||
|
||||
var/global/list/datum/stack_recipe/sandstone_recipes = list ( \
|
||||
new/datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("pile of dirt", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = 1, on_floor = 1), \
|
||||
/* new/datum/stack_recipe("sandstone wall", ???), \
|
||||
new/datum/stack_recipe("sandstone floor", ???),\ */
|
||||
@@ -58,7 +58,7 @@ var/global/list/datum/stack_recipe/sandstone_recipes = list ( \
|
||||
w_class = 3.0
|
||||
throw_range = 3
|
||||
origin_tech = "materials=6"
|
||||
perunit = 3750
|
||||
perunit = 1750
|
||||
sheettype = "diamond"
|
||||
melt_temperature = 3820 // In a vacuum, but fuck dat
|
||||
|
||||
@@ -211,8 +211,7 @@ var/global/list/datum/stack_recipe/phazon_recipes = list()
|
||||
desc = "Holy christ what is this?"
|
||||
icon_state = "sheet-phazon"
|
||||
item_state = "sheet-phazon"
|
||||
m_amt = 7500
|
||||
w_type = RECYK_METAL
|
||||
perunit = 1500
|
||||
melt_temperature = MELTPOINT_PLASTIC
|
||||
throwforce = 15.0
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
|
||||
@@ -119,6 +119,7 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list ( \
|
||||
icon_state = "sheet-plasteel"
|
||||
item_state = "sheet-plasteel"
|
||||
m_amt = 3750 // Was 7500, which doesn't make any fucking sense
|
||||
perunit = 2875 //average of plasma and metal
|
||||
throwforce = 15.0
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
origin_tech = "materials=2"
|
||||
|
||||
@@ -60,7 +60,102 @@
|
||||
icon_state = "emag"
|
||||
item_state = "card-id"
|
||||
origin_tech = "magnets=2;syndicate=2"
|
||||
var/uses = 10
|
||||
|
||||
/**
|
||||
* Number of uses left. -1 = infinite
|
||||
* (Note: Some devices can use more than 1 use, so this is just called "energy")
|
||||
* @since 10-28-2014
|
||||
*/
|
||||
var/energy = -1
|
||||
|
||||
/**
|
||||
* Max energy per emag. -1 = infinite
|
||||
* @since 10-28-2014
|
||||
*/
|
||||
var/max_energy = -1
|
||||
|
||||
/**
|
||||
* Every X ticks, add [recharge_rate] energy.
|
||||
* @since 10-28-2014
|
||||
*/
|
||||
var/recharge_ticks = 0
|
||||
|
||||
/**
|
||||
* Every [recharge_ticks] ticks, add X energy.
|
||||
* @since 10-28-2014
|
||||
*/
|
||||
var/recharge_rate = 0
|
||||
|
||||
var/nticks=0
|
||||
|
||||
/obj/item/weapon/card/emag/New(var/loc, var/disable_tuning=0)
|
||||
..(loc)
|
||||
|
||||
// For standardized subtypes, once they're established.
|
||||
if(disable_tuning)
|
||||
return
|
||||
|
||||
// Tuning tools.
|
||||
//////////////////
|
||||
if(config.emag_energy != -1)
|
||||
max_energy = config.emag_energy
|
||||
|
||||
if(config.emag_starts_charged)
|
||||
energy = max_energy
|
||||
|
||||
if(config.emag_recharge_rate != 0)
|
||||
recharge_rate = config.emag_recharge_rate
|
||||
|
||||
if(config.emag_recharge_ticks > 0)
|
||||
recharge_ticks = config.emag_recharge_ticks
|
||||
|
||||
/obj/item/weapon/card/emag/process()
|
||||
if(energy < max_energy)
|
||||
// Specified number of ticks has passed? Add charge.
|
||||
if(nticks >= recharge_ticks)
|
||||
nticks = 0
|
||||
energy = min(energy + recharge_rate, max_energy)
|
||||
nticks ++
|
||||
else
|
||||
nticks = 0
|
||||
processing_objects.Remove(src)
|
||||
|
||||
/obj/item/weapon/card/emag/proc/canUse(var/mob/user, var/obj/machinery/M)
|
||||
// We've already checked for emaggability. All we do here is check cost.
|
||||
|
||||
// Infinite uses? Just return true.
|
||||
if(energy < 0)
|
||||
return 1
|
||||
|
||||
var/cost=M.getEmagCost(user,src)
|
||||
|
||||
// Free to emag? Return true every time.
|
||||
if(cost == 0)
|
||||
return 1
|
||||
|
||||
if(energy >= cost)
|
||||
energy -= cost
|
||||
|
||||
// Start recharging, if we're supposed to.
|
||||
if(energy < max_energy && recharge_rate && recharge_ticks)
|
||||
if(!(src in processing_objects))
|
||||
processing_objects.Add(src)
|
||||
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/card/emag/examine()
|
||||
..()
|
||||
if(energy==-1)
|
||||
usr << "<span class=\"info\">\The [name] has a tiny fusion generator for power.</span>"
|
||||
else
|
||||
var/class="info"
|
||||
if(energy/max_energy < 0.1 /* 10% energy left */)
|
||||
class="warning"
|
||||
usr << "<span class=\"[class]\">This [name] has [energy]MJ left in its capacitor ([max_energy]MJ capacity).</span>"
|
||||
if(recharge_rate && recharge_ticks)
|
||||
usr << "<span class=\"info\">A small label on a thermocouple notes that it recharges at a rate of [recharge_rate]MJ for every [recharge_ticks<=1?"":"[recharge_ticks] "]oscillator tick[recharge_ticks>1?"s":""].</span>"
|
||||
|
||||
/obj/item/weapon/card/id
|
||||
name = "identification card"
|
||||
|
||||
@@ -21,7 +21,6 @@ var/global/list/moneytypes=list(
|
||||
throw_speed = 1
|
||||
throw_range = 2
|
||||
w_class = 1.0
|
||||
nonplant_seed_type = /obj/item/seeds/cashseed
|
||||
var/access = list()
|
||||
access = access_crate_cash
|
||||
var/worth = 1 // Per chip
|
||||
|
||||
@@ -47,6 +47,16 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
name = "burnt match"
|
||||
desc = "A match. This one has seen better days."
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/match/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
if(istype(M.wear_mask, /obj/item/clothing/mask/cigarette) && user.zone_sel.selecting == "mouth" && lit)
|
||||
var/obj/item/clothing/mask/cigarette/cig = M.wear_mask
|
||||
if(M == user)
|
||||
cig.attackby(src, user)
|
||||
else
|
||||
cig.light("<span class='notice'>[user] holds the [name] out for [M], and lights the [cig.name].</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
//////////////////
|
||||
//FINE SMOKABLES//
|
||||
@@ -93,7 +103,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
|
||||
else if(istype(W, /obj/item/weapon/match))
|
||||
var/obj/item/weapon/match/M = W
|
||||
if(M.lit)
|
||||
if(M.lit == 1)
|
||||
light("<span class='notice'>[user] lights their [name] with their [W].</span>")
|
||||
|
||||
else if(istype(W, /obj/item/weapon/melee/energy/sword))
|
||||
@@ -506,11 +516,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
|
||||
|
||||
/obj/item/weapon/lighter/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
if(!isliving(M))
|
||||
return
|
||||
M.IgniteMob()
|
||||
if(!istype(M,/mob/living/carbon))
|
||||
return
|
||||
if(istype(M.wear_mask, /obj/item/clothing/mask/cigarette) && user.zone_sel.selecting == "mouth" && lit)
|
||||
var/obj/item/clothing/mask/cigarette/cig = M.wear_mask
|
||||
if(M == user)
|
||||
@@ -521,7 +526,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
else
|
||||
cig.light("<span class='notice'>[user] holds the [name] out for [M], and lights the [cig.name].</span>")
|
||||
else
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/lighter/process()
|
||||
var/turf/location = get_turf(src)
|
||||
|
||||
@@ -384,6 +384,8 @@ obj/item/weapon/grenade/chem_grenade/exgrenade
|
||||
B2.reagents.add_reagent("phosphorus", 25)
|
||||
B2.reagents.add_reagent("sugar", 25)
|
||||
|
||||
detonator = new/obj/item/device/assembly_holder/timer_igniter(src)
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
icon_state = "grenade"
|
||||
|
||||
@@ -132,23 +132,32 @@
|
||||
/*
|
||||
* Sunflower & NovaFlower
|
||||
*/
|
||||
|
||||
/obj/item/weapon/grown/sunflower/attack(mob/M as mob, mob/user as mob)
|
||||
M << "<font color='green'><b> [user] smacks you with a sunflower!</font><font color='yellow'><b>FLOWER POWER<b></font>"
|
||||
user << "<font color='green'> Your sunflower's </font><font color='yellow'><b>FLOWER POWER</b></font><font color='green'> strikes [M]</font>"
|
||||
|
||||
/obj/item/weapon/grown/novaflower
|
||||
name = "novaflower"
|
||||
desc = "These beautiful flowers have a crisp smokey scent, like a summer bonfire."
|
||||
icon = 'icons/obj/harvest.dmi'
|
||||
icon_state = "novaflower"
|
||||
damtype = "fire"
|
||||
force = 0
|
||||
flags = TABLEPASS
|
||||
slot_flags = SLOT_HEAD
|
||||
throwforce = 1
|
||||
w_class = 1.0
|
||||
throw_speed = 1
|
||||
throw_range = 3
|
||||
attack_verb = list("seared", "heated", "whacked", "steamed")
|
||||
|
||||
/obj/item/weapon/grown/novaflower/attack(mob/living/carbon/M as mob, mob/user as mob)
|
||||
if(!..()) return
|
||||
if(istype(M, /mob/living))
|
||||
M << "\red You are heated by the warmth of the of the [name]!"
|
||||
M.bodytemperature += potency/2 * TEMPERATURE_DAMAGE_COEFFICIENT
|
||||
|
||||
/obj/item/weapon/grown/novaflower/afterattack(atom/A as mob|obj, mob/user as mob,proximity)
|
||||
if(!proximity) return
|
||||
if(endurance > 0)
|
||||
endurance -= rand(1,(endurance/3)+1)
|
||||
else
|
||||
usr << "All the petals have fallen off the [name] from violent whacking."
|
||||
del(src)
|
||||
|
||||
/obj/item/weapon/grown/novaflower/pickup(mob/living/carbon/human/user as mob)
|
||||
if(!user.gloves)
|
||||
|
||||
@@ -19,8 +19,6 @@
|
||||
melt_temperature = MELTPOINT_STEEL // Rugged
|
||||
var/rigged = 0 // true if rigged to explode
|
||||
var/minor_fault = 0 //If not 100% reliable, it will build up faults.
|
||||
var/construction_cost = list("metal"=750,"glass"=75)
|
||||
var/construction_time=100
|
||||
|
||||
suicide_act(mob/user)
|
||||
viewers(user) << "\red <b>[user] is licking the electrodes of the [src.name]! It looks like \he's trying to commit suicide.</b>"
|
||||
@@ -77,8 +75,6 @@
|
||||
icon_state = "scell"
|
||||
maxcharge = 20000
|
||||
g_amt = 70
|
||||
construction_cost = list("metal"=750,"glass"=100)
|
||||
|
||||
/obj/item/weapon/cell/super/empty/New()
|
||||
..()
|
||||
charge = 0
|
||||
@@ -89,7 +85,6 @@
|
||||
icon_state = "hpcell"
|
||||
maxcharge = 30000
|
||||
g_amt = 80
|
||||
construction_cost = list("metal"=500,"glass"=150,"gold"=200,"silver"=200)
|
||||
|
||||
/obj/item/weapon/cell/hyper/empty/New()
|
||||
..()
|
||||
|
||||
@@ -139,7 +139,8 @@
|
||||
"/obj/item/weapon/melee/baton",
|
||||
"/obj/item/taperoll/police",
|
||||
"/obj/item/weapon/gun/energy/taser",
|
||||
"/obj/item/weapon/legcuffs/bolas"
|
||||
"/obj/item/weapon/legcuffs/bolas",
|
||||
"/obj/item/device/hailer"
|
||||
)
|
||||
/obj/item/weapon/storage/belt/security/batmanbelt
|
||||
name = "batbelt"
|
||||
@@ -222,3 +223,54 @@
|
||||
"/obj/item/device/wormhole_jaunter",
|
||||
"/obj/item/weapon/lazarus_injector",
|
||||
"/obj/item/weapon/anobattery")
|
||||
|
||||
/obj/item/weapon/storage/belt/lazarus
|
||||
name = "trainer's belt"
|
||||
desc = "For the pokemo- mining master, holds your lazarus capsules."
|
||||
icon_state = "lazarusbelt"
|
||||
item_state = "lazbelt"
|
||||
w_class = 4
|
||||
max_w_class = 4
|
||||
max_combined_w_class = 28
|
||||
can_hold = list("/obj/item/device/mobcapsule")
|
||||
|
||||
/obj/item/weapon/storage/belt/lazarus/New()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/weapon/storage/belt/lazarus/update_icon()
|
||||
..()
|
||||
icon_state = "[initial(icon_state)]_[contents.len]"
|
||||
|
||||
/obj/item/weapon/storage/belt/lazarus/attackby(obj/item/W, mob/user)
|
||||
var/amount = contents.len
|
||||
. = ..()
|
||||
if(amount != contents.len)
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/storage/belt/lazarus/remove_from_storage(obj/item/W as obj, atom/new_location)
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/storage/belt/lazarus/antag
|
||||
name = "master trainer's belt"
|
||||
desc = "For the pokemo- mining master, holds your lazarus capsules."
|
||||
icon_state = "lazarusbelt"
|
||||
item_state = "lazbelt"
|
||||
w_class = 4
|
||||
max_w_class = 4
|
||||
max_combined_w_class = 28
|
||||
can_hold = list("/obj/item/device/mobcapsule")
|
||||
|
||||
/obj/item/weapon/storage/belt/lazarus/antag/New(loc, mob/user)
|
||||
var/list/critters = typesof(/mob/living/simple_animal/hostile) - /mob/living/simple_animal/hostile
|
||||
critters = shuffle(critters)
|
||||
while(contents.len <=6)
|
||||
var/obj/item/device/mobcapsule/MC = new /obj/item/device/mobcapsule(src)
|
||||
var/chosen = pick(critters)
|
||||
critters -= chosen
|
||||
var/mob/living/simple_animal/hostile/NM = new chosen(MC)
|
||||
NM.faction = "lazarus \ref[user]"
|
||||
NM.friends += user
|
||||
..()
|
||||
@@ -17,75 +17,75 @@
|
||||
var/icon_broken = "lockbox+b"
|
||||
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/weapon/card/id))
|
||||
if(src.broken)
|
||||
user << "\red It appears to be broken."
|
||||
/obj/item/weapon/storage/lockbox/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/weapon/card/id))
|
||||
if(src.broken)
|
||||
user << "<span class='rose'>It appears to be broken.</span>"
|
||||
return
|
||||
if(src.allowed(user))
|
||||
src.locked = !( src.locked )
|
||||
if(src.locked)
|
||||
src.icon_state = src.icon_locked
|
||||
user << "<span class='rose'>You lock the [src.name]!</span>"
|
||||
return
|
||||
if(src.allowed(user))
|
||||
src.locked = !( src.locked )
|
||||
if(src.locked)
|
||||
src.icon_state = src.icon_locked
|
||||
user << "\red You lock the [src.name]!"
|
||||
return
|
||||
else
|
||||
src.icon_state = src.icon_closed
|
||||
user << "\red You unlock the [src.name]!"
|
||||
return
|
||||
else
|
||||
user << "\red Access Denied"
|
||||
else if((istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && !src.broken)
|
||||
broken = 1
|
||||
locked = 0
|
||||
desc = "It appears to be broken."
|
||||
icon_state = src.icon_broken
|
||||
if(istype(W, /obj/item/weapon/melee/energy/blade))
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, src.loc)
|
||||
spark_system.start()
|
||||
playsound(get_turf(src), 'sound/weapons/blade1.ogg', 50, 1)
|
||||
playsound(get_turf(src), "sparks", 50, 1)
|
||||
for(var/mob/O in viewers(user, 3))
|
||||
O.show_message(text("\blue The locker has been sliced open by [] with an energy blade!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2)
|
||||
else
|
||||
for(var/mob/O in viewers(user, 3))
|
||||
O.show_message(text("\blue The locker has been broken by [] with an electromagnetic card!", user), 1, text("You hear a faint electrical spark."), 2)
|
||||
|
||||
if(!locked)
|
||||
..()
|
||||
src.icon_state = src.icon_closed
|
||||
user << "<span class='rose'>You unlock the [src.name]!</span>"
|
||||
return
|
||||
else
|
||||
user << "\red Its locked!"
|
||||
return
|
||||
|
||||
|
||||
show_to(mob/user as mob)
|
||||
if(locked)
|
||||
user << "\red Its locked!"
|
||||
user << "<span class='warning'>Access Denied</span>"
|
||||
else if((istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && !src.broken)
|
||||
broken = 1
|
||||
locked = 0
|
||||
desc = "It appears to be broken."
|
||||
icon_state = src.icon_broken
|
||||
if(istype(W, /obj/item/weapon/melee/energy/blade))
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, src.loc)
|
||||
spark_system.start()
|
||||
playsound(get_turf(src), 'sound/weapons/blade1.ogg', 50, 1)
|
||||
playsound(get_turf(src), "sparks", 50, 1)
|
||||
for(var/mob/O in viewers(user, 3))
|
||||
O.show_message(text("<span class='notice'>The locker has been sliced open by [] with an energy blade!</span>", user), 1, text("<span class='warning>You hear metal being sliced and sparks flying.</span>"), 2)
|
||||
else
|
||||
..()
|
||||
return
|
||||
for(var/mob/O in viewers(user, 3))
|
||||
O.show_message(text("<span class='notice'>The locker has been broken by [] with an electromagnetic card!</span>", user), 1, text("You hear a faint electrical spark."), 2)
|
||||
|
||||
bullet_act(var/obj/item/projectile/Proj)
|
||||
// WHY MUST WE DO THIS
|
||||
// WHY
|
||||
if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
|
||||
if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
|
||||
health -= Proj.damage
|
||||
if(!locked)
|
||||
..()
|
||||
if(health <= 0)
|
||||
for(var/atom/movable/A as mob|obj in src)
|
||||
A.loc = src.loc
|
||||
del(src)
|
||||
return
|
||||
else
|
||||
user << "\red Its locked!"
|
||||
return
|
||||
|
||||
ex_act(severity)
|
||||
var/newsev = max(3,severity+1)
|
||||
for(var/atom/movable/A as mob|obj in src)//pulls everything out of the locker and hits it with an explosion
|
||||
|
||||
/obj/item/weapon/storage/lockbox/show_to(mob/user as mob)
|
||||
if(locked)
|
||||
user << "\red Its locked!"
|
||||
else
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/lockbox/bullet_act(var/obj/item/projectile/Proj)
|
||||
// WHY MUST WE DO THIS
|
||||
// WHY
|
||||
if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
|
||||
if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
|
||||
health -= Proj.damage
|
||||
..()
|
||||
if(health <= 0)
|
||||
for(var/atom/movable/A as mob|obj in src)
|
||||
A.loc = src.loc
|
||||
A.ex_act(newsev)
|
||||
newsev=4-severity
|
||||
if(prob(newsev*25)+25) // 1=100, 2=75, 3=50
|
||||
qdel(src)
|
||||
del(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/lockbox/ex_act(severity)
|
||||
var/newsev = max(3,severity+1)
|
||||
for(var/atom/movable/A as mob|obj in src)//pulls everything out of the locker and hits it with an explosion
|
||||
A.loc = src.loc
|
||||
A.ex_act(newsev)
|
||||
newsev=4-severity
|
||||
if(prob(newsev*25)+25) // 1=100, 2=75, 3=50
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/storage/lockbox/emp_act(severity)
|
||||
..()
|
||||
@@ -157,3 +157,35 @@
|
||||
New()
|
||||
..()
|
||||
new /obj/item/weapon/grenade/flashbang/clusterbang(src)
|
||||
|
||||
/obj/item/weapon/storage/lockbox/unlockable
|
||||
name = "semi-secure lockbox"
|
||||
desc = "A securable locked box. Can't lock anything, but can track whoever used it."
|
||||
req_access = list()
|
||||
var/tracked_access = "It doesn't look like it's ever been used."
|
||||
|
||||
/obj/item/weapon/storage/lockbox/unlockable/examine()
|
||||
..()
|
||||
usr << tracked_access
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/storage/lockbox/unlockable/attackby(obj/O as obj, mob/user as mob)
|
||||
if (istype(O, /obj/item/weapon/card/id))
|
||||
var/obj/item/weapon/card/id/ID = O
|
||||
if(src.broken)
|
||||
user << "<span class='rose'>It appears to be broken.</span>"
|
||||
return
|
||||
else
|
||||
src.locked = !( src.locked )
|
||||
if(src.locked)
|
||||
src.icon_state = src.icon_locked
|
||||
user << "<span class='rose'>You lock the [src.name]!</span>"
|
||||
tracked_access = "The tracker reads: 'Last locked by [ID.registered_name]'."
|
||||
return
|
||||
else
|
||||
src.icon_state = src.icon_closed
|
||||
user << "<span class='rose'>You unlock the [src.name]!</span>"
|
||||
tracked_access = "The tracker reads: 'Last unlocked by [ID.registered_name].'"
|
||||
return
|
||||
else
|
||||
..()
|
||||
@@ -267,4 +267,4 @@ a {
|
||||
return
|
||||
|
||||
/obj/proc/container_resist()
|
||||
return
|
||||
return
|
||||
|
||||
@@ -18,7 +18,11 @@
|
||||
if(2)
|
||||
new /obj/item/clothing/suit/apron/overalls(src)
|
||||
new /obj/item/weapon/storage/bag/plants(src)
|
||||
new /obj/item/clothing/under/rank/hydroponics(src)
|
||||
switch(rand(1,2))
|
||||
if(1)
|
||||
new /obj/item/clothing/under/rank/hydroponics(src)
|
||||
if(2)
|
||||
new /obj/item/clothing/under/rank/botany(src)
|
||||
new /obj/item/device/analyzer/plant_analyzer(src)
|
||||
new /obj/item/clothing/head/greenbandana(src)
|
||||
new /obj/item/weapon/minihoe(src)
|
||||
|
||||
@@ -176,7 +176,12 @@
|
||||
/obj/structure/closet/wardrobe/engineering_yellow/New()
|
||||
new /obj/item/clothing/under/rank/engineer(src)
|
||||
new /obj/item/clothing/under/rank/engineer(src)
|
||||
new /obj/item/clothing/under/rank/engineer(src)
|
||||
new /obj/item/clothing/under/rank/engine_tech(src)
|
||||
new /obj/item/clothing/under/rank/engine_tech(src)
|
||||
new /obj/item/clothing/under/rank/maintenance_tech(src)
|
||||
new /obj/item/clothing/under/rank/maintenance_tech(src)
|
||||
new /obj/item/clothing/under/rank/electrician(src)
|
||||
new /obj/item/clothing/under/rank/electrician(src)
|
||||
new /obj/item/clothing/shoes/orange(src)
|
||||
new /obj/item/clothing/shoes/orange(src)
|
||||
new /obj/item/clothing/shoes/orange(src)
|
||||
@@ -223,7 +228,10 @@
|
||||
/obj/structure/closet/wardrobe/toxins_white/New()
|
||||
new /obj/item/clothing/under/rank/scientist(src)
|
||||
new /obj/item/clothing/under/rank/scientist(src)
|
||||
new /obj/item/clothing/under/rank/scientist(src)
|
||||
new /obj/item/clothing/under/rank/xenoarch(src)
|
||||
new /obj/item/clothing/under/rank/plasmares(src)
|
||||
new /obj/item/clothing/under/rank/xenobio(src)
|
||||
new /obj/item/clothing/under/rank/anomalist(src)
|
||||
new /obj/item/clothing/suit/storage/labcoat(src)
|
||||
new /obj/item/clothing/suit/storage/labcoat(src)
|
||||
new /obj/item/clothing/suit/storage/labcoat(src)
|
||||
@@ -244,6 +252,10 @@
|
||||
/obj/structure/closet/wardrobe/robotics_black/New()
|
||||
new /obj/item/clothing/under/rank/roboticist(src)
|
||||
new /obj/item/clothing/under/rank/roboticist(src)
|
||||
new /obj/item/clothing/under/rank/mechatronic(src)
|
||||
new /obj/item/clothing/under/rank/mechatronic(src)
|
||||
new /obj/item/clothing/under/rank/biomechanical(src)
|
||||
new /obj/item/clothing/under/rank/biomechanical(src)
|
||||
new /obj/item/clothing/suit/storage/labcoat(src)
|
||||
new /obj/item/clothing/suit/storage/labcoat(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
@@ -261,6 +273,8 @@
|
||||
/obj/structure/closet/wardrobe/chemistry_white/New()
|
||||
new /obj/item/clothing/under/rank/chemist(src)
|
||||
new /obj/item/clothing/under/rank/chemist(src)
|
||||
new /obj/item/clothing/under/rank/pharma(src)
|
||||
new /obj/item/clothing/under/rank/pharma(src)
|
||||
new /obj/item/clothing/shoes/white(src)
|
||||
new /obj/item/clothing/shoes/white(src)
|
||||
new /obj/item/clothing/suit/storage/labcoat/chemist(src)
|
||||
|
||||
@@ -8,9 +8,6 @@
|
||||
desc = "This device upgrades the janicart to automatically clean surfaces when driving."
|
||||
icon = 'icons/obj/module.dmi'
|
||||
icon_state = "cyborg_upgrade"
|
||||
origin_tech = "engineering=2;materials=2"
|
||||
construction_time = 50
|
||||
construction_cost = list("metal"=20000)
|
||||
|
||||
/obj/structure/stool/bed/chair/vehicle/janicart
|
||||
name = "janicart"
|
||||
|
||||
@@ -561,7 +561,7 @@ obj/structure/ex_act(severity)
|
||||
if(text in direction_table)
|
||||
return direction_table[text]
|
||||
|
||||
var/list/split_text = stringsplit(text, "-")
|
||||
var/list/split_text = text2list(text, "-")
|
||||
|
||||
// If the first token is D, the icon_state represents
|
||||
// a purely decorative tube, and doesn't actually
|
||||
|
||||
@@ -129,10 +129,17 @@
|
||||
var/ismist = 0 //needs a var so we can make it linger~
|
||||
var/watertemp = "normal" //freezing, normal, or boiling
|
||||
var/mobpresent = 0 //true if there is a mob on the shower's loc, this is to ease process()
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/water/watersource = null
|
||||
|
||||
ghost_read=0
|
||||
ghost_write=0
|
||||
|
||||
|
||||
/obj/machinery/shower/New()//our showers actually wet people and floors now
|
||||
..()
|
||||
watersource = new /obj/item/weapon/reagent_containers/glass/beaker/water()
|
||||
|
||||
|
||||
//add heat controls? when emagged, you can freeze to death in it?
|
||||
|
||||
/obj/effect/mist
|
||||
@@ -284,9 +291,19 @@
|
||||
del(E)
|
||||
|
||||
/obj/machinery/shower/process()
|
||||
if(!on || !mobpresent) return
|
||||
for(var/mob/living/carbon/C in loc)
|
||||
check_heat(C)
|
||||
if(!on) return
|
||||
for(var/atom/movable/O in loc)
|
||||
if(iscarbon(O))
|
||||
var/mob/living/carbon/C
|
||||
check_heat(C)
|
||||
wash(O)
|
||||
O.clean_blood()
|
||||
watersource.reagents.reaction(O, TOUCH)
|
||||
if(istype(O, /obj/item/weapon/reagent_containers/glass))
|
||||
var/obj/item/weapon/reagent_containers/glass/G = O
|
||||
G.reagents.add_reagent("water", 5)
|
||||
watersource.reagents.reaction(loc, TOUCH)
|
||||
|
||||
|
||||
/obj/machinery/shower/proc/check_heat(mob/M as mob)
|
||||
if(!on || watertemp == "normal") return
|
||||
|
||||
@@ -41,7 +41,8 @@
|
||||
|
||||
/obj/structure/shuttle/engine/propulsion/cultify()
|
||||
var/turf/T = get_turf(src)
|
||||
T.ChangeTurf(/turf/simulated/wall/cult)
|
||||
if(T)
|
||||
T.ChangeTurf(/turf/simulated/wall/cult)
|
||||
..()
|
||||
|
||||
/obj/structure/shuttle/engine/propulsion/burst
|
||||
|
||||
@@ -71,9 +71,14 @@
|
||||
A.relativewall()
|
||||
|
||||
/turf/simulated/wall/New()
|
||||
relativewall()
|
||||
..()
|
||||
|
||||
// SMOOTH US WITH OUR NEIGHBORS
|
||||
relativewall()
|
||||
|
||||
// WE NEED TO TELL ALL OUR FRIENDS ABOUT THIS SCANDAL
|
||||
relativewall_neighbours()
|
||||
|
||||
/turf/simulated/wall/Destroy()
|
||||
|
||||
var/temploc = src.loc
|
||||
|
||||
@@ -588,6 +588,8 @@ turf/simulated/floor/proc/update_icon()
|
||||
wet_overlay = null
|
||||
|
||||
/turf/simulated/floor/cultify()
|
||||
ChangeTurf(/turf/simulated/floor/engine/cult)
|
||||
cultification()
|
||||
if((icon_state != "cult")&&(icon_state != "cult-narsie"))
|
||||
name = "engraved floor"
|
||||
icon_state = "cult"
|
||||
cultification()
|
||||
return
|
||||
@@ -113,13 +113,6 @@
|
||||
/turf/simulated/floor/engine/cult/cultify()
|
||||
return
|
||||
|
||||
/turf/simulated/floor/engine/cult/narsie//version that spawns on Nar-Sie's path
|
||||
name = "engraved floor"
|
||||
desc = "something that goes beyond your understanding went this way"
|
||||
icon_state = "cult-narsie"
|
||||
luminosity = 1
|
||||
l_color = "#3e0000"
|
||||
|
||||
|
||||
/turf/simulated/floor/engine/n20
|
||||
New()
|
||||
@@ -191,8 +184,10 @@
|
||||
icon_state = "floor"
|
||||
|
||||
/turf/simulated/shuttle/floor/cultify()
|
||||
ChangeTurf(/turf/simulated/floor/engine/cult)
|
||||
cultification()
|
||||
if((icon_state != "cult")&&(icon_state != "cult-narsie"))
|
||||
name = "engraved floor"
|
||||
icon_state = "cult"
|
||||
cultification()
|
||||
return
|
||||
|
||||
/turf/simulated/shuttle/plating
|
||||
@@ -205,8 +200,10 @@
|
||||
icon_state = "floor4"
|
||||
|
||||
/turf/simulated/shuttle/floor4/cultify()
|
||||
ChangeTurf(/turf/simulated/floor/engine/cult)
|
||||
cultification()
|
||||
if((icon_state != "cult")&&(icon_state != "cult-narsie"))
|
||||
name = "engraved floor"
|
||||
icon_state = "cult"
|
||||
cultification()
|
||||
return
|
||||
|
||||
/turf/simulated/floor/beach
|
||||
|
||||
@@ -421,6 +421,19 @@
|
||||
spawn(10)
|
||||
del(c_animation)
|
||||
|
||||
/turf/proc/invocanimation(var/animation_type)
|
||||
c_animation = new /atom/movable/overlay(src)
|
||||
c_animation.name = "invocanimation"
|
||||
c_animation.density = 0
|
||||
c_animation.anchored = 1
|
||||
c_animation.icon = 'icons/effects/effects.dmi'
|
||||
c_animation.layer = 5
|
||||
c_animation.master = src
|
||||
c_animation.icon_state = "[animation_type]"
|
||||
flick("invocanimation",c_animation)
|
||||
spawn(10)
|
||||
del(c_animation)
|
||||
|
||||
/turf/proc/cultify()
|
||||
ChangeTurf(/turf/space)
|
||||
return
|
||||
@@ -23,14 +23,9 @@
|
||||
step(user.pulling, get_dir(user.pulling.loc, src))
|
||||
return
|
||||
|
||||
/turf/unsimulated/floor/cult
|
||||
name = "engraved floor"
|
||||
icon_state = "cult"
|
||||
|
||||
/turf/unsimulated/floor/cultify()
|
||||
ChangeTurf(/turf/unsimulated/floor/cult)
|
||||
cultification()
|
||||
return
|
||||
|
||||
/turf/unsimulated/floor/cult/cultify()
|
||||
if((icon_state != "cult")&&(icon_state != "cult-narsie"))
|
||||
name = "engraved floor"
|
||||
icon_state = "cult"
|
||||
cultification()
|
||||
return
|
||||
@@ -5,27 +5,4 @@
|
||||
|
||||
usr.start_pulling(src)
|
||||
return
|
||||
|
||||
/atom/verb/point()
|
||||
set name = "Point To"
|
||||
set category = "Object"
|
||||
set src in oview()
|
||||
var/atom/this = src//detach proc from src
|
||||
src = null
|
||||
|
||||
if(!usr || !isturf(usr.loc))
|
||||
return
|
||||
if(usr.stat || usr.restrained())
|
||||
return
|
||||
if(usr.status_flags & FAKEDEATH)
|
||||
return
|
||||
|
||||
var/tile = get_turf(this)
|
||||
if (!tile)
|
||||
return
|
||||
|
||||
var/P = new /obj/effect/decal/point(tile)
|
||||
spawn (20)
|
||||
if(P) del(P)
|
||||
|
||||
usr.visible_message("<b>[usr]</b> points to [this]")
|
||||
code/modules/mob/mob.dm
|
||||
|
||||
@@ -125,6 +125,7 @@ var/midicon = null
|
||||
var/endicon = null
|
||||
var/diary = null
|
||||
var/diaryofmeanpeople = null
|
||||
var/admin_diary = null
|
||||
var/href_logfile = null
|
||||
var/station_name = null
|
||||
var/game_version = "adsfasdfasdf"
|
||||
|
||||
@@ -29,7 +29,9 @@ var/list/directional = list(
|
||||
/obj/machinery/atmospherics/pipe,
|
||||
/obj/structure/window,
|
||||
/obj/structure/window/full,
|
||||
/obj/structure/stool/bed/chair
|
||||
/obj/structure/stool/bed/chair,
|
||||
/obj/structure/table,
|
||||
/obj/machinery/light
|
||||
)
|
||||
|
||||
var/list/exception = list(
|
||||
|
||||
235
code/libs/s_html/colour2html.dm
Normal file
235
code/libs/s_html/colour2html.dm
Normal file
@@ -0,0 +1,235 @@
|
||||
/**************************************
|
||||
Named Colours to HTML Constants Library
|
||||
by Jeremy "Spuzzum" Gibson
|
||||
***************************************
|
||||
|
||||
This library converts colour names into HTML
|
||||
numerical code. It is used as follows:
|
||||
|
||||
var/code = colour2html("white")
|
||||
|
||||
This will search through its database and return
|
||||
"#FFFFFF", which is the matching colour for the
|
||||
string "white".
|
||||
|
||||
You can also use the American spelling, color2html,
|
||||
if you'd like. Not that you should. =P
|
||||
|
||||
(Note that you don't have to worry about spaces,
|
||||
either... slate blue and slateblue, for example,
|
||||
are both equivalent.)
|
||||
|
||||
|
||||
If you want to add colours (doubtful you'd want to
|
||||
or even need to!), it can be done by using the
|
||||
HTMLAssociate() proc:
|
||||
|
||||
HTMLAssociate("mycolour","ffccdd")
|
||||
|
||||
...where the first argument is the name of the
|
||||
colour and the second is the HTML colour code,
|
||||
minus the pound (#) symbol.
|
||||
|
||||
**************************************/
|
||||
//AMERICANISATION (AMERICANIZATION)
|
||||
// Allows you to use your inferior American spellings! ;-)
|
||||
|
||||
#define color2html(X) colour2html(X)
|
||||
#define html_colors html_colours
|
||||
|
||||
|
||||
/*************************************/
|
||||
//COLOUR2HTML PROC
|
||||
|
||||
proc/colour2html(colour)
|
||||
var/T
|
||||
for(T in html_colours)
|
||||
if(ckey(T) == ckey(colour)) break
|
||||
if(!T)
|
||||
world.log << "Warning! Could not find matching colour entry for '[colour]'."
|
||||
return "#FFFFFF"
|
||||
|
||||
return ("#" + uppertext(html_colours["[colour]"]) )
|
||||
|
||||
|
||||
/*************************************/
|
||||
//HTMLASSOCIATE PROC
|
||||
|
||||
proc/HTMLAssociate(colour, html)
|
||||
if(html_colours.Find(colour))
|
||||
world.log << "Changing [colour] from [html_colours[colour]] to [html]!"
|
||||
html_colours[colour] = html
|
||||
|
||||
|
||||
/*************************************/
|
||||
//HTML ASSOCIATIONS SAVING/LOADING
|
||||
|
||||
world
|
||||
New()
|
||||
..()
|
||||
LoadHTMLAssociations()
|
||||
|
||||
Del()
|
||||
SaveHTMLAssociations()
|
||||
..()
|
||||
|
||||
var/html_colours[0]
|
||||
|
||||
proc/LoadHTMLAssociations()
|
||||
var/savefile/F = new ("s_html.sav")
|
||||
F["html_colours"] >> html_colours
|
||||
if(!html_colours) html_colours = list()
|
||||
|
||||
if(!html_colours.len)
|
||||
HTMLAssociate("aliceblue", "f0f8ff")
|
||||
HTMLAssociate("antiquewhite", "faebd7")
|
||||
HTMLAssociate("aqua", "00ffff")
|
||||
HTMLAssociate("aquamarine", "7fffd4")
|
||||
HTMLAssociate("azure", "f0ffff")
|
||||
HTMLAssociate("beige", "f5f5dc")
|
||||
HTMLAssociate("bisque", "ffe4c4")
|
||||
HTMLAssociate("black", "000000")
|
||||
HTMLAssociate("blanchedalmond", "ffebcd")
|
||||
HTMLAssociate("blue", "0000ff")
|
||||
HTMLAssociate("blueviolet", "8a2be2")
|
||||
HTMLAssociate("brown", "a52a2a")
|
||||
HTMLAssociate("burlywood", "deb887")
|
||||
HTMLAssociate("cadetblue", "5f9ea0")
|
||||
HTMLAssociate("chartreuse", "7fff00")
|
||||
HTMLAssociate("chocolate", "d2691e")
|
||||
HTMLAssociate("coral", "ff7f50")
|
||||
HTMLAssociate("cornflowerblue", "6495ed")
|
||||
HTMLAssociate("cornsilk", "fff8dc")
|
||||
HTMLAssociate("crimson", "dc143c")
|
||||
HTMLAssociate("cyan", "00ffff")
|
||||
HTMLAssociate("darkblue", "00008b")
|
||||
HTMLAssociate("darkcyan", "008b8b")
|
||||
HTMLAssociate("darkgoldenrod", "b8b60b")
|
||||
HTMLAssociate("darkgrey", "a9a9a9")
|
||||
HTMLAssociate("darkgray", "a9a9a9")
|
||||
HTMLAssociate("darkgreen", "006400")
|
||||
HTMLAssociate("darkkhaki", "bdb76b")
|
||||
HTMLAssociate("darkmagenta", "8b008b")
|
||||
HTMLAssociate("darkolivegreen", "556b2f")
|
||||
HTMLAssociate("darkorange", "ff8c00")
|
||||
HTMLAssociate("darkorchid", "9932cc")
|
||||
HTMLAssociate("darkred", "8b0000")
|
||||
HTMLAssociate("darksalmon", "e9967a")
|
||||
HTMLAssociate("darkseagreen", "8fbc8f")
|
||||
HTMLAssociate("darkslateblue", "483d8b")
|
||||
HTMLAssociate("darkslategrey", "2f4f4f")
|
||||
HTMLAssociate("darkslategray", "2f4f4f")
|
||||
HTMLAssociate("darkturquoise", "00ced1")
|
||||
HTMLAssociate("darkviolet", "9400d3")
|
||||
HTMLAssociate("deeppink", "ff1493")
|
||||
HTMLAssociate("deepskyblue", "00bfff")
|
||||
HTMLAssociate("dimgrey", "696969")
|
||||
HTMLAssociate("dimgray", "696969")
|
||||
HTMLAssociate("dodgerblue", "1e90ff")
|
||||
HTMLAssociate("firebrick", "b22222")
|
||||
HTMLAssociate("floralwhite", "fffaf0")
|
||||
HTMLAssociate("forestgreen", "228b22")
|
||||
HTMLAssociate("fuchsia", "ff00ff")
|
||||
HTMLAssociate("gainsboro", "dcdcdc")
|
||||
HTMLAssociate("ghostwhite", "f8f8ff")
|
||||
HTMLAssociate("gold", "ffd700")
|
||||
HTMLAssociate("goldenrod", "daa520")
|
||||
HTMLAssociate("grey", "808080")
|
||||
HTMLAssociate("gray", "808080")
|
||||
HTMLAssociate("green", "008000")
|
||||
HTMLAssociate("greenyellow", "adff2f")
|
||||
HTMLAssociate("honeydew", "f0fff0")
|
||||
HTMLAssociate("hotpink", "ff69b4")
|
||||
HTMLAssociate("indianred", "cd5c5c")
|
||||
HTMLAssociate("indigo", "4b0082")
|
||||
HTMLAssociate("ivory", "fffff0")
|
||||
HTMLAssociate("khaki", "f0e68c")
|
||||
HTMLAssociate("lavender", "e6e6fa")
|
||||
HTMLAssociate("lavenderblush", "fff0f5")
|
||||
HTMLAssociate("lawngreen", "7cfc00")
|
||||
HTMLAssociate("lemonchiffon", "fffacd")
|
||||
HTMLAssociate("lightblue", "add8e6")
|
||||
HTMLAssociate("lightcoral", "f08080")
|
||||
HTMLAssociate("lightcyan", "e0ffff")
|
||||
HTMLAssociate("lightgoldenrod", "fafad2")
|
||||
HTMLAssociate("lightgreen", "90ee90")
|
||||
HTMLAssociate("lightgrey", "d3d3d3")
|
||||
HTMLAssociate("lightgray", "d3d3d3")
|
||||
HTMLAssociate("lightpink", "ffb6c1")
|
||||
HTMLAssociate("lightsalmon", "ffa07a")
|
||||
HTMLAssociate("lightseagreen", "20b2aa")
|
||||
HTMLAssociate("lightskyblue", "87cefa")
|
||||
HTMLAssociate("lightslategrey", "778899")
|
||||
HTMLAssociate("lightslategray", "778899")
|
||||
HTMLAssociate("lightsteelblue", "b0c4de")
|
||||
HTMLAssociate("lightyellow", "ffffe0")
|
||||
HTMLAssociate("lime", "00ff00")
|
||||
HTMLAssociate("limegreen", "32cd32")
|
||||
HTMLAssociate("linen", "faf0e6")
|
||||
HTMLAssociate("magenta", "ff00ff")
|
||||
HTMLAssociate("maroon", "800000")
|
||||
HTMLAssociate("mediumaquamarine", "66cdaa")
|
||||
HTMLAssociate("mediumblue", "0000cd")
|
||||
HTMLAssociate("mediumorchid", "ba55d3")
|
||||
HTMLAssociate("mediumpurple", "9370db")
|
||||
HTMLAssociate("mediumseagreen", "3cb371")
|
||||
HTMLAssociate("mediumslateblue", "7b68ee")
|
||||
HTMLAssociate("mediumspringgreen","00fa9a")
|
||||
HTMLAssociate("mediumturquoise", "48d1cc")
|
||||
HTMLAssociate("mediumvioletred", "c71585")
|
||||
HTMLAssociate("midnightblue", "191970")
|
||||
HTMLAssociate("mintcream", "f5fffa")
|
||||
HTMLAssociate("mistyrose", "ffe4e1")
|
||||
HTMLAssociate("moccasin", "ffe4b5")
|
||||
HTMLAssociate("navajowhite", "ffdead")
|
||||
HTMLAssociate("navy", "000080")
|
||||
HTMLAssociate("oldlace", "fdf5e6")
|
||||
HTMLAssociate("olive", "808000")
|
||||
HTMLAssociate("olivedrab", "6b8e23")
|
||||
HTMLAssociate("orange", "ffa500")
|
||||
HTMLAssociate("orangered", "ff4500")
|
||||
HTMLAssociate("orchid", "da70d6")
|
||||
HTMLAssociate("palegoldenrod", "eee8aa")
|
||||
HTMLAssociate("palegreen", "98fb98")
|
||||
HTMLAssociate("paleturquoise", "afeeee")
|
||||
HTMLAssociate("palevioletred", "db7093")
|
||||
HTMLAssociate("papayawhip", "ffefd5")
|
||||
HTMLAssociate("peachpuff", "ffdab9")
|
||||
HTMLAssociate("peru", "cd853f")
|
||||
HTMLAssociate("pink", "ffc0cd")
|
||||
HTMLAssociate("plum", "dda0dd")
|
||||
HTMLAssociate("powderblue", "b0e0e6")
|
||||
HTMLAssociate("purple", "800080")
|
||||
HTMLAssociate("red", "ff0000")
|
||||
HTMLAssociate("rosybrown", "bc8f8f")
|
||||
HTMLAssociate("royalblue", "4169e1")
|
||||
HTMLAssociate("saddlebrown", "8b4513")
|
||||
HTMLAssociate("salmon", "fa8072")
|
||||
HTMLAssociate("sandybrown", "f4a460")
|
||||
HTMLAssociate("seagreen", "2e8b57")
|
||||
HTMLAssociate("seashell", "fff5ee")
|
||||
HTMLAssociate("sienna", "a0522d")
|
||||
HTMLAssociate("silver", "c0c0c0")
|
||||
HTMLAssociate("skyblue", "87ceed")
|
||||
HTMLAssociate("slateblue", "6a5acd")
|
||||
HTMLAssociate("slategrey", "708090")
|
||||
HTMLAssociate("slategray", "708090")
|
||||
HTMLAssociate("snow", "fffafa")
|
||||
HTMLAssociate("springgreen", "00ff7f")
|
||||
HTMLAssociate("steelblue", "4682b4")
|
||||
HTMLAssociate("tan", "d2b48c")
|
||||
HTMLAssociate("teal", "008080")
|
||||
HTMLAssociate("thistle", "d8bfd8")
|
||||
HTMLAssociate("tomato", "ff6347")
|
||||
HTMLAssociate("turquoise", "40e0d0")
|
||||
HTMLAssociate("violet", "ee82ee")
|
||||
HTMLAssociate("wheat", "f5deb3")
|
||||
HTMLAssociate("white", "ffffff")
|
||||
HTMLAssociate("whitesmoke", "f5f5f5")
|
||||
HTMLAssociate("yellow", "ffff00")
|
||||
HTMLAssociate("yellowgreen", "a9cd32")
|
||||
|
||||
|
||||
proc/SaveHTMLAssociations()
|
||||
var/savefile/F = new ("s_html.sav")
|
||||
F["html_colours"] << html_colours
|
||||
83
code/libs/s_html/hexadecimal.dm
Normal file
83
code/libs/s_html/hexadecimal.dm
Normal file
@@ -0,0 +1,83 @@
|
||||
/**************************************
|
||||
Hexadecimal Number Manipulation
|
||||
by Jeremy "Spuzzum" Gibson
|
||||
***************************************
|
||||
12345678901234567890123456789012345678901234567890
|
||||
These are hexadecimal manipulation procs that let
|
||||
you convert between decimals and hexadecimals.
|
||||
Note well that you can already convert numbers
|
||||
into an HTML colour string with BYOND's rgb()
|
||||
proc. This is designed for hexadecimal, which
|
||||
encompasses a larger field.
|
||||
|
||||
**************************************/
|
||||
|
||||
proc/hex2num(hex)
|
||||
//Converts a hexadecimal string (eg. "9F") into a numeral (eg. 159).
|
||||
|
||||
if(!istext(hex))
|
||||
CRASH("hex2num not given a hexadecimal string argument (user error)")
|
||||
return
|
||||
|
||||
var/num = 0
|
||||
var/power = 0
|
||||
|
||||
for(var/i = lentext(hex), i > 0, i--)
|
||||
var/char = copytext(hex, i, i+1) //extract hexadecimal character from string
|
||||
switch(char)
|
||||
if("0")
|
||||
power++ //We don't do anything with a zero, so we'll just increase the power,
|
||||
continue // then go onto the next iteration.
|
||||
|
||||
if("1","2","3","4","5","6","7","8","9")
|
||||
num += text2num(char) * (16 ** power)
|
||||
|
||||
if("A","a") num += 10 * (16 ** power)
|
||||
if("B","b") num += 11 * (16 ** power)
|
||||
if("C","c") num += 12 * (16 ** power)
|
||||
if("D","d") num += 13 * (16 ** power)
|
||||
if("E","e") num += 14 * (16 ** power)
|
||||
if("F","f") num += 15 * (16 ** power)
|
||||
|
||||
else
|
||||
CRASH("hex2num given non-hexadecimal string (user error)")
|
||||
return
|
||||
|
||||
power++
|
||||
|
||||
return(num)
|
||||
|
||||
|
||||
proc/num2hex(num, placeholder=2)
|
||||
//Converts a numeral (eg. 255) into a hexadecimal string (eg. "FF")
|
||||
//The 'placeholder' argument inserts zeroes in front of the string
|
||||
// until the string is that length -- eg. 15 in hexadecimal is "F",
|
||||
// but the placeholder of 2 would make it "0F".
|
||||
|
||||
if(!isnum(num))
|
||||
CRASH("num2hex not given a numeric argument (user error)")
|
||||
return
|
||||
|
||||
if(!num) return("0") //no computation necessary
|
||||
|
||||
var/hex = ""
|
||||
|
||||
var/i = 0
|
||||
while(16**i < num) i++
|
||||
|
||||
for(var/power = i-1, power >= 0, power--)
|
||||
var/val = round( num / (16 ** power) )
|
||||
num -= val * (16 ** power)
|
||||
switch(val)
|
||||
if(0,1,2,3,4,5,6,7,8,9) hex += "[val]"
|
||||
|
||||
if(10) hex += "A"
|
||||
if(11) hex += "B"
|
||||
if(12) hex += "C"
|
||||
if(13) hex += "D"
|
||||
if(14) hex += "E"
|
||||
if(15) hex += "F"
|
||||
|
||||
while(lentext(hex) < placeholder) hex = "0[hex]"
|
||||
|
||||
return(hex)
|
||||
38
code/libs/s_html/inverthtml.dm
Normal file
38
code/libs/s_html/inverthtml.dm
Normal file
@@ -0,0 +1,38 @@
|
||||
//Inverts an HTML-colour string.
|
||||
//I.e. "#FF0000" will become "#00FFFF".
|
||||
|
||||
//This will *ONLY* accept a colour in the
|
||||
// form "#XXXXXX". Nothing else will work!
|
||||
|
||||
proc/invertHTML(HTMLstring)
|
||||
if(!istext(HTMLstring))
|
||||
CRASH("Given non-text argument!")
|
||||
return
|
||||
else if(length(HTMLstring) != 7)
|
||||
CRASH("Given non-HTML argument!")
|
||||
return
|
||||
|
||||
var/textr = copytext(HTMLstring, 2,4)
|
||||
var/textg = copytext(HTMLstring, 4,6)
|
||||
var/textb = copytext(HTMLstring, 6,8)
|
||||
|
||||
var/r = hex2num(textr)
|
||||
var/g = hex2num(textg)
|
||||
var/b = hex2num(textb)
|
||||
|
||||
textr = num2hex(255-r)
|
||||
textg = num2hex(255-g)
|
||||
textb = num2hex(255-b)
|
||||
if(lentext(textr) < 2) textr = "0[textr]"
|
||||
if(lentext(textg) < 2) textr = "0[textg]"
|
||||
if(lentext(textb) < 2) textr = "0[textb]"
|
||||
|
||||
return("#[textr][textg][textb]")
|
||||
|
||||
|
||||
/*
|
||||
//Testing code/sample implementation
|
||||
mob/verb/test_invertHTML()
|
||||
usr << "#CC9933"
|
||||
usr << invertHTML("#CC9933")
|
||||
*/
|
||||
19
code/libs/s_html/s_html.dme
Normal file
19
code/libs/s_html/s_html.dme
Normal file
@@ -0,0 +1,19 @@
|
||||
// BEGIN_INTERNALS
|
||||
/*
|
||||
FILE: inverthtml.dm
|
||||
DIR:
|
||||
MAP_ICON_TYPE: 0
|
||||
AUTO_FILE_DIR: ON
|
||||
*/
|
||||
// END_INTERNALS
|
||||
// BEGIN_FILE_DIR
|
||||
#define FILE_DIR .
|
||||
// END_FILE_DIR
|
||||
// BEGIN_PREFERENCES
|
||||
#define DEBUG
|
||||
// END_PREFERENCES
|
||||
// BEGIN_INCLUDE
|
||||
#include "colour2html.dm"
|
||||
#include "hexadecimal.dm"
|
||||
#include "inverthtml.dm"
|
||||
// END_INCLUDE
|
||||
BIN
code/libs/s_html/s_html.sav
Normal file
BIN
code/libs/s_html/s_html.sav
Normal file
Binary file not shown.
@@ -2,7 +2,7 @@
|
||||
/datum/admins/proc/create_mob(var/mob/user)
|
||||
if (!create_mob_html)
|
||||
var/mobjs = null
|
||||
mobjs = dd_list2text(typesof(/mob), ";")
|
||||
mobjs = list2text(typesof(/mob), ";")
|
||||
create_mob_html = file2text('html/create_object.html')
|
||||
create_mob_html = replacetext(create_mob_html, "null /* object types */", "\"[mobjs]\"")
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
/datum/admins/proc/create_object(var/mob/user)
|
||||
if (!create_object_html)
|
||||
var/objectjs = null
|
||||
objectjs = dd_list2text(typesof(/obj), ";")
|
||||
objectjs = list2text(typesof(/obj), ";")
|
||||
create_object_html = file2text('html/create_object.html')
|
||||
create_object_html = replacetext(create_object_html, "null /* object types */", "\"[objectjs]\"")
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
if (!quick_create_object_html)
|
||||
var/objectjs = null
|
||||
objectjs = dd_list2text(typesof(path), ";")
|
||||
objectjs = list2text(typesof(path), ";")
|
||||
quick_create_object_html = file2text('html/create_object.html')
|
||||
quick_create_object_html = replacetext(quick_create_object_html, "null /* object types */", "\"[objectjs]\"")
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/datum/admins/proc/create_turf(var/mob/user)
|
||||
if (!create_turf_html)
|
||||
var/turfjs = null
|
||||
turfjs = dd_list2text(typesof(/turf), ";")
|
||||
turfjs = list2text(typesof(/turf), ";")
|
||||
create_turf_html = file2text('html/create_object.html')
|
||||
create_turf_html = replacetext(create_turf_html, "null /* object types */", "\"[turfjs]\"")
|
||||
|
||||
|
||||
@@ -1138,22 +1138,29 @@
|
||||
message_admins("\blue [key_name_admin(usr)] forced [key_name_admin(M)] to say: [speech]")
|
||||
|
||||
else if(href_list["sendtoprison"])
|
||||
if(!check_rights(R_ADMIN)) return
|
||||
// Reworked to be useful for investigating shit.
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(alert(usr, "Send to admin prison for the round?", "Message", "Yes", "No") != "Yes")
|
||||
if(alert(usr, "Warp to prison?", "Message", "Yes", "No") != "Yes")
|
||||
return
|
||||
|
||||
var/mob/M = locate(href_list["sendtoprison"])
|
||||
|
||||
if(!ismob(M))
|
||||
usr << "This can only be used on instances of type /mob"
|
||||
return
|
||||
|
||||
if(istype(M, /mob/living/silicon/ai))
|
||||
usr << "This cannot be used on instances of type /mob/living/silicon/ai"
|
||||
return
|
||||
|
||||
var/turf/prison_cell = pick(prisonwarp)
|
||||
if(!prison_cell) return
|
||||
|
||||
if(!prison_cell)
|
||||
return
|
||||
|
||||
/*
|
||||
var/obj/structure/closet/secure_closet/brig/locker = new /obj/structure/closet/secure_closet/brig(prison_cell)
|
||||
locker.opened = 0
|
||||
locker.locked = 1
|
||||
@@ -1165,18 +1172,31 @@
|
||||
I.loc = locker
|
||||
I.layer = initial(I.layer)
|
||||
I.dropped(M)
|
||||
|
||||
M.update_icons()
|
||||
*/
|
||||
|
||||
//so they black out before warping
|
||||
M.Paralyse(5)
|
||||
M.visible_message(
|
||||
"<span class=\"sinister\">You hear the sound of cell doors slamming shut, and [M.name] suddenly vanishes!</span>",
|
||||
"<span class=\"sinister\">You hear the sound of cell doors slamming shut!</span>")
|
||||
|
||||
sleep(5)
|
||||
if(!M) return
|
||||
|
||||
if(!M)
|
||||
return
|
||||
|
||||
// TODO: play sound here. Thinking of using Wolfenstein 3D's cell door closing sound.
|
||||
|
||||
M.loc = prison_cell
|
||||
|
||||
/*
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/prisoner = M
|
||||
prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(prisoner), slot_w_uniform)
|
||||
prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes)
|
||||
*/
|
||||
|
||||
M << "\red You have been sent to the prison station!"
|
||||
log_admin("[key_name(usr)] sent [key_name(M)] to the prison station.")
|
||||
@@ -1616,9 +1636,12 @@
|
||||
H << "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from your benefactor. Message as follows, agent. <b>\"[input]\"</b> Message ends.\""
|
||||
|
||||
else if(href_list["CentcommFaxView"])
|
||||
var/info = locate(href_list["CentcommFaxView"])
|
||||
|
||||
usr << browse("<HTML><HEAD><TITLE>Centcomm Fax Message</TITLE></HEAD><BODY>[info]</BODY></HTML>", "window=Centcomm Fax Message")
|
||||
var/obj/item/weapon/paper/P = locate(href_list["CentcommFaxView"])
|
||||
var/info_2 = ""
|
||||
if(P.img)
|
||||
usr << browse_rsc(P.img.img, "tmp_photo.png")
|
||||
info_2 = "<img src='tmp_photo.png' width='192' style='-ms-interpolation-mode:nearest-neighbor' /><br>"
|
||||
usr << browse("<HTML><HEAD><TITLE>Centcomm Fax Message</TITLE></HEAD><BODY>[info_2][P.info]</BODY></HTML>", "window=Centcomm Fax Message")
|
||||
|
||||
else if(href_list["CentcommFaxReply"])
|
||||
var/mob/living/carbon/human/H = locate(href_list["CentcommFaxReply"])
|
||||
@@ -1800,7 +1823,7 @@
|
||||
alert("Select fewer object types, (max 5)")
|
||||
return
|
||||
else if(length(removed_paths))
|
||||
alert("Removed:\n" + dd_list2text(removed_paths, "\n"))
|
||||
alert("Removed:\n" + list2text(removed_paths, "\n"))
|
||||
|
||||
var/list/offset = text2list(href_list["offset"],",")
|
||||
var/number = dd_range(1, 100, text2num(href_list["object_count"]))
|
||||
|
||||
@@ -1083,17 +1083,17 @@ Pressure: [env.return_pressure()]"}
|
||||
|
||||
switch(input("Which list?") in list("Players","Admins","Mobs","Living Mobs","Dead Mobs", "Clients"))
|
||||
if("Players")
|
||||
usr << dd_list2text(player_list,",")
|
||||
usr << list2text(player_list,",")
|
||||
if("Admins")
|
||||
usr << dd_list2text(admins,",")
|
||||
usr << list2text(admins,",")
|
||||
if("Mobs")
|
||||
usr << dd_list2text(mob_list,",")
|
||||
usr << list2text(mob_list,",")
|
||||
if("Living Mobs")
|
||||
usr << dd_list2text(living_mob_list,",")
|
||||
usr << list2text(living_mob_list,",")
|
||||
if("Dead Mobs")
|
||||
usr << dd_list2text(dead_mob_list,",")
|
||||
usr << list2text(dead_mob_list,",")
|
||||
if("Clients")
|
||||
usr << dd_list2text(clients,",")
|
||||
usr << list2text(clients,",")
|
||||
|
||||
|
||||
/client/proc/cmd_admin_toggle_block(var/mob/M,var/block)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user