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:
Rob Nelson
2014-11-02 12:47:21 -08:00
247 changed files with 22949 additions and 16266 deletions

View File

@@ -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"

View 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]."

View File

@@ -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 !

View File

@@ -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

View File

@@ -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"

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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).

View File

@@ -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")

View File

@@ -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))

View File

@@ -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]'"

View File

@@ -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)

View File

@@ -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

View File

@@ -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")

View File

@@ -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,

View File

@@ -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")

View File

@@ -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)

View File

@@ -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

View File

@@ -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))

View File

@@ -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

View File

@@ -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))

View File

@@ -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)

View File

@@ -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)()

View File

@@ -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])")

View File

@@ -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

View File

@@ -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

View File

@@ -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()

View File

@@ -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

View File

@@ -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," ")))

View File

@@ -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

View File

@@ -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")

View File

@@ -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"

View File

@@ -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

View File

@@ -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."

View File

@@ -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:

View File

@@ -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]"

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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>"

View 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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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()
..()

View 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

View File

@@ -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

View File

@@ -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>&nbsp;[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(..())

View File

@@ -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,

View File

@@ -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())

View 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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1066,7 +1066,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
tnote += "<i><b>&rarr; To [P.owner]:</b></i><br>[t]<br>"
P.tnote += "<i><b>&larr; 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>")

View File

@@ -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)
..()

View 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

View File

@@ -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

View 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)

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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"

View File

@@ -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"

View File

@@ -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

View File

@@ -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)

View File

@@ -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"

View File

@@ -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)

View File

@@ -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()
..()

View File

@@ -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
..()

View File

@@ -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
..()

View File

@@ -267,4 +267,4 @@ a {
return
/obj/proc/container_resist()
return
return

View File

@@ -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)

View File

@@ -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)

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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(

View 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

View 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)

View 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")
*/

View 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

Binary file not shown.

View File

@@ -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]\"")

View File

@@ -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]\"")

View File

@@ -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]\"")

View File

@@ -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"]))

View File

@@ -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