Merge branch 'master' into voiced-skeletons

This commit is contained in:
Jack Edge
2016-05-13 18:37:23 +01:00
124 changed files with 2392 additions and 1918 deletions
+2
View File
@@ -534,7 +534,9 @@
for(var/obj/machinery/capture_the_flag/CTF in machines)
ctf_enabled = !CTF.ctf_enabled
CTF.ctf_enabled = !CTF.ctf_enabled
CTF.TellGhost()
message_admins("[key_name_admin(usr)] has [ctf_enabled? "enabled" : "disabled"] CTF!")
notify_ghosts("CTF has been [ctf_enabled? "enabled" : "disabled"]!",'sound/effects/ghost2.ogg')
if(E)
E.processing = 0
-2
View File
@@ -26,8 +26,6 @@ var/sound/admin_sound
for(var/mob/M in player_list)
if(M.client.prefs.toggles & SOUND_MIDI)
var/vol = M.client.prefs.adminmusicvolume
admin_sound.volume = vol
M << admin_sound
feedback_add_details("admin_verb","PGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -172,6 +172,16 @@
M.faction += team
M.equipOutfit(ctf_gear)
/obj/machinery/capture_the_flag/proc/TellGhost()
if(ctf_enabled)
notify_ghosts("[name] has been activated!", enter_link="<a href=?src=\ref[src];join=1>(Click to join the [team] team!)</a> or click on the controller directly!", source = src, attack_not_jump = 0)
/obj/machinery/capture_the_flag/Topic(href, href_list)
if(href_list["join"])
var/mob/dead/observer/ghost = usr
if(istype(ghost))
attack_ghost(ghost)
/obj/machinery/capture_the_flag/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/twohanded/required/ctf))
var/obj/item/weapon/twohanded/required/ctf/flag = I
@@ -214,6 +224,12 @@
CTF.ctf_gear = CTF.instagib_gear
CTF.respawn_cooldown = INSTAGIB_RESPAWN
/obj/machinery/capture_the_flag/proc/normal_mode()
for(var/obj/machinery/capture_the_flag/CTF in machines)
if(CTF.ctf_enabled == TRUE)
CTF.ctf_gear = initial(ctf_gear)
CTF.respawn_cooldown = DEFAULT_RESPAWN
/obj/item/weapon/gun/projectile/automatic/pistol/deagle/CTF
desc = "This looks like it could really hurt in melee."
force = 75
@@ -73,16 +73,16 @@
/obj/machinery/recycler/lumbermill
name = "lumbermill saw"
desc = "Faster then the cartoons!"
emagged = 2 //Always grinds people
emagged = 2 //Always gibs people
item_recycle_sound = 'sound/weapons/chainsawhit.ogg'
/obj/machinery/recycler/lumbermill/recycle(obj/item/weapon/grown/log/L, sound = 1)
L.loc = src.loc
/obj/machinery/recycler/lumbermill/recycle_item(obj/item/weapon/grown/log/L)
if(!istype(L))
return
if(sound)
playsound(src.loc, 'sound/weapons/chainsawhit.ogg', 100, 1)
new L.plank_type(src.loc, 1 + round(L.seed.potency / 25))
qdel(L)
else
var/potency = L.seed.potency
..()
new L.plank_type(src.loc, 1 + round(potency / 25))
/mob/living/simple_animal/chicken/rabbit/normal
icon_state = "b_rabbit"
@@ -130,4 +130,4 @@
spawnableAtoms = list(/obj/structure/flora/rock/icy = 5, /obj/structure/flora/rock/pile/icy = 5)
/obj/effect/landmark/mapGenerator/snowy
mapGeneratorType = /datum/mapGenerator/snowy
mapGeneratorType = /datum/mapGenerator/snowy
+11 -1
View File
@@ -829,6 +829,14 @@
/obj/item/pizzabox/vegetable)
crate_name = "pizza crate"
/datum/supply_pack/organic/cream_piee
name = "High-yield Clown-grade Cream Pie Crate"
cost = 6000
contains = list(/obj/item/weapon/storage/backpack/dufflebag/clown/cream_pie)
crate_name = "party equipment crate"
contraband = TRUE
access = access_theatre
/datum/supply_pack/organic/monkey
name = "Monkey Crate"
cost = 2000
@@ -1198,7 +1206,9 @@
/obj/item/weapon/folder/red,
/obj/item/weapon/folder/yellow,
/obj/item/weapon/clipboard,
/obj/item/weapon/clipboard)
/obj/item/weapon/clipboard,
/obj/item/weapon/stamp,
/obj/item/weapon/stamp/denied)
crate_name = "bureaucracy crate"
/datum/supply_pack/misc/toner
-1
View File
@@ -62,7 +62,6 @@ var/list/preferences_datums = list()
var/list/features = list("mcolor" = "FFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None")
var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity")
var/adminmusicvolume = 50
//Mob preview
var/icon/preview_icon = null
@@ -223,7 +223,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["preferred_map"] >> preferred_map
S["ignoring"] >> ignoring
S["ghost_hud"] >> ghost_hud
S["adminmusicvolume"] >> adminmusicvolume
S["inquisitive_ghost"] >> inquisitive_ghost
//try to fix any outdated data if necessary
@@ -275,7 +274,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["preferred_map"] << preferred_map
S["ignoring"] << ignoring
S["ghost_hud"] << ghost_hud
S["adminmusicvolume"] << adminmusicvolume
S["inquisitive_ghost"] << inquisitive_ghost
return 1
+1 -10
View File
@@ -332,13 +332,4 @@ var/global/list/ghost_orbits = list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
prefs.toggles ^= SOUND_ANNOUNCEMENTS
src << "You will now [(prefs.toggles & SOUND_ANNOUNCEMENTS) ? "no longer hear announcements" : "hear announcement sounds"]."
prefs.save_preferences()
feedback_add_details("admin_verb","TAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/set_admin_volume()
set name = "Set Admin Music Volume"
set category = "Preferences"
set desc = "Set the volume you hear admin music at."
var/musinput = input("Range of 0 to 100.","Admin Music Volume", prefs.adminmusicvolume) as num
prefs.adminmusicvolume = max(0,min(musinput,100))
prefs.save_preferences()
feedback_add_details("admin_verb","TAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+17 -19
View File
@@ -341,7 +341,6 @@ BLIND // can't see anything
var/can_adjust = 1
var/adjusted = 0
var/alt_covers_chest = 0 // for adjusted/rolled-down jumpsuits, 0 = exposes chest and arms, 1 = exposes arms only
var/suit_color = null
var/obj/item/clothing/tie/hastie = null
/obj/item/clothing/under/worn_overlays(var/isinhands = FALSE)
@@ -363,7 +362,6 @@ BLIND // can't see anything
//make the sensor mode favor higher levels, except coords.
sensor_mode = pick(0, 1, 1, 2, 2, 2, 3, 3)
adjusted = 0
suit_color = item_color
..()
/obj/item/clothing/under/attackby(obj/item/I, mob/user, params)
@@ -482,25 +480,25 @@ BLIND // can't see anything
if(!can_adjust)
usr << "<span class='warning'>You cannot wear this suit any differently!</span>"
return
if(src.adjusted == 1)
src.fitted = initial(fitted)
src.item_color = initial(item_color)
src.item_color = src.suit_color //colored jumpsuits are shit and break without this
src.body_parts_covered = CHEST|GROIN|LEGS|ARMS
usr << "<span class='notice'>You adjust the suit back to normal.</span>"
src.adjusted = 0
else
if(src.fitted != FEMALE_UNIFORM_TOP)
src.fitted = NO_FEMALE_UNIFORM
src.item_color += "_d"
if (alt_covers_chest) // for the special snowflake suits that don't expose the chest when adjusted
src.body_parts_covered = CHEST|GROIN|LEGS
else
src.body_parts_covered = GROIN|LEGS
if(toggle_jumpsuit_adjust())
usr << "<span class='notice'>You adjust the suit to wear it more casually.</span>"
src.adjusted = 1
else
usr << "<span class='notice'>You adjust the suit back to normal.</span>"
usr.update_inv_w_uniform()
..()
/obj/item/clothing/under/proc/toggle_jumpsuit_adjust()
adjusted = !adjusted
if(adjusted)
if(fitted != FEMALE_UNIFORM_TOP)
fitted = NO_FEMALE_UNIFORM
if (alt_covers_chest) // for the special snowflake suits that don't expose the chest when adjusted
body_parts_covered = CHEST|GROIN|LEGS
else
body_parts_covered = GROIN|LEGS
else
fitted = initial(fitted)
body_parts_covered = CHEST|GROIN|LEGS|ARMS
return adjusted
/obj/item/clothing/under/examine(mob/user)
..()
@@ -48,6 +48,7 @@
icon_state = "hardhat0_cakehat"
item_state = "hardhat0_cakehat"
item_color = "cakehat"
hitsound = 'sound/weapons/tap.ogg'
flags_inv = HIDEEARS|HIDEHAIR
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
brightness_on = 2 //luminosity when on
@@ -69,6 +70,7 @@
force = 15
throwforce = 15
damtype = BURN
hitsound = 'sound/items/Welder.ogg'
SSobj.processing |= src
/obj/item/clothing/head/hardhat/cakehat/turn_off()
@@ -76,6 +78,7 @@
force = 0
throwforce = 0
damtype = BRUTE
hitsound = 'sound/weapons/tap.ogg'
SSobj.processing -= src
/obj/item/clothing/head/hardhat/cakehat/is_hot()
+19 -14
View File
@@ -11,8 +11,8 @@
heat_protection = FEET
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
redcoat
item_color = "redcoat" //Exists for washing machines. Is not different from black shoes in any way.
/obj/item/clothing/shoes/sneakers/black/redcoat
item_color = "redcoat" //Exists for washing machines. Is not different from black shoes in any way.
/obj/item/clothing/shoes/sneakers/brown
name = "brown shoes"
@@ -20,18 +20,23 @@
icon_state = "brown"
item_color = "brown"
captain
item_color = "captain" //Exists for washing machines. Is not different from brown shoes in any way.
hop
item_color = "hop" //Exists for washing machines. Is not different from brown shoes in any way.
ce
item_color = "chief" //Exists for washing machines. Is not different from brown shoes in any way.
rd
item_color = "director" //Exists for washing machines. Is not different from brown shoes in any way.
cmo
item_color = "medical" //Exists for washing machines. Is not different from brown shoes in any way.
cmo
item_color = "cargo" //Exists for washing machines. Is not different from brown shoes in any way.
/obj/item/clothing/shoes/sneakers/brown/captain
item_color = "captain" //Exists for washing machines. Is not different from brown shoes in any way.
/obj/item/clothing/shoes/sneakers/brown/hop
item_color = "hop" //Exists for washing machines. Is not different from brown shoes in any way.
/obj/item/clothing/shoes/sneakers/brown/ce
item_color = "chief" //Exists for washing machines. Is not different from brown shoes in any way.
/obj/item/clothing/shoes/sneakers/brown/rd
item_color = "director" //Exists for washing machines. Is not different from brown shoes in any way.
/obj/item/clothing/shoes/sneakers/brown/cmo
item_color = "medical" //Exists for washing machines. Is not different from brown shoes in any way.
/obj/item/clothing/shoes/sneakers/brown/qm
item_color = "cargo" //Exists for washing machines. Is not different from brown shoes in any way.
/obj/item/clothing/shoes/sneakers/blue
name = "blue shoes"
@@ -115,6 +115,12 @@
put_on_delay = 40
can_hold_items = 1
/obj/item/clothing/shoes/workboots/mining
name = "mining boots"
desc = "Steel-toed mining boots for mining in hazardous environments. Very good at keeping toes uncrushed."
icon_state = "explorer"
burn_state = FIRE_PROOF
/obj/item/clothing/shoes/cult
name = "nar-sian invoker boots"
desc = "A pair of boots worn by the followers of Nar-Sie."
-1
View File
@@ -8,7 +8,6 @@
icon_state = initial(C.icon_state)
item_state = initial(C.item_state)
item_color = initial(C.item_color)
suit_color = initial(C.item_color)
/obj/item/clothing/under/color/black
name = "black jumpsuit"
+1 -1
View File
@@ -27,7 +27,7 @@
/obj/item/weapon/reagent_containers/food/snacks/egg/attackby(obj/item/weapon/W, mob/user, params)
if(istype( W, /obj/item/toy/crayon ))
var/obj/item/toy/crayon/C = W
var/clr = C.colourName
var/clr = C.item_color
if(!(clr in list("blue", "green", "mime", "orange", "purple", "rainbow", "red", "yellow")))
usr << "<span class='notice'>[src] refuses to take on this colour!</span>"
+4 -4
View File
@@ -188,15 +188,15 @@
var/obj/item/seeds/seed = G.seed
var/mob/living/carbon/M = target
var/stun_len = seed.potency * rate
var/stun_len = seed.potency * rate * 0.8
if(istype(G) && ispath(G.trash, /obj/item/weapon/grown))
return
if(!istype(G, /obj/item/weapon/grown/bananapeel) && (!G.reagents || !G.reagents.has_reagent("lube")))
stun_len /= 3
var/stun = max(stun_len * 2, 1)
var/weaken = max(stun_len, 0.5)
var/stun = min(stun_len, 7)
var/weaken = min(stun_len, 7)
if(M.slip(stun, weaken, G))
for(var/datum/plant_gene/trait/T in seed.genes)
@@ -309,4 +309,4 @@
/datum/plant_gene/trait/maxchem/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc)
..()
G.reagents.maximum_volume *= rate
G.reagents.maximum_volume *= rate
+1 -1
View File
@@ -78,7 +78,7 @@ Shaft Miner
belt = /obj/item/device/pda/shaftminer
ears = /obj/item/device/radio/headset/headset_cargo
shoes = /obj/item/clothing/shoes/jackboots
shoes = /obj/item/clothing/shoes/workboots/mining
gloves = /obj/item/clothing/gloves/color/black
uniform = /obj/item/clothing/under/rank/miner/lavaland
l_pocket = /obj/item/weapon/reagent_containers/pill/patch/styptic
+48 -41
View File
@@ -296,14 +296,17 @@
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/weapon/survivalcapsule , 400),
new /datum/data/mining_equipment("GAR scanners", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Explorer Belt", /obj/item/weapon/storage/belt/mining, 500),
new /datum/data/mining_equipment("Survival Medipen", /obj/item/weapon/reagent_containers/hypospray/medipen/survival, 500),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600),
new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 600),
new /datum/data/mining_equipment("Tracking Implant Kit",/obj/item/weapon/storage/box/minertracker, 600),
new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 750),
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 750),
new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 800),
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000),
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/weapon/pickaxe/silver, 1000),
new /datum/data/mining_equipment("Jetpack Upgrade", /obj/item/hardsuit_jetpack , 2000),
new /datum/data/mining_equipment("Jetpack Upgrade", /obj/item/hardsuit_jetpack, 2000),
new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000),
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000),
new /datum/data/mining_equipment("Super Resonator", /obj/item/weapon/resonator/upgraded, 2500),
new /datum/data/mining_equipment("Super Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator/super, 3000),
@@ -512,15 +515,31 @@
return FALSE
return TRUE
/obj/item/device/wormhole_jaunter/proc/get_destinations(mob/user)
var/list/destinations = list()
if(isgolem(user))
for(var/obj/item/device/radio/beacon/B in world)
var/turf/T = get_turf(B)
if(istype(T.loc, /area/ruin/powered/golem_ship))
destinations += B
// In the event golem beacon is destroyed, send to station instead
if(destinations.len)
return destinations
for(var/obj/item/device/radio/beacon/B in world)
var/turf/T = get_turf(B)
if(T.z == ZLEVEL_STATION)
destinations += B
return destinations
/obj/item/device/wormhole_jaunter/proc/activate(mob/user)
if(!turf_check(user))
return
var/list/L = list()
for(var/obj/item/device/radio/beacon/B in world)
var/turf/T = get_turf(B)
if(T.z == ZLEVEL_STATION)
L += B
var/list/L = get_destinations(user)
if(!L.len)
user << "<span class='notice'>The [src.name] found no beacons in the world to anchor a wormhole to.</span>"
return
@@ -1124,44 +1143,32 @@
/obj/machinery/mineral/equipment_vendor/golem
name = "golem ship equipment vendor"
desc = "A modified mining equipment vendor. It seems a few selections were replaced."
prize_list = list(
new /datum/data/mining_equipment("Stimpack", /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack, 50),
new /datum/data/mining_equipment("Stimpack Bundle", /obj/item/weapon/storage/box/medipens/utility, 200),
new /datum/data/mining_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 100),
new /datum/data/mining_equipment("Absinthe", /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe/premium,100),
new /datum/data/mining_equipment("Soap", /obj/item/weapon/soap/nanotrasen, 200),
new /datum/data/mining_equipment("Science Goggles", /obj/item/clothing/glasses/science, 250),
new /datum/data/mining_equipment("Laser Pointer", /obj/item/device/laser_pointer, 300),
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
new /datum/data/mining_equipment("Monkey Cube", /obj/item/weapon/reagent_containers/food/snacks/monkeycube, 300),
new /datum/data/mining_equipment("Toolbelt", /obj/item/weapon/storage/belt/utility, 350),
new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/weapon/hivelordstabilizer, 400),
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/weapon/survivalcapsule, 400),
new /datum/data/mining_equipment("GAR scanners", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Sulphuric Acid", /obj/item/weapon/reagent_containers/glass/beaker/sulphuric, 500),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600),
new /datum/data/mining_equipment("Advanced Scanner", /obj/item/device/t_scanner/adv_mining_scanner, 800),
new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 800),
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000),
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/weapon/pickaxe/silver, 1000),
new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000),
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000),
new /datum/data/mining_equipment("Super Resonator", /obj/item/weapon/resonator/upgraded, 2500),
new /datum/data/mining_equipment("Point Transfer Card", /obj/item/weapon/card/mining_point_card, 500),
new /datum/data/mining_equipment("Mining Drone", /mob/living/simple_animal/hostile/mining_drone, 800),
new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/device/mine_bot_ugprade, 400),
new /datum/data/mining_equipment("Drone Health Upgrade", /obj/item/device/mine_bot_ugprade/health, 400),
new /datum/data/mining_equipment("Drone Ranged Upgrade", /obj/item/device/mine_bot_ugprade/cooldown, 600),
new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000),
new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/weapon/storage/box/rndboards, 2000),
)
/obj/machinery/mineral/equipment_vendor/golem/New()
..()
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem(null)
B.apply_default_parts(src)
desc += "\nIt seems a few selections have been added."
prize_list += list(
new /datum/data/mining_equipment("Science Goggles", /obj/item/clothing/glasses/science, 250),
new /datum/data/mining_equipment("Monkey Cube", /obj/item/weapon/reagent_containers/food/snacks/monkeycube, 300),
new /datum/data/mining_equipment("Toolbelt", /obj/item/weapon/storage/belt/utility, 350),
new /datum/data/mining_equipment("Sulphuric Acid", /obj/item/weapon/reagent_containers/glass/beaker/sulphuric, 500),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600),
new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000),
new /datum/data/mining_equipment("Modification Kit", /obj/item/modkit, 1700),
new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/weapon/storage/box/rndboards, 2000),
)
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
RefreshParts()
/obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem
name = "circuit board (Golem Ship Equipment Vendor)"
build_path = /obj/machinery/mineral/equipment_vendor/golem
+56 -2
View File
@@ -4,6 +4,7 @@
name = "rock"
icon = 'icons/turf/mining.dmi'
icon_state = "rock"
var/smooth_icon = 'icons/turf/smoothrocks.dmi'
smooth = SMOOTH_MORE|SMOOTH_BORDER
canSmoothWith = list (/turf/closed/mineral, /turf/closed/wall)
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -14,7 +15,7 @@
layer = MOB_LAYER + 0.05
temperature = TCMB
var/environment_type = "asteroid"
var/turf/open/floor/plating/asteroid/turf_type = /turf/open/floor/plating/asteroid/airless
var/turf/open/floor/plating/turf_type = /turf/open/floor/plating/asteroid/airless
var/mineralType = null
var/mineralAmt = 3
var/spread = 0 //will the seam spread?
@@ -26,7 +27,7 @@
/turf/closed/mineral/New()
pixel_y = -4
pixel_x = -4
icon = 'icons/turf/smoothrocks.dmi'
icon = smooth_icon
..()
if (mineralType && mineralAmt && spread && spreadChance)
for(var/dir in cardinal)
@@ -707,3 +708,56 @@
baseturf = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
initial_gas_mix = "o2=14;n2=23;TEMP=300"
defer_change = 1
//BECAUSE ONE PLANET WASNT ENOUGH
/turf/closed/mineral/ash_rock //wall piece
pixel_y = -4
pixel_x = -4
name = "rock"
icon = 'icons/turf/mining.dmi'
smooth_icon = 'icons/turf/walls/rock_wall.dmi'
icon_state = "rock"
smooth = SMOOTH_MORE|SMOOTH_BORDER
canSmoothWith = list (/turf/closed/mineral, /turf/closed/wall)
baseturf = /turf/open/floor/plating/ash
initial_gas_mix = "o2=14;n2=23;TEMP=300"
environment_type = "waste"
turf_type = /turf/open/floor/plating/ash
defer_change = 1
/turf/open/floor/plating/ash
pixel_y = -4
pixel_x = -4
icon = 'icons/turf/mining.dmi'
name = "ash"
icon_state = "ash"
smooth = SMOOTH_MORE|SMOOTH_BORDER
canSmoothWith = list (/turf/open/floor/plating/ash, /turf/closed)
var/smooth_icon = 'icons/turf/floors/ash.dmi'
desc = "The ground is covered in volcanic ash."
baseturf = /turf/open/floor/plating/ash //I assume this will be a chasm eventually, once this becomes an actual surface
slowdown = 1
initial_gas_mix = "o2=14;n2=23;TEMP=300"
/turf/open/floor/plating/ash/New()
pixel_y = -4
pixel_x = -4
icon = smooth_icon
..()
/turf/open/floor/plating/ash/break_tile()
return
/turf/open/floor/plating/ash/burn_tile()
return
/turf/open/floor/plating/ash/rocky
name = "rocky ground"
icon_state = "rockyash"
icon = 'icons/turf/mining.dmi'
smooth_icon = 'icons/turf/floors/rocky_ash.dmi'
slowdown = 0
smooth = SMOOTH_MORE|SMOOTH_BORDER
canSmoothWith = list (/turf/open/floor/plating/ash/rocky, /turf/closed)
@@ -122,8 +122,6 @@ var/const/MAX_ACTIVE_TIME = 400
return 0
if(M.getorgan(/obj/item/organ/body_egg/alien_embryo))
return 0
if(loc == M)
return 0
if(stat != CONSCIOUS)
return 0
if(!sterile) M.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage
+6 -5
View File
@@ -119,11 +119,11 @@
if(health >= 0)
if(lying)
M.visible_message("<span class='notice'>[M] shakes [src] trying to get \him up!</span>", \
"<span class='notice'>You shake [src] trying to get \him up!</span>")
M.visible_message("<span class='notice'>[M] shakes [src] trying to get them up!</span>", \
"<span class='notice'>You shake [src] trying to get them up!</span>")
else
M.visible_message("<span class='notice'>[M] hugs [src] to make \him feel better!</span>", \
"<span class='notice'>You hug [src] to make \him feel better!</span>")
M.visible_message("<span class='notice'>[M] hugs [src] to make them feel better!</span>", \
"<span class='notice'>You hug [src] to make them feel better!</span>")
AdjustSleeping(-5)
AdjustParalysis(-3)
AdjustStunned(-3)
@@ -212,7 +212,8 @@
var/atom/movable/item = src.get_active_hand()
if(!item || (item.flags & NODROP)) return
if(!item || (item.flags & (NODROP|ABSTRACT)))
return
if(istype(item, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = item
@@ -155,7 +155,7 @@
take_overall_damage(b_loss,f_loss)
//attempt to dismember bodyparts
if(severity >= 2 || !bomb_armor)
if(severity <= 2 || !bomb_armor)
var/max_limb_loss = round(4/severity) //so you don't lose four limbs at severity 3.
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
@@ -443,7 +443,7 @@
darksight = 3
say_mod = "gibbers"
sexes = 0
specflags = list(NOBLOOD,NOBREATH,VIRUSIMMUNE)
specflags = list(NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS)
mutant_organs = list(/obj/item/organ/tongue/abductor)
var/scientist = 0 // vars to not pollute spieces list with castes
var/agent = 0
@@ -175,16 +175,18 @@ Please contact me on #coderbus IRC. ~Carnie x
var/obj/item/clothing/under/U = w_uniform
if(client && hud_used && hud_used.hud_shown)
if(hud_used.inventory_shown) //if the inventory is open ...
w_uniform.screen_loc = ui_iclothing //...draw the item in the inventory screen
U.screen_loc = ui_iclothing //...draw the item in the inventory screen
client.screen += w_uniform //Either way, add the item to the HUD
if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT))
return
var/t_color = w_uniform.item_color
var/t_color = U.item_color
if(!t_color)
t_color = w_uniform.icon_state
t_color = U.icon_state
if(U.adjusted)
t_color = "[t_color]_d"
var/image/standing
@@ -371,18 +371,37 @@ The proc would return a human next to the bot to be set to the patient var.
Pass the desired type path itself, declaring a temporary var beforehand is not required.
*/
/mob/living/simple_animal/bot/proc/scan(scan_type, old_target, scan_range = DEFAULT_SCAN_RANGE)
var/final_result
for (var/scan in shuffle(view(scan_range, src))) //Search for something in range!
if(!istype(scan, scan_type)) //Check that the thing we found is the type we want!
continue //If not, keep searching!
if( (scan in ignore_list) || (scan == old_target) ) //Filter for blacklisted elements, usually unreachable or previously processed oness
continue
var/scan_result = process_scan(scan) //Some bots may require additional processing when a result is selected.
if(scan_result)
final_result = scan_result
else
continue //The current element failed assessment, move on to the next.
return final_result
var/turf/T = get_turf(src)
if(!T)
return
var/list/adjacent = T.GetAtmosAdjacentTurfs(1)
for(var/scan in adjacent)//Let's see if there's something right next to us first!
var/final_result = checkscan(scan,scan_type,old_target)
if(final_result)
return final_result
for (var/scan in shuffle(view(scan_range, src))-adjacent) //Search for something in range!
var/final_result = checkscan(scan,scan_type,old_target)
if(final_result)
return final_result
/mob/living/simple_animal/bot/proc/checkscan(scan, scan_type, old_target)
if(!istype(scan, scan_type)) //Check that the thing we found is the type we want!
return 0 //If not, keep searching!
if( (scan in ignore_list) || (scan == old_target) ) //Filter for blacklisted elements, usually unreachable or previously processed oness
return 0
var/turf/T = get_turf(scan)
if(T)
for(var/C in T.contents)
if(istype(C,src.type) && (C != src)) //Is there another bot there already? If so, let's skip it so we dont all atack on top of eachother.
return 0
var/scan_result = process_scan(scan) //Some bots may require additional processing when a result is selected.
if(scan_result)
return scan_result
else
return 0 //The current element failed assessment, move on to the next.
return
//When the scan finds a target, run bot specific processing to select it for the next step. Empty by default.
/mob/living/simple_animal/bot/proc/process_scan(scan_target)
@@ -24,6 +24,8 @@
pressure_resistance = 200
unique_name = 1
AIStatus = AI_OFF //normal constructs don't have AI
loot = list(/obj/item/weapon/ectoplasm)
del_on_death = 1
var/list/construct_spells = list()
var/playstyle_string = "<b>You are a generic construct! Your job is to not exist, and you should probably adminhelp this.</b>"
@@ -34,12 +36,8 @@
AddSpell(new spell(null))
/mob/living/simple_animal/hostile/construct/death()
..(1)
new /obj/item/weapon/ectoplasm (src.loc)
visible_message("<span class='danger'>[src] collapses in a shattered heap.</span>")
ghostize()
qdel(src)
return
deathmessage = "<span class='danger'>[src] collapses in a shattered heap.</span>"
..()
/mob/living/simple_animal/hostile/construct/examine(mob/user)
var/msg = "<span cass='info'>*---------*\nThis is \icon[src] \a <b>[src]</b>!\n"
@@ -183,12 +181,12 @@
/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser,
/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser)
playstyle_string = "<b>You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, \
use magic missile, repair allied constructs (by clicking on them), \
use magic missile, repair allied constructs, shades, and yourself (by clicking on them), \
<i>and, most important of all,</i> create new constructs by producing soulstones to capture souls, \
and shells to place those soulstones into.</b>"
/mob/living/simple_animal/hostile/construct/builder/Found(atom/A) //what have we found here?
if(istype(A, /mob/living/simple_animal/hostile/construct)) //is it a construct?
if(isconstruct(A)) //is it a construct?
var/mob/living/simple_animal/hostile/construct/C = A
if(C.health < C.maxHealth) //is it hurt? let's go heal it if it is
return 1
@@ -207,7 +205,7 @@
..()
if(isliving(target))
var/mob/living/L = target
if(istype(L, /mob/living/simple_animal/hostile/construct) && L.health >= L.maxHealth) //is this target an unhurt construct? stop trying to heal it
if(isconstruct(L) && L.health >= L.maxHealth) //is this target an unhurt construct? stop trying to heal it
LoseTarget()
return 0
if(L.health <= melee_damage_lower+melee_damage_upper) //ey bucko you're hurt as fuck let's go hit you
@@ -216,7 +214,7 @@
/mob/living/simple_animal/hostile/construct/builder/Aggro()
..()
if(istype(target, /mob/living/simple_animal/hostile/construct)) //oh the target is a construct no need to flee
if(isconstruct(target)) //oh the target is a construct no need to flee
retreat_distance = null
minimum_distance = 1
@@ -229,11 +227,6 @@
AIStatus = AI_ON
environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
/////////////////////////////Non-cult Artificer/////////////////////////
/mob/living/simple_animal/hostile/construct/builder/noncult
construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/wall,
@@ -43,6 +43,7 @@
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
staticOverlays = list()
hud_possible = list(DIAG_STAT_HUD, DIAG_HUD, ANTAG_HUD)
unique_name = TRUE
var/staticChoice = "static"
var/list/staticChoices = list("static", "blank", "letter", "animal")
var/picked = FALSE //Have we picked our visual appearence (+ colour if applicable)
@@ -64,10 +65,7 @@
var/datum/personal_crafting/handcrafting
/mob/living/simple_animal/drone/New()
..()
if(name != initial(name))
name = name + " ([rand(100,999)])"
real_name = name
. = ..()
access_card = new /obj/item/weapon/card/id(src)
var/datum/job/captain/C = new /datum/job/captain
@@ -54,6 +54,17 @@
..()
desc += " This drone appears to have a complex holoprojector built on its 'head'."
/mob/living/simple_animal/drone/snowflake/bardrone
name = "Bardrone"
desc = "A barkeeping drone, an indestructible robot built to tend bars."
seeStatic = FALSE
laws = "1. Serve drinks.\n\
2. Talk to patrons.\n\
3. Don't get messed up in their affairs."
languages = ALL
status_flags = GODMODE // Please don't punch the barkeeper
unique_name = FALSE // disables the (123) number suffix
/obj/item/drone_shell/syndrone
name = "syndrone shell"
desc = "A shell of a syndrone, a modified maintenance drone designed to infiltrate and annihilate."
@@ -61,7 +61,7 @@
if(ishuman(user))
if(stat == DEAD)
if(stat == DEAD || status_flags & GODMODE)
..()
return
if(user.get_active_hand())
@@ -12,6 +12,7 @@
icon = 'icons/mob/lavaland/dragon.dmi'
faction = list("mining")
speak_emote = list("roars")
luminosity = 3
armour_penetration = 40
melee_damage_lower = 40
melee_damage_upper = 40
@@ -28,6 +29,7 @@
var/anger_modifier = 0
var/obj/item/device/gps/internal
var/swooping = 0
var/swoop_cooldown = 0
deathmessage = "collapes into a pile of bones, it's flesh sloughing away."
death_sound = 'sound/magic/demon_dies.ogg'
damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
@@ -41,6 +43,13 @@
return
else
..()
if(isliving(target))
var/mob/living/L = target
if(L.stat == DEAD)
L.gib()
visible_message("<span class='danger'>[src] devours [L]!</span>")
src << "<span class='userdanger'>You feast on [L], restoring your health!</span>"
adjustBruteLoss(-L.maxHealth)
/mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0)
return 1
@@ -51,16 +60,27 @@
name = "fireball"
desc = "Get out of the way!"
layer = 6
dir = SOUTH
randomdir = 0
duration = 10
pixel_z = 500
anchored = 1
/obj/effect/overlay/temp/target
icon = 'icons/mob/actions.dmi'
icon_state = "sniper_zoom"
layer = MOB_LAYER - 0.1
anchored = 1
luminosity = 2
duration = 10
/obj/effect/overlay/temp/dragon_swoop
name = "certain death"
desc = "Don't just stand there, move!"
icon = 'icons/effects/96x96.dmi'
icon_state = "rune_large"
layer = MOB_LAYER - 0.1
pixel_x = -32
pixel_y = -32
color = "#FF0000"
duration = 10
/obj/effect/overlay/temp/target/ex_act()
return
@@ -81,8 +101,8 @@
anger_modifier = Clamp(((maxHealth - health)/50),0,20)
ranged_cooldown = world.time + ranged_cooldown_time
if(prob(15 + anger_modifier))
if(health < maxHealth/2 && !client)
if(prob(15 + anger_modifier) && !client)
if(health < maxHealth/2)
swoop_attack(1)
else
fire_rain()
@@ -103,33 +123,36 @@
if(prob(10))
new /obj/effect/overlay/temp/target(turf)
/mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_walls()
var/list/attack_dirs = list(NORTH,EAST,SOUTH,WEST)
if(prob(50))
attack_dirs = list(NORTH,WEST,SOUTH,EAST)
playsound(get_turf(src),'sound/magic/Fireball.ogg', 200, 1)
spawn(0)
for(var/d in attack_dirs)
for(var/d in attack_dirs)
spawn(0)
var/turf/E = get_edge_target_turf(src, d)
var/range = 10
for(var/turf/open/J in getline(src,E))
if(!range)
break
range--
PoolOrNew(/obj/effect/hotspot,J)
J.hotspot_expose(700,50,1)
for(var/mob/living/L in J)
if(L != src)
L.adjustFireLoss(20)
L << "<span class='danger'>You're hit by the drake's fire breath!</span>"
sleep(1)
/mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(fire_rain = 0)
/mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(fire_rain = 0, atom/movable/manual_target)
if(stat)
return
var/mob/living/swoop_target = target
var/swoop_target
if(manual_target)
swoop_target = manual_target
else
swoop_target = target
stop_automated_movement = TRUE
swooping = 1
icon_state = "swoop"
@@ -150,9 +173,10 @@
else
tturf = get_turf(src)
src.loc = tturf
new/obj/effect/overlay/temp/dragon_swoop(tturf)
animate(src, pixel_x = 0, pixel_z = 0, time = 10)
sleep(10)
playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1)
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1)
for(var/mob/living/L in range(1,tturf))
if(L == src)
continue
@@ -170,6 +194,19 @@
stop_automated_movement = FALSE
swooping = 0
density = 1
swoop_cooldown = world.time + 200
/mob/living/simple_animal/hostile/megafauna/dragon/AltClickOn(atom/movable/A)
if(!istype(A))
return
if(swoop_cooldown >= world.time)
src << "You need to wait 20 seconds between swoop attacks!"
return
swoop_attack(1, A)
/obj/item/device/gps/internal/dragon
icon_state = null
@@ -228,8 +265,8 @@
/mob/living/simple_animal/hostile/megafauna/dragon/lesser
name = "lesser ash drake"
maxHealth = 500
health = 500
maxHealth = 750
health = 750
melee_damage_upper = 30
melee_damage_lower = 30
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
@@ -248,21 +285,15 @@
return
var/mob/living/carbon/human/H = user
var/random = rand(1,5)
var/random = rand(1,3)
switch(random)
if(1)
user << "<span class='danger'>The blood sears your insides! What the hell were you thinking?</span>"
user.reagents.add_reagent("hellwater", 50)
if(2)
user << "<span class='danger'>Other than tasting terrible, nothing really happens.</span>"
if(3)
if(2)
user << "<span class='danger'>Your flesh begins to melt! Miraculously, you seem fine otherwise.</span>"
H.set_species(/datum/species/skeleton)
if(4)
user << "<span class='danger'>The blood mixes with your own, filling your veins with a pulsing fire.</span>"
H.dna.species.coldmod = 0
if(5)
if(3)
user << "<span class='danger'>You don't feel so good...</span>"
H.ForceContractDisease(new /datum/disease/transformation/dragon(0))
playsound(user.loc,'sound/items/drink.ogg', rand(10,50), 1)
@@ -318,15 +349,11 @@
/obj/structure/closet/crate/necropolis/dragon/New()
..()
var/loot = rand(1,4)
var/loot = rand(1,3)
switch(loot)
if(1)
for(var/i in 1 to 10)
new /obj/item/weapon/ore/diamond(src)
new /obj/item/weapon/ore/gold(src)
if(2)
new /obj/item/weapon/melee/ghost_sword(src)
if(3)
if(2)
new /obj/item/weapon/dragons_blood(src)
if(4)
if(3)
new /obj/item/weapon/lava_staff(src)
@@ -3,6 +3,7 @@
desc = "Attack the weak point for massive damage."
health = 1000
maxHealth = 1000
a_intent = "harm"
sentience_type = SENTIENCE_BOSS
environment_smash = 4
robust_searching = 1
+18 -7
View File
@@ -26,16 +26,28 @@
faction = list("cult")
status_flags = CANPUSH
flying = 1
loot = list(/obj/item/weapon/ectoplasm)
del_on_death = 1
/mob/living/simple_animal/shade/death()
..(1)
new /obj/item/weapon/ectoplasm (src.loc)
visible_message("<span class='warning'>[src] lets out a contented sigh as their form unwinds.</span>")
ghostize()
qdel(src)
return
deathmessage = "<span class='warning'>[src] lets out a contented sigh as their form unwinds.</span>"
..()
/mob/living/simple_animal/shade/Process_Spacemove(movement_dir = 0)
return TRUE //this doesn't make much sense; you'd thing TRUE would mean it'd process spacemove but it means it doesn't
/mob/living/simple_animal/shade/attack_animal(mob/living/simple_animal/M)
if(istype(M, /mob/living/simple_animal/hostile/construct/builder))
if(health < maxHealth)
adjustHealth(-25)
Beam(M,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=4)
M.visible_message("<span class='danger'>[M] heals \the <b>[src]</b>.</span>", \
"<span class='cult'>You heal <b>[src]</b>, leaving <b>[src]</b> at <b>[health]/[maxHealth]</b> health.</span>")
else
M << "<span class='cult'>You cannot heal <b>[src]</b>, as it is unharmed!</span>"
else if(src != M)
..()
/mob/living/simple_animal/shade/attackby(obj/item/O, mob/user, params) //Marker -Agouri
if(istype(O, /obj/item/device/soulstone))
@@ -43,4 +55,3 @@
SS.transfer_soul("SHADE", src, user)
else
..()
return
+1 -1
View File
@@ -23,7 +23,7 @@
qdel(src)
return -1
target = nOwner.mind
update_text(nOwner)
update_text()
/obj/item/weapon/paper/contract/employment/update_text()
+1 -1
View File
@@ -67,7 +67,7 @@
var/copy_as_paper = 1
if(istype(copy, /obj/item/weapon/paper/contract/employment))
var/obj/item/weapon/paper/contract/employment/E = copy
var/obj/item/weapon/paper/contract/employment/C = new /obj/item/weapon/paper/contract/employment (loc, E.target)
var/obj/item/weapon/paper/contract/employment/C = new /obj/item/weapon/paper/contract/employment (loc, E.target.current)
if(C)
copy_as_paper = 0
if(copy_as_paper)
+23 -13
View File
@@ -72,25 +72,35 @@
// Syndicate stamp to forge documents.
/obj/item/weapon/stamp/chameleon
actions_types = list(/datum/action/item_action/toggle)
/obj/item/weapon/stamp/chameleon/attack_self(mob/user)
var/list/stamp_types = typesof(/obj/item/weapon/stamp) - src.type // Get all stamp types except our own
var/list/stamps = list()
var/list/stamp_names = list()
// Generate them into a list
for(var/stamp_type in stamp_types)
var/obj/item/weapon/stamp/S = new stamp_type
stamps[capitalize(S.name)] = S
for(var/i in stamp_types)
var/obj/item/weapon/stamp/stamp_type = i
stamp_names += initial(stamp_type.name)
var/list/show_stamps = list("EXIT" = null) + sortList(stamps) // the list that will be shown to the user to pick from
stamp_names = sortList(stamp_names)
// the list that will be shown to the user to pick from
world << jointext(stamp_names, ",")
var/input_stamp = input(user, "Choose a stamp to disguise as.", "Choose a stamp.") in show_stamps
var/input_stamp = input(user, "Choose a stamp to disguise as.",
"Choose a stamp.") as null|anything in stamp_names
world << input_stamp
if(user && src in user.contents)
if(user && (src in user.contents) && input_stamp)
var/obj/item/weapon/stamp/stamp_type
for(var/i in stamp_types)
stamp_type = i
if(initial(stamp_type.name) == input_stamp)
break
world << stamp_type
var/obj/item/weapon/stamp/chosen_stamp = stamps[capitalize(input_stamp)]
if(chosen_stamp)
name = chosen_stamp.name
icon_state = chosen_stamp.icon_state
item_color = chosen_stamp.item_color
name = initial(stamp_type.name)
icon_state = initial(stamp_type.icon_state)
item_color = initial(stamp_type.item_color)
@@ -289,24 +289,41 @@
if (modified)
icon_state = "foamdart_empty"
desc = "Its nerf or nothing! ... Although, this one doesn't look too safe."
if(BB)
BB.icon_state = "foamdart_empty"
else
icon_state = "foamdart"
desc = "Its nerf or nothing! Ages 8 and up."
if(BB)
BB.icon_state = "foamdart_empty"
/obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params)
..()
var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
if (istype(A, /obj/item/weapon/screwdriver) && !modified)
modified = 1
BB.damage_type = BRUTE
icon_state = "foamdart_empty"
desc = "Its nerf or nothing! ... Although, this one doesn't look too safe."
user << "<span class='notice'>You pop the safety cap off of [src].</span>"
else if ((istype(A, /obj/item/weapon/pen)) && modified && !BB.contents.len)
FD.damage_type = BRUTE
update_icon()
else if ((istype(A, /obj/item/weapon/pen)) && modified && !FD.pen)
if(!user.unEquip(A))
return
A.loc = BB
BB.damage = 5
BB.nodamage = 0
A.loc = FD
FD.pen = A
FD.damage = 5
FD.nodamage = 0
user << "<span class='notice'>You insert [A] into [src].</span>"
return
/obj/item/ammo_casing/caseless/foam_dart/attack_self(mob/living/user)
var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
if(FD.pen)
FD.damage = initial(FD.damage)
FD.nodamage = initial(FD.nodamage)
user.put_in_hands(FD.pen)
user << "<span class='notice'>You remove [FD.pen] from [src].</span>"
FD.pen = null
/obj/item/ammo_casing/caseless/foam_dart/riot
name = "riot foam dart"
desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up."
+1
View File
@@ -37,6 +37,7 @@
var/turf/curloc = user.loc
if (!istype(targloc) || !istype(curloc) || !BB)
return 0
BB.ammo_casing = src
if(targloc == curloc)
if(target) //if the target is right on our location we go straight to bullet_act()
target.bullet_act(BB, BB.def_zone)
-8
View File
@@ -1,11 +1,3 @@
#define SAWN_INTACT 0
#define SAWN_OFF 1
#define SAWN_SAWING -1
#define WEAPON_LIGHT 0
#define WEAPON_MEDIUM 1
#define WEAPON_HEAVY 2
/obj/item/weapon/gun
name = "gun"
desc = "It's a gun. It's pretty terrible, though."
+4 -1
View File
@@ -87,6 +87,9 @@
/obj/item/weapon/gun/magic/wand/resurrection/zap_self(mob/living/user)
user.revive(full_heal = 1)
if(iscarbon(user))
var/mob/living/carbon/C = user
C.regenerate_limbs()
user << "<span class='notice'>You feel great!</span>"
charges--
..()
@@ -162,4 +165,4 @@
/obj/item/weapon/gun/magic/wand/fireball/zap_self(mob/living/user)
explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2)
charges--
..()
..()
+2
View File
@@ -103,6 +103,8 @@
return
/obj/item/weapon/gun/medbeam/proc/on_beam_tick(var/mob/living/target)
if(target.health != target.maxHealth)
PoolOrNew(/obj/effect/overlay/temp/heal, list(get_turf(target), "#80F5FF"))
target.adjustBruteLoss(-4)
target.adjustFireLoss(-4)
return
+1 -2
View File
@@ -211,8 +211,7 @@
suit_requirement = /obj/item/clothing/suit/bluetag
tagcolor = "blue"
/obj/item/device/firing_pin/Destroy()
if(gun)
gun.pin = null
return ..()
return ..()
+6
View File
@@ -10,6 +10,7 @@
pressure_resistance = INFINITY
var/def_zone = "" //Aiming at
var/mob/firer = null//Who shot it
var/obj/item/ammo_casing/ammo_casing = null
var/suppressed = 0 //Attack message
var/yo = null
var/xo = null
@@ -139,3 +140,8 @@
..()
if(isliving(AM) && AM.density && !checkpass(PASSMOB))
Bump(AM, 1)
/obj/item/projectile/Destroy()
if(ammo_casing)
qdel(ammo_casing)
return ..()
@@ -57,6 +57,9 @@
if(target.hellbound)
return
if(ismob(target))
if(iscarbon(target))
var/mob/living/carbon/C = target
C.regenerate_limbs()
if(target.revive(full_heal = 1))
if(!target.ckey)
for(var/mob/dead/observer/ghost in player_list)
+33 -14
View File
@@ -1,26 +1,22 @@
/obj/item/projectile/bullet/reusable
name = "reusable bullet"
desc = "How do you even reuse a bullet?"
var/obj/item/ammo_casing/caseless/ammo_type = /obj/item/ammo_casing/caseless/
var/ammo_type = /obj/item/ammo_casing/caseless/
var/dropped = 0
/obj/item/projectile/bullet/reusable/on_hit(atom/target, blocked = 0)
. = ..()
if (src.contents.len)
var/obj/content
for(content in src.contents)
content.loc = src.loc
else
new ammo_type(src.loc)
handle_drop()
/obj/item/projectile/bullet/reusable/on_range()
if (src.contents.len)
var/obj/content
for(content in src.contents)
content.loc = src.loc
else
new ammo_type(src.loc)
handle_drop()
..()
/obj/item/projectile/bullet/reusable/proc/handle_drop()
if(!dropped)
new ammo_type(src.loc)
dropped = 1
/obj/item/projectile/bullet/reusable/magspear
name = "magnetic spear"
desc = "WHITE WHALE, HOLY GRAIL"
@@ -38,9 +34,32 @@
icon_state = "foamdart"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart
range = 10
var/obj/item/weapon/pen/pen = null
/obj/item/projectile/bullet/reusable/foam_dart/handle_drop()
if(dropped)
return
dropped = 1
var/obj/item/ammo_casing/caseless/foam_dart/newdart = new ammo_type(src.loc)
var/obj/item/ammo_casing/caseless/foam_dart/old_dart = ammo_casing
newdart.modified = old_dart.modified
if(pen)
var/obj/item/projectile/bullet/reusable/foam_dart/newdart_FD = newdart.BB
newdart_FD.pen = pen
pen.loc = newdart_FD
pen = null
newdart.BB.damage = damage
newdart.BB.nodamage = nodamage
newdart.BB.damage_type = damage_type
newdart.update_icon()
/obj/item/projectile/bullet/reusable/foam_dart/Destroy()
if(pen)
qdel(pen)
return ..()
/obj/item/projectile/bullet/reusable/foam_dart/riot
name = "riot foam dart"
icon_state = "foamdart_riot"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
stamina = 25
stamina = 25
@@ -120,3 +120,11 @@
volume = 60
amount_per_transfer_from_this = 30
list_reagents = list("atropine" = 10, "epinephrine" = 10, "salbutamol" = 20, "spaceacillin" = 20)
/obj/item/weapon/reagent_containers/hypospray/medipen/survival
name = "survival medipen"
desc = "A medipen for surviving in the harshest of environments, heals and protects from environmental hazards. "
icon_state = "stimpen"
volume = 80
amount_per_transfer_from_this = 80
list_reagents = list("salbutamol" = 10, "coffee" = 20, "leporazine" = 20, "tricordrazine" = 15, "epinephrine" = 10, "omnizine" = 5)
+10
View File
@@ -177,6 +177,16 @@ other types of metals and chemistry for reagents).
build_path = /obj/item/weapon/pickaxe/drill/jackhammer
category = list("Mining Designs")
/datum/design/modkit
name = "Modification Kit"
desc = "A device which allows kinetic accelerators to be wielded with one hand, and by any organism."
id = "modkit"
req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_GOLD = 1500, MAT_URANIUM = 1000)
build_path = /obj/item/modkit
category = list("Mining Designs")
/datum/design/superaccelerator
name = "Super-Kinetic Accelerator"
desc = "An upgraded version of the proto-kinetic accelerator, with superior damage, speed and range."
@@ -111,6 +111,8 @@
S.loc = remote_eye.loc
S.visible_message("[S] warps in!")
X.stored_slimes -= S
else
owner << "<span class='notice'>Target is not near a camera. Cannot proceed.</span>"
/datum/action/innate/slime_pick_up
name = "Pick up Slime"
@@ -133,6 +135,8 @@
S.visible_message("[S] vanishes in a flash of light!")
S.loc = X
X.stored_slimes += S
else
owner << "<span class='notice'>Target is not near a camera. Cannot proceed.</span>"
/datum/action/innate/feed_slime
@@ -152,6 +156,8 @@
food.LAssailant = C
X.monkeys --
owner << "[X] now has [X.monkeys] monkeys left."
else
owner << "<span class='notice'>Target is not near a camera. Cannot proceed.</span>"
/datum/action/innate/monkey_recycle
@@ -171,3 +177,5 @@
M.visible_message("[M] vanishes as they are reclaimed for recycling!")
X.monkeys = round(X.monkeys + 0.2,0.1)
qdel(M)
else
owner << "<span class='notice'>Target is not near a camera. Cannot proceed.</span>"
+3 -2
View File
@@ -17,16 +17,17 @@
//Areas
/area/ruin/unpowered/no_grav/way_home
name = "\improper Salvation"
icon_state = "away"
/area/ruin/powered/snow_biodome
/area/ruin/powered/golem_ship
name = "Free Golem Ship"
// Ruins of "onehalf" ship
/area/ruin/onehalf/hallway
+4 -4
View File
@@ -284,7 +284,7 @@
/obj/item/bodypart/l_arm
name = "left arm"
icon_state = "l_arm"
max_damage = 60
max_damage = 50
body_zone ="l_arm"
body_part = ARM_LEFT
px_x = -6
@@ -293,7 +293,7 @@
/obj/item/bodypart/r_arm
name = "right arm"
icon_state = "r_arm"
max_damage = 60
max_damage = 50
body_zone = "r_arm"
body_part = ARM_RIGHT
px_x = 6
@@ -302,7 +302,7 @@
/obj/item/bodypart/l_leg
name = "left leg"
icon_state = "l_leg"
max_damage = 60
max_damage = 50
body_zone = "l_leg"
body_part = LEG_LEFT
px_x = -2
@@ -311,7 +311,7 @@
/obj/item/bodypart/r_leg
name = "right leg"
icon_state = "r_leg"
max_damage = 60
max_damage = 50
body_zone = "r_leg"
body_part = LEG_RIGHT
px_x = 2
@@ -314,7 +314,7 @@
/obj/item/organ/tongue/abductor/TongueSpeech(var/message)
//Hacks
var/mob/living/carbon/human/user = usr
var/rendered = "<i><font color=#800080><b>[user.name]:</b> [message]</font></i>"
var/rendered = "<span class='abductor'><b>[user.name]:</b> [message]</span>"
for(var/mob/living/carbon/human/H in living_mob_list)
var/obj/item/organ/tongue/T = H.getorganslot("tongue")
if(!T || T.type != type)
+6 -1
View File
@@ -104,4 +104,9 @@ var/list/GPS_list = list()
flags = ABSTRACT
gpstag = "Eerie Signal"
desc = "Report to a coder immediately."
invisibility = INVISIBILITY_MAXIMUM
invisibility = INVISIBILITY_MAXIMUM
/obj/item/device/gps/mining/internal
icon_state = "gps-m"
gpstag = "MINER"
desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life."