Merge branch 'master' of https://github.com/tgstation/-tg-station into miningpoints

This commit is contained in:
Ergovisavi
2014-01-30 16:37:37 -08:00
103 changed files with 1470 additions and 553 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
/tg/station 13 v1.0 - 6 October 2010 [![Build Status](http://hibernia.fallemmc.com:8090/job/tgstation/badge/icon)](http://hibernia.fallemmc.com:8090/job/tgstation/)
/tg/station 13 v1.0 - 6 October 2010 [![Build Status](https://travis-ci.org/tgstation/-tg-station.png)](https://travis-ci.org/tgstation/-tg-station)
Website: http://ss13.eu
+3 -3
View File
@@ -6415,7 +6415,7 @@
"cts" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 9},/area/syndicate_mothership)
"ctt" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/syndicate_mothership)
"ctu" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"ctv" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/beer{pixel_x = 3},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"ctv" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/beer{pixel_x = 5; pixel_y = -2; step_x = 0},/obj/item/toy/cards/deck/syndicate{icon_state = "deck_syndicate_full"; pixel_x = -6; pixel_y = 6},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"ctw" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (WEST)"; icon_state = "podhatch"; dir = 8},/area/syndicate_mothership)
"ctx" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/syndicate_mothership)
"cty" = (/turf/unsimulated/floor,/area/syndicate_mothership)
@@ -8251,8 +8251,8 @@
"dcU" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/closet/crate/internals,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/simulated/floor{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"dcV" = (/obj/structure/rack{dir = 1},/obj/item/clothing/glasses/meson,/obj/item/device/flashlight,/obj/item/weapon/storage/bag/ore,/obj/machinery/atmospherics/pipe/simple{dir = 9},/obj/item/weapon/shovel{attack_verb = list("ineffectively hit"); desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon."; force = 1; name = "safety shovel"; pixel_x = -5; throwforce = 1},/obj/item/weapon/pickaxe{attack_verb = list("ineffectively hit"); desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon."; force = 1; name = "safety pickaxe"; pixel_x = 5; throwforce = 1},/turf/simulated/floor{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"dcW" = (/obj/structure/rack{dir = 1},/obj/item/clothing/glasses/meson,/obj/item/device/flashlight,/obj/item/weapon/storage/bag/ore,/obj/machinery/atmospherics/pipe/simple{dir = 9},/obj/item/weapon/shovel{attack_verb = list("ineffectively hit"); desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon."; force = 1; name = "safety shovel"; pixel_x = -5; throwforce = 1},/obj/item/weapon/pickaxe{attack_verb = list("ineffectively hit"); desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon."; force = 1; name = "safety pickaxe"; pixel_x = 5; throwforce = 1},/obj/machinery/camera{c_tag = "Labor Camp Storage"; dir = 8; network = list("Labor")},/turf/simulated/floor{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"dcX" = (/obj/structure/table,/obj/item/toy/cards,/turf/simulated/floor,/area/security/prison)
"dcY" = (/obj/structure/table/woodentable,/obj/item/toy/cards,/turf/simulated/floor,/area/crew_quarters/sleep)
"dcX" = (/obj/structure/table,/obj/item/toy/cards/deck,/turf/simulated/floor,/area/security/prison)
"dcY" = (/obj/structure/table/woodentable,/obj/item/toy/cards/deck,/turf/simulated/floor,/area/crew_quarters/sleep)
"dcZ" = (/obj/item/weapon/shard,/obj/item/weapon/module/power_control,/turf/simulated/floor/plating/airless,/area/AIsattele)
"dda" = (/obj/structure/computerframe,/turf/simulated/floor/plating/airless,/area/AIsattele)
"ddb" = (/obj/machinery/teleport/station,/turf/simulated/floor/plating/airless,/area/AIsattele)
+1 -1
View File
@@ -3,7 +3,7 @@
#include "map_files\tgstation.2.1.2.dmm"
#define MAP_FILE "tgstation.2.1.2.dmm"
#define MAP_NAME "/tg/station 2"
#define MAP_NAME "TGstation 2"
#elif !defined(MAP_OVERRIDE)
+1 -1
View File
@@ -7,7 +7,7 @@
/atom/proc/attackby(obj/item/W, mob/user)
return
/atom/movable/attackby(obj/item/W, mob/user)
if(!(W.flags&NOBLUDGEON))
if(W && !(W.flags&NOBLUDGEON))
visible_message("<span class='danger'>[src] has been hit by [user] with [W].</span>")
/mob/living/attackby(obj/item/I, mob/user)
+33
View File
@@ -265,6 +265,7 @@ client
if(isobj(D))
body += "<option value='?_src_=vars;delall=\ref[D]'>Delete all of type</option>"
if(isobj(D) || ismob(D) || isturf(D))
body += "<option value='?_src_=vars;addreagent=\ref[D]'>Add reagent</option>"
body += "<option value='?_src_=vars;explode=\ref[D]'>Trigger explosion</option>"
body += "<option value='?_src_=vars;emp=\ref[D]'>Trigger EM pulse</option>"
@@ -634,6 +635,38 @@ client
log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
else if(href_list["addreagent"])
if(!check_rights(0)) return
var/atom/A = locate(href_list["addreagent"])
if(!A.reagents)
var/amount = input(usr, "Specify the reagent size of [A]", "Set Reagent Size", 50) as num
if(amount)
A.create_reagents(amount)
if(A.reagents)
var/list/reagent_options = list()
for(var/r_id in chemical_reagents_list)
var/datum/reagent/R = chemical_reagents_list[r_id]
reagent_options[R.name] = r_id
if(reagent_options.len)
reagent_options = sortAssoc(reagent_options)
reagent_options.Insert(1, "CANCEL")
var/chosen = input(usr, "Choose a reagent to add.", "Choose a reagent.") in reagent_options
var/chosen_id = reagent_options[chosen]
if(chosen_id)
var/amount = input(usr, "Choose the amount to add.", "Choose the amount.", A.reagents.maximum_volume) as num
if(amount)
A.reagents.add_reagent(chosen_id, amount)
log_admin("[key_name(usr)] has added [amount] units of [chosen] to \the [A]")
message_admins("\blue [key_name(usr)] has added [amount] units of [chosen] to \the [A]")
href_list["datumrefresh"] = href_list["addreagent"]
else if(href_list["explode"])
if(!check_rights(R_FUN)) return
+8
View File
@@ -447,6 +447,14 @@ var/list/uplink_items = list()
cost = 10
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/badass/syndiecards
name = "Syndicate Playing Cards"
desc = "A special deck of space-grade playing cards with a mono-molecular edge and metal reinforcement, making them lethal weapons both when wielded as a blade and when thrown. \
You can also play card games with them."
item = /obj/item/toy/cards/deck/syndicate
cost = 1
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/badass/balloon
name = "For showing that you are The Boss"
desc = "A useless red balloon with the syndicate logo on it, which can blow the deepest of covers."
+8
View File
@@ -280,6 +280,12 @@ var/list/blood_splatter_icons = list()
overlays += blood_splatter_icon
return 1 //we applied blood to the item
/obj/item/clothing/gloves/add_blood(mob/living/carbon/M)
if(..() == 0) return 0
transfer_blood = rand(2, 4)
bloody_hands_mob = M
return 1
/turf/simulated/add_blood(mob/living/carbon/M)
if(..() == 0) return 0
@@ -291,6 +297,8 @@ var/list/blood_splatter_icons = list()
/mob/living/carbon/human/add_blood(mob/living/carbon/M)
if(..() == 0) return 0
add_blood_list(M)
bloody_hands = rand(2, 4)
bloody_hands_mob = M
update_inv_gloves() //handles bloody hands overlays and updating
return 1 //we applied blood to the item
+1 -1
View File
@@ -94,7 +94,7 @@
domutcheck(owner)
check_dna_integrity(owner)
return owner.dna
return
/proc/check_dna_integrity(mob/living/carbon/character)
if(!(istype(character, /mob/living/carbon/human) || istype(character, /mob/living/carbon/monkey))) //Evict xenos from carbon 2012
+34
View File
@@ -45,6 +45,7 @@
attacktext = "hits"
attack_sound = 'sound/weapons/genhit1.ogg'
var/obj/effect/blob/factory/factory = null
var/is_zombie = 0
faction = "blob"
min_oxy = 0
max_oxy = 0
@@ -75,6 +76,36 @@
factory.spores += src
..()
/mob/living/simple_animal/hostile/blobspore/Life()
if(!is_zombie)
for(var/mob/living/carbon/human/H in ListTargets(0)) //Only for people in the same tile
if(H.stat == DEAD)
Zombify(H)
break
..()
/mob/living/simple_animal/hostile/blobspore/proc/Zombify(var/mob/living/carbon/human/H)
if(H.wear_suit)
var/obj/item/clothing/suit/armor/A = H.wear_suit
if(A.armor && A.armor["melee"])
maxHealth += A.armor["melee"] //That zombie's got armor, I want armor!
maxHealth += 40
health = maxHealth
name = "blob zombie"
desc = "A shambling corpse animated by the blob."
melee_damage_lower = 10
melee_damage_upper = 15
icon = H.icon
icon_state = "husk_s"
H.hair_style = null
H.update_hair()
overlays = H.overlays
overlays += image('icons/mob/blob.dmi', icon_state = "blob_head")
H.loc = src
is_zombie = 1
loc.visible_message("<span class='warning'> The corpse of [H.name] suddenly rises!</span>")
/mob/living/simple_animal/hostile/blobspore/Die()
// On death, create a small smoke of harmful gas (s-Acid)
var/datum/effect/effect/system/chem_smoke_spread/S = new
@@ -94,4 +125,7 @@
/mob/living/simple_animal/hostile/blobspore/Del()
if(factory)
factory.spores -= src
if(contents)
for(var/mob/M in contents)
M.loc = src.loc
..()
@@ -0,0 +1,49 @@
//This only contains the arm blade for now because I'm a lazy fuck. Yers truely, Miauw, resident lazy fuck.
/obj/item/weapon/melee/arm_blade
name = "arm blade"
desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter"
icon = 'icons/obj/weapons.dmi'
icon_state = "arm_blade"
item_state = "arm_blade"
flags = ABSTRACT
w_class = 5.0
force = 25
throwforce = 0 //Just to be on the safe side
throw_range = 0
throw_speed = 0
/obj/item/weapon/melee/arm_blade/New()
..()
loc.visible_message("<span class='warning'>A grotesque blade forms around [name]\'s arm!</span>", "<span class='warning'>Our arm twists and mutates, transforming it into a deadly blade.</span>", "<span class='warning'>You hear organic matter ripping and tearing!</span>")
/obj/item/weapon/melee/arm_blade/dropped(mob/user)
visible_message("<span class='warning'>With a sickening crunch, [user] reforms his blade into an arm!</span>", "<span class='notice'>We assimilate our blade into our body</span>", "<span class='warning>You hear organic matter ripping and tearing!</span>")
del src
/obj/item/weapon/melee/arm_blade/afterattack(atom/target, mob/user, proximity)
if(istype(target, /obj/structure/table))
var/obj/structure/table/T = target
T.table_destroy(1, user)
else if(istype(target, /obj/machinery/computer))
var/obj/machinery/computer/C = target
C.attack_alien(user) //muh copypasta
else if(istype(target, /obj/machinery/door/airlock))
var/obj/machinery/door/airlock/A = target
if(!A.requiresID() || A.allowed(user)) //This is to prevent stupid shit like hitting a door with an arm blade, the door opening because you have acces and still getting a "the airlocks motors resist our efforts to force it" message.
return
if(A.arePowerSystemsOn() && !(A.stat & NOPOWER))
user << "<span class='notice'>The airlock's motors resist our efforts to force it.</span>"
return
else if(A.locked)
user << "<span class='notice'>The airlock's bolts prevent it from being forced.</span>"
return
else
//user.say("Heeeeeeeeeerrre's Johnny!")
user.visible_message("<span class='warning'>[user] forces the door to open with \his [src]!</span>", "<span class='warning'>We force the door to open.</span>", "<span class='warning'>You hear a metal screeching sound.</span>")
A.open(1)
@@ -118,12 +118,17 @@
changeling.absorb_dna(T)
if(src.nutrition < 400) src.nutrition = min((src.nutrition + T.nutrition), 400)
if(T.mind && T.mind.changeling)//If the target was a changeling, suck out their extra juice and objective points!
changeling.chem_charges += min(T.mind.changeling.chem_charges, changeling.chem_storage)
changeling.absorbedcount += T.mind.changeling.absorbedcount
T.mind.changeling.absorbed_dna.len = 1
T.mind.changeling.absorbedcount = 0
if(T.mind)//if the victim has got a mind
T.mind.show_memory(src, 0) //I can read your mind, kekeke. Output all their notes.
if(T.mind.changeling)//If the target was a changeling, suck out their extra juice and objective points!
changeling.chem_charges += min(T.mind.changeling.chem_charges, changeling.chem_storage)
changeling.absorbedcount += T.mind.changeling.absorbedcount
T.mind.changeling.absorbed_dna.len = 1
T.mind.changeling.absorbedcount = 0
else
changeling.chem_charges += 10
@@ -156,8 +161,7 @@
changeling.chem_charges -= 5
changeling.geneticdamage = 3
src.dna = chosen_dna
src.real_name = chosen_dna.real_name
hardset_dna(src, chosen_dna.uni_identity, chosen_dna.struc_enzymes, chosen_dna.real_name, chosen_dna.mutantrace, chosen_dna.blood_type)
updateappearance(src)
domutcheck(src, null)
@@ -212,7 +216,7 @@
changeling.chem_charges -= 5
remove_changeling_powers()
src << "<span class='notice'>We transform our appearance.</span>"
dna = chosen_dna
hardset_dna(src, chosen_dna.uni_identity, chosen_dna.struc_enzymes, chosen_dna.real_name, chosen_dna.mutantrace, chosen_dna.blood_type)
var/mob/living/carbon/human/O = humanize((TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPSRC),chosen_dna.real_name)
@@ -529,9 +533,34 @@ var/list/datum/dna/hivemind_bank = list()
if(src && src.mind && src.mind.changeling)
src.mind.changeling.mimicing = ""
//////////
//STINGS// //They get a pretty header because there's just so fucking many of them ;_;
//////////
/mob/living/carbon/proc/changeling_arm_blade()
set category = "Changeling"
set name = "Arm Blade (20)"
if(istype(l_hand, /obj/item/weapon/melee/arm_blade)) //Not the nicest way to do it, but eh
u_equip(l_hand)
return
if(istype(r_hand, /obj/item/weapon/melee/arm_blade))
u_equip(r_hand)
return
var/datum/changeling/changeling = changeling_power(20)
if(!changeling)
return
drop_item(get_active_hand())
put_in_hands(new /obj/item/weapon/melee/arm_blade(src))
changeling.geneticdamage += 6
changeling.chem_charges -= 20
//////////
//STINGS// //They get a pretty header because there's just so fucking many of them ;_;
//////////
/mob/living/carbon/proc/set_sting(A, icon, dna=null) //setting the sting and ui icon for it
src << "<span class='notice'>We prepare our sting, use alt+click on target to sting them.</span>"
@@ -584,15 +613,13 @@ var/list/datum/dna/hivemind_bank = list()
/mob/living/carbon/proc/sting_effect_trasnform(mob/living/carbon/T)
if(!sting_can_reach(T, 40))
return 0
add_logs(src, T, "stung", object="transformation sting", addition="new identity is [src.mind.changeling.chosen_dna.real_name]")
add_logs(src, T, "stung", object="transformation sting", addition=" new identity is [src.mind.changeling.chosen_dna.real_name]")
if((HUSK in T.mutations) || !check_dna_integrity(T))
src << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
return 0
T.dna = src.mind.changeling.chosen_dna
T.real_name = src.mind.changeling.chosen_dna.real_name
var/datum/dna/NewDNA = src.mind.changeling.chosen_dna
hardset_dna(T, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.mutantrace, NewDNA.blood_type)
updateappearance(T)
domutcheck(T, null)
feedback_add_details("changeling_powers","TS")
return 1
@@ -680,4 +707,4 @@ var/list/datum/dna/hivemind_bank = list()
T.reagents.add_reagent("ice", 30)
feedback_add_details("changeling_powers","CS")
return 1
return 1
@@ -161,6 +161,13 @@ var/list/powerinstances
allowduringlesserform = 1
verbpath = /mob/living/carbon/proc/changeling_mute_sting
/datum/power/changeling/arm_blade
name = "Arm Blade"
desc = "We reform one of our arms into a deadly blade."
helptext = "Cannot be used while in lesser form."
genomecost = 1
allowduringlesserform = 0
verbpath = /mob/living/carbon/proc/changeling_arm_blade
// Modularchangling, totally stolen from the new player panel. YAYY
/datum/changeling/proc/EvolutionMenu()//The new one
+11 -5
View File
@@ -226,12 +226,18 @@ var/list/sacrificed = list()
seer()
if(usr.loc==src.loc)
usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium vivira. Itonis al'ra matum!")
if(usr.see_invisible!=0 && usr.see_invisible!=15)
usr << "\red The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision."
var/mob/living/carbon/human/user = usr
if(user.see_invisible!=25 || (istype(user) && user.glasses)) //check for non humans
user << "\red The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision."
else
usr << "\red The world beyond opens to your eyes."
usr.see_invisible = SEE_INVISIBLE_OBSERVER
usr.seer = 1
user << "\red The world beyond opens to your eyes."
var/see_temp = user.see_invisible
user.see_invisible = SEE_INVISIBLE_OBSERVER
user.seer = 1
while(user.loc==src.loc)
sleep(30)
user.seer = 0
user.see_invisible = see_temp
return
return fizzle()
+5
View File
@@ -158,6 +158,11 @@
A.blob_act()
del(src)
/obj/machinery/sleeper/attack_animal(var/mob/living/simple_animal/M)//Stop putting hostile mobs in things guise
if(M.environment_smash)
visible_message("<span class='danger'>[M.name] smashes [src] apart!</span>")
del(src)
return
/obj/machinery/sleeper/attackby(obj/item/I, mob/user)
if(!istype(I, /obj/item/weapon/grab))
@@ -261,7 +261,7 @@
T.temperature = 5000
T.hotspot_expose(50000,50000,1)
if(L.name=="Holocarp Spawn")
new /mob/living/simple_animal/hostile/carp(L.loc)
new /mob/living/simple_animal/hostile/carp/holocarp(L.loc)
/obj/machinery/computer/HolodeckControl/proc/emergencyShutdown()
+10
View File
@@ -13,10 +13,20 @@
/obj/machinery/computer/aifixer/attackby(I as obj, user as mob)
if(occupant && istype(I, /obj/item/weapon/screwdriver))
if(stat & (NOPOWER|BROKEN))
user << "<span class='warning'>The screws on [name]'s screen won't budge.</span>"
else
user << "<span class='warning'>The screws on [name]'s screen won't budge and it emits a warning beep.</span>"
return
if(istype(I, /obj/item/device/aicard))
var/obj/item/device/aicard/AIcard = I
if(stat & (NOPOWER|BROKEN))
if(occupant)
AIcard.transfer_ai("AIFIXER","AICARD",src,user)
overlays.Cut()
return
user << "This terminal isn't functioning right now, get it working!"
return
AIcard.transfer_ai("AIFIXER","AICARD",src,user)
+1 -1
View File
@@ -23,7 +23,7 @@
/obj/item/toy/prize/mauler = 1,
/obj/item/toy/prize/odysseus = 1,
/obj/item/toy/prize/phazon = 1,
/obj/item/toy/cards = 2,
/obj/item/toy/cards/deck = 2,
/obj/item/toy/nuke = 2
)
+1 -1
View File
@@ -487,7 +487,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
for(var/datum/feed_channel/F in news_network.network_channels)
if( (!F.locked || F.author == scanned_user) && !F.censored)
available_channels += F.channel_name
src.channel_name = strip_html(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels )
src.channel_name = strip_html_simple(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels )
src.updateUsrDialog()
else if(href_list["set_new_message"])
+11 -8
View File
@@ -1,14 +1,14 @@
/proc/gibs(atom/location, var/list/viruses, var/datum/dna/MobDNA)
new /obj/effect/gibspawner/generic(get_turf(location),viruses,MobDNA)
new /obj/effect/gibspawner/generic(location,viruses,MobDNA)
/proc/hgibs(atom/location, var/list/viruses, var/datum/dna/MobDNA)
new /obj/effect/gibspawner/human(get_turf(location),viruses,MobDNA)
new /obj/effect/gibspawner/human(location,viruses,MobDNA)
/proc/xgibs(atom/location, var/list/viruses)
new /obj/effect/gibspawner/xeno(get_turf(location),viruses)
new /obj/effect/gibspawner/xeno(location,viruses)
/proc/robogibs(atom/location, var/list/viruses)
new /obj/effect/gibspawner/robot(get_turf(location),viruses)
new /obj/effect/gibspawner/robot(location,viruses)
/obj/effect/gibspawner
var/sparks = 0 //whether sparks spread on Gib()
@@ -20,8 +20,7 @@
New(location, var/list/viruses, var/datum/dna/MobDNA)
..()
if(istype(loc,/turf)) //basically if a badmin spawns it
Gib(loc,viruses,MobDNA)
Gib(loc,viruses,MobDNA)
proc/Gib(atom/location, var/list/viruses = list(), var/datum/dna/MobDNA = null)
if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
@@ -43,6 +42,9 @@
for(var/j = 1, j<= gibamounts[i], j++)
var/gibType = gibtypes[i]
gib = new gibType(location)
if(istype(location,/mob/living/carbon))
var/mob/living/carbon/digester = location
digester.stomach_contents += gib
if(viruses.len > 0)
for(var/datum/disease/D in viruses)
@@ -59,7 +61,8 @@
else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey
gib.blood_DNA["Non-human DNA"] = "A+"
var/list/directions = gibdirections[i]
if(directions.len)
gib.streak(directions)
if(istype(loc,/turf))
if(directions.len)
gib.streak(directions)
del(src)
+4 -1
View File
@@ -7,6 +7,8 @@
var/burn_point = null
var/burning = null
var/hitsound = null
var/throwhitsound = null
var/throwtapsound = 'sound/weapons/throwtap.ogg'
var/w_class = 3.0
var/slot_flags = 0 //This is used to determine on which slots an item can fit.
pass_flags = PASSTABLE
@@ -556,4 +558,5 @@
/obj/item/clothing/gloves/clean_blood()
. = ..()
if(.)
transfer_blood = 0
transfer_blood = 0
bloody_hands_mob = null
+122 -60
View File
@@ -566,15 +566,34 @@
obj/item/toy/cards
name = "deck of cards"
desc = "A deck of space-grade playing cards."
icon = 'icons/obj/toy.dmi'
icon_state = "deck_full"
w_class = 2.0
var/list/cards = list()
var/parentdeck = null
var/deckstyle = "nanotrasen"
var/card_hitsound = null
var/card_force = 0
var/card_throwforce = 0
var/card_throw_speed = 4
var/card_throw_range = 20
var/list/card_attack_verb = list("attacked")
obj/item/toy/cards/New()
..()
obj/item/toy/cards/proc/apply_card_vars(obj/item/toy/cards/newobj, obj/item/toy/cards/sourceobj) // Applies variables for supporting multiple types of card deck
if(!istype(sourceobj))
return
obj/item/toy/cards/deck
name = "deck of cards"
desc = "A deck of space-grade playing cards."
icon = 'icons/obj/toy.dmi'
deckstyle = "nanotrasen"
icon_state = "deck_nanotrasen_full"
w_class = 2.0
var/list/cards = list()
obj/item/toy/cards/deck/New()
..()
icon_state = "deck_[deckstyle]_full"
for(var/i = 2; i <= 10; i++)
cards += "[i] of Hearts"
cards += "[i] of Spades"
@@ -598,33 +617,35 @@ obj/item/toy/cards/New()
cards += "Ace of Diamonds"
obj/item/toy/cards/attack_hand(mob/user as mob)
obj/item/toy/cards/deck/attack_hand(mob/user as mob)
var/choice = null
if(cards.len == 0)
src.icon_state = "deck_empty"
src.icon_state = "deck_[deckstyle]_empty"
user << "<span class='notice'>There are no more cards to draw.</span>"
return
var/obj/item/toy/singlecard/H = new/obj/item/toy/singlecard(user.loc)
var/obj/item/toy/cards/singlecard/H = new/obj/item/toy/cards/singlecard(user.loc)
choice = cards[1]
H.cardname = choice
H.parentdeck = src
var/O = src
H.apply_card_vars(H,O)
src.cards -= choice
H.pickup(user)
user.put_in_active_hand(H)
src.visible_message("<span class='notice'>[user] draws a card from the deck.</span>", "<span class='notice'>You draw a card from the deck.</span>")
if(cards.len > 26)
src.icon_state = "deck_full"
src.icon_state = "deck_[deckstyle]_full"
else if(cards.len > 10)
src.icon_state = "deck_half"
src.icon_state = "deck_[deckstyle]_half"
else if(cards.len > 1)
src.icon_state = "deck_low"
src.icon_state = "deck_[deckstyle]_low"
obj/item/toy/cards/attack_self(mob/user as mob)
obj/item/toy/cards/deck/attack_self(mob/user as mob)
cards = shuffle(cards)
playsound(user, 'sound/items/cardshuffle.ogg', 50, 1)
user.visible_message("<span class='notice'>[user] shuffles the deck.</span>", "<span class='notice'>You shuffle the deck.</span>")
obj/item/toy/cards/attackby(obj/item/toy/singlecard/C, mob/living/user)
obj/item/toy/cards/deck/attackby(obj/item/toy/cards/singlecard/C, mob/living/user)
..()
if(istype(C))
if(C.parentdeck == src)
@@ -635,14 +656,14 @@ obj/item/toy/cards/attackby(obj/item/toy/singlecard/C, mob/living/user)
else
user << "<span class='notice'>You can't mix cards from other decks.</span>"
if(cards.len > 26)
src.icon_state = "deck_full"
src.icon_state = "deck_[deckstyle]_full"
else if(cards.len > 10)
src.icon_state = "deck_half"
src.icon_state = "deck_[deckstyle]_half"
else if(cards.len > 1)
src.icon_state = "deck_low"
src.icon_state = "deck_[deckstyle]_low"
obj/item/toy/cards/attackby(obj/item/toy/cardhand/C, mob/living/user)
obj/item/toy/cards/deck/attackby(obj/item/toy/cards/cardhand/C, mob/living/user)
..()
if(istype(C))
if(C.parentdeck == src)
@@ -653,13 +674,13 @@ obj/item/toy/cards/attackby(obj/item/toy/cardhand/C, mob/living/user)
else
user << "<span class='notice'>You can't mix cards from other decks.</span>"
if(cards.len > 26)
src.icon_state = "deck_full"
src.icon_state = "deck_[deckstyle]_full"
else if(cards.len > 10)
src.icon_state = "deck_half"
src.icon_state = "deck_[deckstyle]_half"
else if(cards.len > 1)
src.icon_state = "deck_low"
src.icon_state = "deck_[deckstyle]_low"
obj/item/toy/cards/MouseDrop(atom/over_object)
obj/item/toy/cards/deck/MouseDrop(atom/over_object)
var/mob/M = usr
if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained())
return
@@ -683,22 +704,21 @@ obj/item/toy/cards/MouseDrop(atom/over_object)
obj/item/toy/cardhand
obj/item/toy/cards/cardhand
name = "hand of cards"
desc = "A number of cards not in a deck, customarily held in ones hand."
icon = 'icons/obj/toy.dmi'
icon_state = "hand2"
icon_state = "nanotrasen_hand2"
w_class = 1.0
var/list/currenthand = list()
var/obj/item/toy/cards/parentdeck = null
var/choice = null
obj/item/toy/cardhand/attack_self(mob/user as mob)
obj/item/toy/cards/cardhand/attack_self(mob/user as mob)
user.set_machine(src)
interact(user)
obj/item/toy/cardhand/interact(mob/user)
obj/item/toy/cards/cardhand/interact(mob/user)
var/dat = "You have:<BR>"
for(var/t in currenthand)
dat += "<A href='?src=\ref[src];pick=[t]'>A [t].</A><BR>"
@@ -709,36 +729,37 @@ obj/item/toy/cardhand/interact(mob/user)
popup.open()
obj/item/toy/cardhand/Topic(href, href_list)
obj/item/toy/cards/cardhand/Topic(href, href_list)
if(..())
return
if(usr.stat || !ishuman(usr) || !usr.canmove)
return
var/mob/living/carbon/human/cardUser = usr
var/O = src
if(href_list["pick"])
if (cardUser.get_item_by_slot(slot_l_hand) == src || cardUser.get_item_by_slot(slot_r_hand) == src)
var/choice = href_list["pick"]
var/obj/item/toy/singlecard/C = new/obj/item/toy/singlecard(cardUser.loc)
var/obj/item/toy/cards/singlecard/C = new/obj/item/toy/cards/singlecard(cardUser.loc)
src.currenthand -= choice
C.parentdeck = src.parentdeck
C.cardname = choice
C.apply_card_vars(C,O)
C.pickup(cardUser)
cardUser.put_in_any_hand_if_possible(C)
cardUser.visible_message("<span class='notice'>[cardUser] draws a card from \his hand.</span>", "<span class='notice'>You take the [C.cardname] from your hand.</span>")
interact(cardUser)
if(src.currenthand.len < 3)
src.icon_state = "hand2"
src.icon_state = "[deckstyle]_hand2"
else if(src.currenthand.len < 4)
src.icon_state = "hand3"
src.icon_state = "[deckstyle]_hand3"
else if(src.currenthand.len < 5)
src.icon_state = "hand4"
src.icon_state = "[deckstyle]_hand4"
if(src.currenthand.len == 1)
var/obj/item/toy/singlecard/N = new/obj/item/toy/singlecard(src.loc)
var/obj/item/toy/cards/singlecard/N = new/obj/item/toy/cards/singlecard(src.loc)
N.parentdeck = src.parentdeck
N.cardname = src.currenthand[1]
N.apply_card_vars(N,O)
cardUser.u_equip(src)
N.pickup(cardUser)
cardUser.put_in_any_hand_if_possible(N)
@@ -747,7 +768,7 @@ obj/item/toy/cardhand/Topic(href, href_list)
del(src)
return
obj/item/toy/cardhand/attackby(obj/item/toy/singlecard/C, mob/living/user)
obj/item/toy/cards/cardhand/attackby(obj/item/toy/cards/singlecard/C, mob/living/user)
if(istype(C))
if(C.parentdeck == src.parentdeck)
src.currenthand += C.cardname
@@ -755,31 +776,39 @@ obj/item/toy/cardhand/attackby(obj/item/toy/singlecard/C, mob/living/user)
user.visible_message("<span class='notice'>[user] adds a card to their hand.</span>", "<span class='notice'>You add the [C.cardname] to your hand.</span>")
interact(user)
if(currenthand.len > 4)
src.icon_state = "hand5"
src.icon_state = "[deckstyle]_hand5"
else if(currenthand.len > 3)
src.icon_state = "hand4"
src.icon_state = "[deckstyle]_hand4"
else if(currenthand.len > 2)
src.icon_state = "hand3"
src.icon_state = "[deckstyle]_hand3"
del(C)
else
user << "<span class='notice'>You can't mix cards from other decks.</span>"
obj/item/toy/cards/cardhand/apply_card_vars(obj/item/toy/cards/newobj,obj/item/toy/cards/sourceobj)
..()
newobj.deckstyle = sourceobj.deckstyle
newobj.icon_state = "[deckstyle]_hand2" // Another dumb hack, without this the hand is invisible (or has the default deckstyle) until another card is added.
newobj.card_hitsound = sourceobj.card_hitsound
newobj.card_force = sourceobj.card_force
newobj.card_throwforce = sourceobj.card_throwforce
newobj.card_throw_speed = sourceobj.card_throw_speed
newobj.card_throw_range = sourceobj.card_throw_range
newobj.card_attack_verb = sourceobj.card_attack_verb
obj/item/toy/singlecard
obj/item/toy/cards/singlecard
name = "card"
desc = "a card"
icon = 'icons/obj/toy.dmi'
icon_state = "singlecard_down"
icon_state = "singlecard_nanotrasen_down"
w_class = 1.0
var/cardname = null
var/obj/item/toy/cards/parentdeck = null
var/flipped = 0
pixel_x = -5
obj/item/toy/singlecard/examine()
obj/item/toy/cards/singlecard/examine()
set src in usr.contents
if(ishuman(usr))
var/mob/living/carbon/human/cardUser = usr
@@ -789,7 +818,7 @@ obj/item/toy/singlecard/examine()
cardUser << "<span class='notice'>You need to have the card in your hand to check it.</span>"
obj/item/toy/singlecard/verb/Flip()
obj/item/toy/cards/singlecard/verb/Flip()
set name = "Flip Card"
set category = "Object"
set src in range(1)
@@ -798,26 +827,27 @@ obj/item/toy/singlecard/verb/Flip()
if(!flipped)
src.flipped = 1
if (cardname)
src.icon_state = "sc_[cardname]"
src.icon_state = "sc_[cardname]_[deckstyle]"
src.name = src.cardname
else
src.icon_state = "sc_Ace of Spades"
src.icon_state = "sc_Ace of Spades_[deckstyle]"
src.name = "What Card"
src.pixel_x = 5
else if(flipped)
src.flipped = 0
src.icon_state = "singlecard_down"
src.icon_state = "singlecard_down_[deckstyle]"
src.name = "card"
src.pixel_x = -5
obj/item/toy/singlecard/attackby(obj/item/I, mob/living/user)
if(istype(I, /obj/item/toy/singlecard/))
var/obj/item/toy/singlecard/C = I
obj/item/toy/cards/singlecard/attackby(obj/item/I, mob/living/user)
if(istype(I, /obj/item/toy/cards/singlecard/))
var/obj/item/toy/cards/singlecard/C = I
if(C.parentdeck == src.parentdeck)
var/obj/item/toy/cardhand/H = new/obj/item/toy/cardhand(user.loc)
var/obj/item/toy/cards/cardhand/H = new/obj/item/toy/cards/cardhand(user.loc)
H.currenthand += C.cardname
H.currenthand += src.cardname
H.parentdeck = C.parentdeck
H.apply_card_vars(H,C)
user.u_equip(C)
H.pickup(user)
user.put_in_active_hand(H)
@@ -827,29 +857,62 @@ obj/item/toy/singlecard/attackby(obj/item/I, mob/living/user)
else
user << "<span class='notice'>You can't mix cards from other decks.</span>"
if(istype(I, /obj/item/toy/cardhand/))
var/obj/item/toy/cardhand/H = I
if(istype(I, /obj/item/toy/cards/cardhand/))
var/obj/item/toy/cards/cardhand/H = I
if(H.parentdeck == parentdeck)
H.currenthand += cardname
user.u_equip(src)
user.visible_message("<span class='notice'>[user] adds a card to \his hand.</span>", "<span class='notice'>You add the [cardname] to your hand.</span>")
H.interact(user)
if(H.currenthand.len > 4)
H.icon_state = "hand5"
H.icon_state = "[deckstyle]_hand5"
else if(H.currenthand.len > 3)
H.icon_state = "hand4"
H.icon_state = "[deckstyle]_hand4"
else if(H.currenthand.len > 2)
H.icon_state = "hand3"
H.icon_state = "[deckstyle]_hand3"
del(src)
else
user << "<span class='notice'>You can't mix cards from other decks.</span>"
obj/item/toy/singlecard/attack_self(mob/user)
obj/item/toy/cards/singlecard/attack_self(mob/user)
if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained())
return
Flip()
obj/item/toy/cards/singlecard/apply_card_vars(obj/item/toy/cards/singlecard/newobj,obj/item/toy/cards/sourceobj)
..()
newobj.deckstyle = sourceobj.deckstyle
newobj.icon_state = "singlecard_down_[deckstyle]" // Without this the card is invisible until flipped. It's an ugly hack, but it works.
newobj.card_hitsound = sourceobj.card_hitsound
newobj.hitsound = newobj.card_hitsound
newobj.card_force = sourceobj.card_force
newobj.force = newobj.card_force
newobj.card_throwforce = sourceobj.card_throwforce
newobj.throwforce = newobj.card_throwforce
newobj.card_throw_speed = sourceobj.card_throw_speed
newobj.throw_speed = newobj.card_throw_speed
newobj.card_throw_range = sourceobj.card_throw_range
newobj.throw_range = newobj.card_throw_range
newobj.card_attack_verb = sourceobj.card_attack_verb
newobj.attack_verb = newobj.card_attack_verb
/*
|| Syndicate playing cards, for pretending you're Gambit and playing poker for the nuke disk. ||
*/
obj/item/toy/cards/deck/syndicate
name = "suspicious looking deck of cards"
desc = "A deck of space-grade playing cards. They seem unusually rigid."
deckstyle = "syndicate"
card_hitsound = 'sound/weapons/bladeslice.ogg'
card_force = 15
card_throwforce = 15
card_throw_speed = 6
card_throw_range = 20
card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut")
/obj/item/toy/nuke
name = "\improper Nuclear Fission Explosive toy"
@@ -879,4 +942,3 @@ obj/item/toy/singlecard/attack_self(mob/user)
+18
View File
@@ -162,6 +162,24 @@
..()
/obj/item/weapon/weldingtool/attack(mob/living/carbon/human/H, mob/user)
var/obj/item/organ/limb/affecting = H.get_organ(check_zone(user.zone_sel.selecting))
if(istype(H))
if(affecting.status == ORGAN_ROBOTIC)
if(src.remove_fuel(0))
src.item_heal_robotic(H, user, 30, 0)
return
else
user << "<span class='warning'>Need more welding fuel!</span>"
return
else
return ..()
else
return ..()
/obj/item/weapon/weldingtool/process()
switch(welding)
if(0)
@@ -115,6 +115,32 @@
if(!I) return 0
return I.IsShield()
///////////Two hand required objects///////////////
//This is for objects that require two hands to even pick up
/obj/item/weapon/twohanded/required/
w_class = 5.0
/obj/item/weapon/twohanded/required/attack_self()
return
/obj/item/weapon/twohanded/required/mob_can_equip(M as mob, slot)
if(wielded)
M << "<span class='warning'>[src.name] is too cumbersome to carry with anything but your hands!</span>"
return 0
return ..()
/obj/item/weapon/twohanded/required/attack_hand(mob/user)//Can't even pick it up without both hands empty
var/obj/item/weapon/twohanded/required/H = user.get_inactive_hand()
if(H != null)
user.visible_message("<span class='notice'>[src.name] is too cumbersome to carry in one hand!</span>")
return
var/obj/item/weapon/twohanded/offhand/O = new(user)
user.put_in_inactive_hand(O)
..()
wielded = 1
obj/item/weapon/twohanded/
/*
* Fireaxe
@@ -148,7 +148,7 @@
return
/obj/structure/closet/attack_animal(mob/living/simple_animal/user as mob)
if(user.wall_smash)
if(user.environment_smash)
visible_message("\red [user] destroys the [src]. ")
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
@@ -102,7 +102,7 @@
return
/obj/structure/closet/statue/attack_animal(mob/living/simple_animal/user as mob)
if(user.wall_smash)
if(user.environment_smash)
for(var/mob/M in src)
shatter(M)
@@ -30,6 +30,11 @@
manual_unbuckle(user)
return
/obj/structure/stool/bed/attack_animal(var/mob/living/simple_animal/M)//No more buckling hostile mobs to chairs to render them immobile forever
if(M.environment_smash)
new /obj/item/stack/sheet/metal(src.loc)
del(src)
/obj/structure/stool/bed/MouseDrop_T(mob/M as mob, mob/user as mob)
if(!istype(M)) return
buckle_mob(M, user)
+4 -3
View File
@@ -228,7 +228,7 @@
/obj/structure/table/attack_animal(mob/living/simple_animal/user)
if(user.wall_smash)
if(user.environment_smash)
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
if(istype(src, /obj/structure/table/reinforced))
new /obj/item/weapon/table_parts/reinforced(loc)
@@ -310,7 +310,8 @@
playsound(src.loc, "sparks", 50, 1)
table_destroy(1, user)
user.drop_item(src)
if(!(((I.flags & ABSTRACT)))) //WE NEED MORE PAREMS
user.drop_item(src)
/obj/structure/table/proc/table_destroy(var/destroy_type, var/mob/user as mob)
@@ -492,7 +493,7 @@ Destroy type values:
/obj/structure/rack/attack_animal(mob/living/simple_animal/user)
if(user.wall_smash)
if(user.environment_smash)
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
new /obj/item/weapon/rack_parts(loc)
density = 0
+1
View File
@@ -68,6 +68,7 @@ var/const/SURROUND_CAP = 7
if ("explosion") soundin = pick('sound/effects/Explosion1.ogg','sound/effects/Explosion2.ogg')
if ("sparks") soundin = pick('sound/effects/sparks1.ogg','sound/effects/sparks2.ogg','sound/effects/sparks3.ogg','sound/effects/sparks4.ogg')
if ("rustle") soundin = pick('sound/effects/rustle1.ogg','sound/effects/rustle2.ogg','sound/effects/rustle3.ogg','sound/effects/rustle4.ogg','sound/effects/rustle5.ogg')
if ("bodyfall") soundin = pick('sound/effects/bodyfall1.ogg','sound/effects/bodyfall2.ogg','sound/effects/bodyfall3.ogg','sound/effects/bodyfall4.ogg')
if ("punch") soundin = pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg')
if ("clownstep") soundin = pick('sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg')
if ("swing_hit") soundin = pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg')
+10 -15
View File
@@ -101,23 +101,18 @@
return src.attack_hand(user)
/turf/simulated/wall/attack_animal(mob/living/simple_animal/M as mob)
if(M.wall_smash)
if (istype(src, /turf/simulated/wall/r_wall))
M << text("\blue This wall is far too strong for you to destroy.")
return
else
if (prob(40))
M << text("\blue You smash through the wall.")
/turf/simulated/wall/attack_animal(var/mob/living/simple_animal/M)
if(M.environment_smash >= 2)
if(istype(src, /turf/simulated/wall/r_wall))
if(M.environment_smash == 3)
dismantle_wall(1)
return
M << "<span class='info'>You smash through the wall.</span>"
else
M << text("\blue You smash against the wall.")
return
M << "\blue You push the wall but nothing happens!"
return
M << "<span class='info'>This wall is far too strong for you to destroy.</span>"
else
M << "<span class='info'>You smash through the wall.</span>"
dismantle_wall(1)
return
/turf/simulated/wall/attack_hand(mob/user as mob)
if (HULK in user.mutations)
+3 -3
View File
@@ -16,7 +16,7 @@ world/IsBanned(key,address,computer_id)
diary << "Ban database connection failure. Admin [ckeytext] not checked"
return
var/DBQuery/query = dbcon.NewQuery("SELECT ckey, ip, computerid, a_ckey, reason, expiration_time, duration, bantime, bantype FROM erro_Ban WHERE (ckey = '[ckeytext]') AND (bantype = 'ADMIN_PERMABAN' OR (bantype = 'ADMIN_TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)")
var/DBQuery/query = dbcon.NewQuery("SELECT ckey, ip, computerid, a_ckey, reason, expiration_time, duration, bantime, bantype FROM erro_ban WHERE (ckey = '[ckeytext]') AND (bantype = 'ADMIN_PERMABAN' OR (bantype = 'ADMIN_TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)")
query.Execute()
@@ -80,7 +80,7 @@ world/IsBanned(key,address,computer_id)
failedcid = 0
cidquery = " OR computerid = '[computer_id]' "
var/DBQuery/query = dbcon.NewQuery("SELECT ckey, ip, computerid, a_ckey, reason, expiration_time, duration, bantime, bantype FROM erro_Ban WHERE (ckey = '[ckeytext]' [ipquery] [cidquery]) AND (bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)")
var/DBQuery/query = dbcon.NewQuery("SELECT ckey, ip, computerid, a_ckey, reason, expiration_time, duration, bantime, bantype FROM erro_ban WHERE (ckey = '[ckeytext]' [ipquery] [cidquery]) AND (bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)")
query.Execute()
@@ -107,4 +107,4 @@ world/IsBanned(key,address,computer_id)
message_admins("[key] has logged in with a blank computer id in the ban check.")
if (failedip)
message_admins("[key] has logged in with a blank ip in the ban check.")
return ..() //default pager ban stuff
return ..() //default pager ban stuff
+2 -2
View File
@@ -5,10 +5,10 @@ atom/var/list/suit_fibers
atom/proc/add_fibers(mob/living/carbon/human/M)
if(M.gloves && istype(M.gloves,/obj/item/clothing/))
var/obj/item/clothing/gloves/G = M.gloves
if(G.transfer_blood) //bloodied gloves transfer blood to touched objects
if(G.transfer_blood > 1) //bloodied gloves transfer blood to touched objects
if(add_blood(G.bloody_hands_mob)) //only reduces the bloodiness of our gloves if the item wasn't already bloody
G.transfer_blood--
else if(M.bloody_hands)
else if(M.bloody_hands > 1)
if(add_blood(M.bloody_hands_mob))
M.bloody_hands--
if(!suit_fibers) suit_fibers = list()
@@ -2,7 +2,6 @@
/mob
var/bloody_hands = 0
var/mob/living/carbon/human/bloody_hands_mob
var/mob/living/carbon/human/track_blood_mob
/obj/item/clothing/gloves
var/transfer_blood = 0
+77 -21
View File
@@ -4,7 +4,7 @@
name = "ore redemption machine"
desc = "A machine that accepts ore and instantly transforms it into workable material sheets, but cannot produce alloys such as Plasteel. Points for ore are generated based on type and can be redeemed at a mining equipment locker."
icon = 'icons/obj/machines/mining_machines.dmi'
icon_state = "stacker"
icon_state = "ore_redemption"
density = 1
anchored = 1.0
var/obj/machinery/mineral/stacking_unit_console/CONSOLE
@@ -62,8 +62,8 @@
var/obj/item/stack/sheet/mineral/gold/M = new /obj/item/stack/sheet/mineral/gold(src)
return M
if(istype(O, /obj/item/weapon/ore/plasma))
var/obj/item/stack/sheet/mineral/plasma/M = new /obj/item/stack/sheet/mineral/plasma(src)
points += 10
var/obj/item/stack/sheet/mineral/plasma/M = new /obj/item/stack/sheet/mineral/plasma(src)
return M
if(istype(O, /obj/item/weapon/ore/glass))
points += 1
@@ -155,21 +155,18 @@
var/obj/item/weapon/card/id/inserted_id
var/list/prize_list = list(
new /datum/data/mining_equipment("Chili", /obj/item/weapon/reagent_containers/food/snacks/hotchili, 100),
new /datum/data/mining_equipment("Salad", /obj/item/weapon/reagent_containers/food/snacks/validsalad, 300),
new /datum/data/mining_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 500),
new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 500),
new /datum/data/mining_equipment("Soap", /obj/item/weapon/soap/nanotrasen, 500),
new /datum/data/mining_equipment("Stimulant Pills", /obj/item/weapon/storage/pill_bottle/stimulant, 700),
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 1000),
new /datum/data/mining_equipment("Laser Pointer", /obj/item/device/laser_pointer, 1500),
new /datum/data/mining_equipment("Space Cash", /obj/item/weapon/spacecash/c500, 5000),
new /datum/data/mining_equipment("Multitool", /obj/item/device/multitool, 100),
new /datum/data/mining_equipment("Toolbox", /obj/item/weapon/storage/toolbox/mechanical, 300),
new /datum/data/mining_equipment("Pickaxe", /obj/item/weapon/pickaxe, 100),
new /datum/data/mining_equipment("Stimulant pills", /obj/item/weapon/storage/pill_bottle/stimulant, 700),
new /datum/data/mining_equipment("Alien toy", /obj/item/clothing/mask/facehugger/toy, 1000),
new /datum/data/mining_equipment("Laser pointer", /obj/item/device/laser_pointer, 1500),
new /datum/data/mining_equipment("Space cash", /obj/item/weapon/spacecash/c500, 5000),
new /datum/data/mining_equipment("Drill", /obj/item/weapon/pickaxe/drill, 500),
new /datum/data/mining_equipment("Jackhammer", /obj/item/weapon/pickaxe/jackhammer, 1000),
new /datum/data/mining_equipment("Wormhole Jaunter", /obj/item/device/wormhole_jaunter, 1000),
new /datum/data/mining_equipment("Blast Shield", /obj/item/weapon/shield/riot/mining, 2000),
new /datum/data/mining_equipment("Sonic Jackhammer", /obj/item/weapon/pickaxe/jackhammer, 1000),
new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 1000),
new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 1500),
new /datum/data/mining_equipment("Kinetic accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 2500),
new /datum/data/mining_equipment("Jetpack", /obj/item/weapon/tank/jetpack/carbondioxide, 5000),)
/datum/data/mining_equipment/
@@ -239,8 +236,8 @@
/obj/item/device/wormhole_jaunter
name = "wormhole jaunter"
desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to blue space for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least."
icon = 'icons/obj/device.dmi'
icon_state = "hand_tele"
icon = 'icons/obj/items.dmi'
icon_state = "Jaunter"
item_state = "electronic"
throwforce = 0
w_class = 2.0
@@ -267,10 +264,13 @@
var/obj/effect/portal/wormhole/jaunt_tunnel/J = new /obj/effect/portal/wormhole/jaunt_tunnel(get_turf(src), chosen_beacon, lifespan=100)
J.target = chosen_beacon
try_move_adjacent(J)
playsound(src,'sound/effects/sparks4.ogg',50,1)
del(src)
/obj/effect/portal/wormhole/jaunt_tunnel
name = "jaunt tunnel"
icon = 'icons/effects/effects.dmi'
icon_state = "bhole3"
desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon."
/obj/effect/portal/wormhole/jaunt_tunnel/teleport(atom/movable/M)
@@ -291,17 +291,73 @@
T.add_vomit_floor(L)
playsound(L, 'sound/effects/splat.ogg', 50, 1)
//Mining Blast Shield
/obj/item/weapon/shield/riot/mining
name = "blast shield"
desc = "Originally conceived as an attempt to protect miners from gibtonite explosions, these shields are much more effective at protecting miners from hostile wildlife on the asteroid."
//Mining Resonator
/obj/item/weapon/resonator
name = "resonator"
icon = 'icons/obj/items.dmi'
icon_state = "resonator"
item_state = "resonator"
desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vaccuum."
w_class = 3
force = 10
throwforce = 10
var/cooldown = 0
/obj/item/weapon/resonator/proc/CreateResonance(var/target)
if(cooldown <= 0)
playsound(src,'sound/effects/stealthoff.ogg',50,1)
new /obj/effect/resonance(get_turf(target))
cooldown = 1
spawn(25)
cooldown = 0
/obj/item/weapon/resonator/attack_self(mob/user as mob)
CreateResonance(src)
..()
/obj/item/weapon/resonator/attack(var/atom/A)
CreateResonance(A)
..()
/obj/effect/resonance
name = "resonance field"
desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures."
icon = 'icons/effects/effects.dmi'
icon_state = "shield1"
layer = 4.1
mouse_opacity = 0
var/resonance_damage = 30
/obj/effect/resonance/New()
var/turf/proj_turf = get_turf(src)
if(!istype(proj_turf, /turf))
return
if(istype(proj_turf, /turf/simulated/mineral))
var/turf/simulated/mineral/M = proj_turf
playsound(src,'sound/effects/sparks4.ogg',50,1)
M.gets_drilled()
spawn(5)
del(src)
else
var/datum/gas_mixture/environment = proj_turf.return_air()
var/pressure = environment.return_pressure()
if(pressure < 50)
name = "strong resonance"
resonance_damage = 60
spawn(50)
playsound(src,'sound/effects/sparks4.ogg',50,1)
for(var/mob/living/L in src.loc)
L << "<span class='danger'>The [src.name] ruptured with you in it!</span>"
L.adjustBruteLoss(resonance_damage)
del(src)
//Fakehugger Toy
/obj/item/clothing/mask/facehugger/toy
desc = "A commemorative toy often used to play pranks on other miners by putting it in their beds. It takes a bit to recharge after latching onto something."
desc = "A toy often used to play pranks on other miners by putting it in their beds. It takes a bit to recharge after latching onto something."
throwforce = 0
sterile = 1
tint = 3
tint = 3 //Makes it feel more authentic when it latches on
/obj/item/clothing/mask/facehugger/toy/examine()//So that giant red text about probisci doesn't show up.
if(desc)
+95 -8
View File
@@ -19,13 +19,12 @@
/turf/simulated/mineral/ex_act(severity)
switch(severity)
if(3.0)
return
if (prob(75))
src.gets_drilled()
if(2.0)
if (prob(70))
src.mineralAmt -= 1 //some of the stuff gets blown up
if (prob(90))
src.gets_drilled()
if(1.0)
src.mineralAmt -= 2 //some of the stuff gets blown up
src.gets_drilled()
return
@@ -63,7 +62,7 @@
/turf/simulated/mineral/random
name = "Mineral deposit"
var/mineralSpawnChanceList = list("Uranium" = 5, "Iron" = 50, "Diamond" = 1, "Gold" = 5, "Silver" = 5, "Plasma" = 25/*, "Adamantine" =5*/, "Cave" = 1)//Currently, Adamantine won't spawn as it has no uses. -Durandan
var/mineralSpawnChanceList = list("Uranium" = 5, "Iron" = 50, "Diamond" = 1, "Gold" = 5, "Silver" = 5, "Plasma" = 25, "Gibtonite" = 5/*, "Adamantine" =5*/, "Cave" = 1)//Currently, Adamantine won't spawn as it has no uses. -Durandan
var/mineralChance = 10 //means 10% chance of this plot changing to a mineral deposit
/turf/simulated/mineral/random/New()
@@ -88,7 +87,8 @@
M = new/turf/simulated/mineral/plasma(src)
if("Cave")
new/turf/simulated/floor/plating/asteroid/airless/cave(src)
if("Gibtonite")
M = new/turf/simulated/mineral/gibtonite(src)
/*if("Adamantine")
M = new/turf/simulated/mineral/adamantine(src)*/
if(M)
@@ -98,7 +98,7 @@
/turf/simulated/mineral/random/high_chance
mineralChance = 25
mineralSpawnChanceList = list("Uranium" = 10, "Iron" = 30, "Diamond" = 2, "Gold" = 10, "Silver" = 10, "Plasma" = 25)
mineralSpawnChanceList = list("Uranium" = 10, "Iron" = 30, "Diamond" = 2, "Gold" = 10, "Silver" = 10, "Plasma" = 25, "Gibtonite" = 8)
/turf/simulated/mineral/uranium
name = "Uranium deposit"
@@ -163,6 +163,87 @@
spreadChance = 0
spread = 0
////////////////////////////////Gibtonite
/turf/simulated/mineral/gibtonite
name = "Diamond deposit" //honk
icon_state = "rock_Diamond"
mineralName = "Gibtonite"
mineralAmt = 1
spreadChance = 0
spread = 1
var/det_time = 8 //Countdown till explosion, but also rewards the player for how close you were to detonation when you defuse it
var/stage = 0 //How far into the lifecycle of gibtonite we are, 0 is untouched, 1 is active and attempting to detonate, 2 is benign and ready for extraction
var/activated_ckey = null //These are to track who triggered the gibtonite deposit for logging purposes
var/activated_name = null
/turf/simulated/mineral/gibtonite/New()
det_time = rand(8,10) //So you don't know exactly when the hot potato will explode
..()
/turf/simulated/mineral/gibtonite/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/device/analyzer) && stage == 1)
user.visible_message("<span class='notice'>You use the analyzer to locate where to cut off the chain reaction and attempt to stop it...</span>")
defuse()
if(istype(I, /obj/item/weapon/pickaxe))
src.activated_ckey = "[user.ckey]"
src.activated_name = "[user.name]"
..()
/turf/simulated/mineral/gibtonite/proc/explosive_reaction()
if(stage == 0)
icon_state = "rock_Gibtonite_active"
name = "Gibtonite deposit"
desc = "An active gibtonite reserve. Run!"
stage = 1
visible_message("<span class='warning'>There was gibtonite inside! It's going to explode!</span>")
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
var/log_str = "[src.activated_ckey]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> [src.activated_name] has triggered a gibtonite deposit reaction <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>."
log_game(log_str)
countdown()
/turf/simulated/mineral/gibtonite/proc/countdown()
spawn(0)
while(stage == 1 && det_time > 0 && mineralAmt >= 1)
det_time--
sleep(5)
if(stage == 1 && det_time <= 0 && mineralAmt >= 1)
var/turf/bombturf = get_turf(src)
mineralAmt = 0
explosion(bombturf,1,3,5, adminlog = 0)
if(stage == 0 || stage == 2)
return
/turf/simulated/mineral/gibtonite/proc/defuse()
if(stage == 1)
icon_state = "rock_Gibtonite"
desc = "An inactive gibtonite reserve. The ore can be extracted."
stage = 2
if(det_time < 0)
det_time = 0
visible_message("<span class='notice'>The chain reaction was stopped! The gibtonite had [src.det_time] reactions left till the explosion!</span>")
/turf/simulated/mineral/gibtonite/gets_drilled()
if(stage == 0 && mineralAmt >= 1) //Gibtonite deposit is activated
playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,1)
explosive_reaction()
return
if(stage == 1 && mineralAmt >= 1) //Gibtonite deposit goes kaboom
var/turf/bombturf = get_turf(src)
mineralAmt = 0
explosion(bombturf,1,2,5, adminlog = 0)
if(stage == 2) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore.
var/obj/item/weapon/twohanded/required/gibtonite/G = new /obj/item/weapon/twohanded/required/gibtonite/(src)
if(det_time <= 0)
G.quality = 3
G.icon_state = "Gibtonite ore 3"
if(det_time >= 1 && det_time <= 2)
G.quality = 2
G.icon_state = "Gibtonite ore 2"
..()
////////////////////////////////End Gibtonite
/turf/simulated/floor/plating/asteroid/airless/cave
var/length = 100
@@ -256,6 +337,9 @@
user << "\blue You finish cutting into the rock."
gets_drilled()
if(istype(W, /obj/item/weapon/resonator))
var/obj/item/weapon/resonator/R = W
R.CreateResonance(src)
else
return attack_hand(user)
return
@@ -350,7 +434,7 @@
if(3.0)
return
if(2.0)
if (prob(70))
if (prob(20))
src.gets_dug()
if(1.0)
src.gets_dug()
@@ -437,6 +521,9 @@
icon_state = "asteroid_dug"
return
/turf/simulated/floor/plating/asteroid/proc/countdown()//This is here to stop runtimes in the event that changeturf() causes asteroid plating to take gibtonite procs
return
/turf/proc/updateMineralOverlays()
src.overlays.Cut()
+41
View File
@@ -60,10 +60,51 @@
desc = "Completely useless"
icon_state = "slag"
/obj/item/weapon/twohanded/required/gibtonite
name = "Gibtonite ore"
desc = "Extremely explosive if struck with mining equipment, Gibtonite is often used by miners to speed up their work by using it as a mining charge. This material is illegal to possess by unauthorized personnel under space law."
icon = 'icons/obj/mining.dmi'
icon_state = "Gibtonite ore"
item_state = "Gibtonite ore"
w_class = 4
throw_range = 0
anchored = 1 //Forces people to carry it by hand, no pulling!
var/primed = 0
var/det_time = 100
var/quality = 1 //How pure this gibtonite is, determines the explosion produced by it and is derived from the det_time of the rock wall it was taken from, higher value = better
/obj/item/weapon/twohanded/required/gibtonite/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/weapon/pickaxe) && !primed)
playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,1)
primed = 1
icon_state = "Gibtonite active"
user.visible_message("<span class='warning'>[user] strikes the [src], causing a chain reaction!</span>")
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
message_admins("[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has triggered a [name] to detonate at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
log_game("[key_name(usr)] has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
spawn(det_time)
if(primed)
if(quality == 3)
explosion(src.loc,2,4,9)
if(quality == 2)
explosion(src.loc,1,2,5)
if(quality == 1)
explosion(src.loc,-1,1,3)
del(src)
if(istype(I, /obj/item/device/analyzer) && primed)
primed = 0
user.visible_message("<span class='notice'>The chain reaction was stopped! ...The ore's quality went down.</span>")
icon_state = "Gibtonite ore"
quality = 1
..()
/obj/item/weapon/ore/New()
pixel_x = rand(0,16)-8
pixel_y = rand(0,8)-8
/obj/item/weapon/ore/ex_act()
return
/*****************************Coin********************************/
@@ -161,12 +161,11 @@ Doesn't work on other aliens/AI.*/
set desc = "Empties the contents of your stomach"
set category = "Alien"
if(powerc())
if(stomach_contents.len)
for(var/mob/M in src)
if(M in stomach_contents)
stomach_contents.Remove(M)
M.loc = loc
//Paralyse(10)
src.visible_message("\green <B>[src] hurls out the contents of their stomach!</B>")
if(powerc() && stomach_contents.len)
for(var/atom/movable/A in stomach_contents)
if(A in stomach_contents)
stomach_contents.Remove(A)
A.loc = loc
//Paralyse(10)
src.visible_message("\green <B>[src] hurls out the contents of their stomach!</B>")
return
@@ -392,6 +392,8 @@
sight &= ~SEE_OBJS
see_in_dark = 4
see_invisible = SEE_INVISIBLE_LEVEL_TWO
if(see_override)
see_invisible = see_override
if (healths)
if (stat != 2)
@@ -305,6 +305,8 @@
sight &= ~SEE_OBJS
see_in_dark = 4
see_invisible = SEE_INVISIBLE_LEVEL_TWO
if(see_override)
see_invisible = see_override
if (healths)
if (stat != 2)
@@ -100,6 +100,9 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention
if(gib_on_success)
affected_mob.gib()
if(istype(new_xeno.loc,/mob/living/carbon))
var/mob/living/carbon/digester = new_xeno.loc
digester.stomach_contents += new_xeno
del(src)
/*----------------------------------------
@@ -219,6 +219,8 @@
sight &= ~SEE_OBJS
see_in_dark = 2
see_invisible = SEE_INVISIBLE_LIVING
if(see_override)
see_invisible = see_override
if (healths)
if (stat != 2)
+2 -1
View File
@@ -315,15 +315,16 @@
/mob/living/carbon/clean_blood()
. = ..()
if(ishuman(src))
var/mob/living/carbon/human/H = src
if(H.gloves)
if(H.gloves.clean_blood())
H.update_inv_gloves(0)
else
..() // Clear the Blood_DNA list
if(H.bloody_hands)
H.bloody_hands = 0
H.bloody_hands_mob = null
H.update_inv_gloves(0)
update_icons() //apply the now updated overlays to the mob
@@ -54,6 +54,11 @@
if(HULK in mutations) return
..()
/mob/living/carbon/human/update_canmove()
var/old_lying = lying
. = ..()
if(lying && !old_lying && !resting && !buckled) // fell down
playsound(loc, "bodyfall", 50, 1, -1)
////////////////////////////////////////////
//Returns a list of damaged organs
@@ -122,43 +122,6 @@ emp_act
var/obj/item/organ/limb/affecting = get_organ(ran_zone(user.zone_sel.selecting))
//--------------------- Cyber limb stuff ---------------------\\
if(istype(I, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = I
if(affecting.status == ORGAN_ROBOTIC)
if (WT.remove_fuel(0))
if(affecting.brute_dam > 0)
affecting.heal_damage(30,0,1) //Repair Brute
update_damage_overlays(0)
updatehealth()
for(var/mob/O in viewers(user, null))
O.show_message(text("\blue [user] has fixed some of the dents on [src]'s [affecting.getDisplayName()]!"), 1) //Tell everyone [src]'s limb (by its real name) has been repaired
return //So we don't attack them as well
else
user << "<span class='notice'>[src]'s [affecting.getDisplayName()] is already in good condition</span>"
return
else
user << "<span class='warning'>Need more welding fuel!</span>"
return
if(istype(I, /obj/item/weapon/cable_coil))
var/obj/item/weapon/cable_coil/coil = I
if(affecting.status == ORGAN_ROBOTIC)
if(affecting.burn_dam > 0)
affecting.heal_damage(0,30,1) //Repair Burn
updatehealth()
coil.use(1)
for(var/mob/O in viewers(user, null))
O.show_message(text("\blue [user] has fixed some of the burnt wires on [src]'s [affecting.getDisplayName()]!"), 1)
return //So we don't attack them as well
else
user << "<span class='notice'>[src]'s [affecting.getDisplayName()] is already in good condition</span>"
return
//-------------------- End of Cyber limb stuff ---------------------\\
var/hit_area = parse_zone(affecting.name)
if((user != src) && check_shields(I.force, "the [I.name]"))
@@ -199,12 +162,8 @@ emp_act
if (H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
G.add_blood(H)
G.transfer_blood = 2
G.bloody_hands_mob = H
else
H.add_blood(H)
H.bloody_hands = 2
H.bloody_hands_mob = H
H.update_inv_gloves() //updates on-mob overlays for bloody hands and/or bloody gloves
+20 -24
View File
@@ -1018,6 +1018,8 @@
if(healths) healths.icon_state = "health7" //DEAD healthmeter
else
sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS)
var/see_temp = see_invisible
see_invisible = SEE_INVISIBLE_LIVING
if(dna)
switch(dna.mutantrace)
if("lizard","slime")
@@ -1031,15 +1033,10 @@
if(XRAY in mutations)
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
see_in_dark = 8
if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO
see_invisible = SEE_INVISIBLE_LEVEL_TWO
if(seer)
var/obj/effect/rune/R = locate() in loc
if(R && R.word1 == wordsee && R.word2 == wordhell && R.word3 == wordjoin)
see_invisible = SEE_INVISIBLE_OBSERVER
else
see_invisible = SEE_INVISIBLE_LIVING
seer = 0
see_invisible = SEE_INVISIBLE_OBSERVER
if(mind && mind.changeling)
hud_used.lingchemdisplay.invisibility = 0
@@ -1057,34 +1054,30 @@
target_list += target
if(target_list.len)//Everything else is handled by the ninja mask proc.
O.assess_targets(target_list, src)
if(!druggy) see_invisible = SEE_INVISIBLE_LIVING
see_invisible = SEE_INVISIBLE_LIVING
if(1)
see_in_dark = 5
if(!druggy) see_invisible = SEE_INVISIBLE_LIVING
see_invisible = SEE_INVISIBLE_LIVING
if(2)
sight |= SEE_MOBS
if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO
see_invisible = SEE_INVISIBLE_LEVEL_TWO
if(3)
sight |= SEE_TURFS
if(!druggy) see_invisible = SEE_INVISIBLE_LIVING
see_invisible = SEE_INVISIBLE_LIVING
if(glasses)
if(istype(glasses, /obj/item/clothing/glasses/meson))
sight |= SEE_TURFS
if(!druggy)
see_invisible = SEE_INVISIBLE_MINIMUM
see_invisible = SEE_INVISIBLE_MINIMUM
else if(istype(glasses, /obj/item/clothing/glasses/night))
see_in_dark = 5
if(!druggy)
see_invisible = SEE_INVISIBLE_MINIMUM
see_invisible = SEE_INVISIBLE_MINIMUM
else if(istype(glasses, /obj/item/clothing/glasses/thermal))
sight |= SEE_MOBS
if(!druggy)
see_invisible = SEE_INVISIBLE_MINIMUM
see_invisible = SEE_INVISIBLE_MINIMUM
else if(istype(glasses, /obj/item/clothing/glasses/material))
sight |= SEE_OBJS
if(!druggy)
see_invisible = SEE_INVISIBLE_MINIMUM
see_invisible = SEE_INVISIBLE_MINIMUM
/* HUD shit goes here, as long as it doesn't modify sight flags */
// The purpose of this is to stop xray and w/e from preventing you from using huds -- Love, Doohl
@@ -1094,17 +1087,20 @@
if(istype(glasses, /obj/item/clothing/glasses/sunglasses/sechud))
var/obj/item/clothing/glasses/sunglasses/sechud/O = glasses
if(O.hud) O.hud.process_hud(src)
if(!druggy) see_invisible = SEE_INVISIBLE_LIVING
see_invisible = SEE_INVISIBLE_LIVING
else if(istype(glasses, /obj/item/clothing/glasses/hud))
var/obj/item/clothing/glasses/hud/O = glasses
O.process_hud(src)
if(!druggy)
see_invisible = SEE_INVISIBLE_LIVING
see_invisible = SEE_INVISIBLE_LIVING
else
see_invisible = SEE_INVISIBLE_LIVING
else
see_invisible = SEE_INVISIBLE_LIVING
if(druggy) //Override for druggy
see_invisible = see_temp
if(see_override) //Override all
see_invisible = see_override
if(healths)
switch(hal_screwyhud)
@@ -482,6 +482,8 @@
sight &= ~SEE_OBJS
see_in_dark = 2
see_invisible = SEE_INVISIBLE_LIVING
if(see_override)
see_invisible = see_override
if (healths)
if (stat != 2)
+1
View File
@@ -259,6 +259,7 @@
setOxyLoss(0)
setCloneLoss(0)
setBrainLoss(0)
setHalLoss(0)
SetParalysis(0)
SetStunned(0)
SetWeakened(0)
+18 -10
View File
@@ -24,23 +24,31 @@
return P.on_hit(src, armor, def_zone)
/mob/living/hitby(atom/movable/AM)//Standardization and logging -Sieve
if(istype(AM, /obj/))
var/obj/O = AM
if(istype(AM, /obj/item))
var/obj/item/I = AM
var/zone = ran_zone("chest", 65)//Hits a random part of the body, geared towards the chest
var/dtype = BRUTE
if(istype(O,/obj/item/weapon))
var/obj/item/weapon/W = O
if(istype(I,/obj/item/weapon))
var/obj/item/weapon/W = I
dtype = W.damtype
visible_message("<span class='danger'>[src] has been hit by [O].</span>", \
"<span class='userdanger'>[src] has been hit by [O].</span>")
if (W.throwhitsound && W.throwforce > 0)
playsound(loc, W.throwhitsound, 30, 1, -1)
else if(W.throwtapsound && W.throwforce == 0)
playsound(loc, W.throwtapsound, 30, 1, -1)
else if(W.hitsound && W.throwforce > 0)
playsound(loc, W.hitsound, 30, 1, -1)
else
playsound(loc, I.throwtapsound, 30, 1, -1)
visible_message("<span class='danger'>[src] has been hit by [I].</span>", \
"<span class='userdanger'>[src] has been hit by [I].</span>")
var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].")
apply_damage(O.throwforce, dtype, zone, armor, O)
if(!O.fingerprintslast)
apply_damage(I.throwforce, dtype, zone, armor, I)
if(!I.fingerprintslast)
return
var/client/assailant = directory[ckey(O.fingerprintslast)]
var/client/assailant = directory[ckey(I.fingerprintslast)]
if(assailant && assailant.mob && istype(assailant.mob,/mob))
var/mob/M = assailant.mob
add_logs(M, src, "hit", object="[O]")
add_logs(M, src, "hit", object="[I]")
//Mobs on Fire
/mob/living/proc/IgniteMob()
@@ -58,6 +58,8 @@
src.sight |= SEE_OBJS
src.see_in_dark = 8
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
if(see_override)
see_invisible = see_override
var/area/home = get_area(src)
if(!home) return//something to do with malf fucking things up I guess. <-- aisat is gone. is this still necessary? ~Carn
+18 -18
View File
@@ -145,25 +145,25 @@
src.sight |= SEE_OBJS
src.see_in_dark = 8
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
else if (src.sight_mode & BORGMESON && src.sight_mode & BORGTHERM)
src.sight |= SEE_TURFS
src.sight |= SEE_MOBS
else
src.see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
else if (src.sight_mode & BORGMESON)
src.sight |= SEE_TURFS
src.see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
else if (src.sight_mode & BORGTHERM)
src.sight |= SEE_MOBS
src.see_in_dark = 8
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
else if (src.stat != 2)
src.sight &= ~SEE_MOBS
src.sight &= ~SEE_TURFS
src.sight &= ~SEE_OBJS
src.see_in_dark = 8
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
if (src.sight_mode & BORGMESON && src.sight_mode & BORGTHERM)
src.sight |= SEE_TURFS
src.sight |= SEE_MOBS
src.see_invisible = SEE_INVISIBLE_MINIMUM
else if (src.sight_mode & BORGMESON)
src.sight |= SEE_TURFS
see_invisible = SEE_INVISIBLE_MINIMUM
else if (src.sight_mode & BORGTHERM)
src.sight |= SEE_MOBS
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
else if (src.stat != 2)
src.sight &= ~SEE_MOBS
src.sight &= ~SEE_TURFS
src.sight &= ~SEE_OBJS
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
if(see_override)
see_invisible = see_override
for(var/image/hud in client.images)
if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe
@@ -389,9 +389,9 @@
var/obj/item/weapon/cable_coil/coil = W
adjustFireLoss(-30)
updatehealth()
coil.use(1)
for(var/mob/O in viewers(user, null))
O.show_message(text("\red [user] has fixed some of the burnt wires on [src]!"), 1)
coil.use(1)
else if (istype(W, /obj/item/weapon/crowbar)) // crowbar means open or close the cover
if(opened)
@@ -139,7 +139,7 @@
melee_damage_upper = 30
attacktext = "smashes their armoured gauntlet into"
speed = 3
wall_smash = 1
environment_smash = 2
attack_sound = 'sound/weapons/punch3.ogg'
status_flags = 0
construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall)
@@ -235,7 +235,7 @@
melee_damage_upper = 5
attacktext = "rams"
speed = 0
wall_smash = 1
environment_smash = 2
attack_sound = 'sound/weapons/punch2.ogg'
construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser,
/obj/effect/proc_holder/spell/aoe_turf/conjure/wall,
@@ -263,7 +263,7 @@
melee_damage_upper = 50
attacktext = "brutally crushes"
speed = 5
wall_smash = 1
environment_smash = 2
attack_sound = 'sound/weapons/punch4.ogg'
var/energy = 0
var/max_energy = 1000
@@ -29,7 +29,6 @@
max_n2 = 0
unsuitable_atoms_damage = 15
faction = "alien"
wall_smash = 1
status_flags = CANPUSH
minbodytemp = 0
heat_damage_per_tick = 20
@@ -52,6 +51,8 @@
melee_damage_lower = 15
melee_damage_upper = 15
ranged = 1
retreat_distance = 5
minimum_distance = 5
projectiletype = /obj/item/projectile/neurotox
projectilesound = 'sound/weapons/pierce.ogg'
@@ -66,6 +67,8 @@
melee_damage_lower = 15
melee_damage_upper = 15
ranged = 1
retreat_distance = 5
minimum_distance = 5
move_to_delay = 3
projectiletype = /obj/item/projectile/neurotox
projectilesound = 'sound/weapons/pierce.ogg'
@@ -50,4 +50,12 @@
if(istype(L))
if(prob(15))
L.Weaken(3)
L.visible_message("<span class='danger'>\the [src] knocks down \the [L]!</span>")
L.visible_message("<span class='danger'>\the [src] knocks down \the [L]!</span>")
/mob/living/simple_animal/hostile/carp/holocarp
icon_state = "holocarp"
icon_living = "holocarp"
/mob/living/simple_animal/hostile/carp/holocarp/Die()
del(src)
return
@@ -31,10 +31,14 @@
name = "hivebot"
desc = "A smallish robot, this one is armed!"
ranged = 1
retreat_distance = 5
minimum_distance = 5
/mob/living/simple_animal/hostile/hivebot/rapid
ranged = 1
rapid = 1
retreat_distance = 5
minimum_distance = 5
/mob/living/simple_animal/hostile/hivebot/strong
name = "strong hivebot"
@@ -42,7 +46,6 @@
health = 80
ranged = 1
/mob/living/simple_animal/hostile/hivebot/Die()
..()
visible_message("<b>[src]</b> blows apart!")
@@ -1,8 +1,11 @@
/mob/living/simple_animal/hostile
faction = "hostile"
mouse_opacity = 2 //This makes it easier to hit hostile mobs, you only need to click on their tile, and is set back to 1 when they die
stop_automated_movement_when_pulled = 0
environment_smash = 1 //Set to 1 to break closets,tables,racks, etc; 2 for walls; 3 for rwalls
var/stance = HOSTILE_STANCE_IDLE //Used to determine behavior
var/atom/target
var/attack_same = 0
var/attack_same = 0 //Set us to 1 to allow us to attack our own faction, or 2, to only ever attack our own faction
var/ranged = 0
var/rapid = 0
var/projectiletype
@@ -10,72 +13,170 @@
var/casingtype
var/move_to_delay = 2 //delay for the automated movement.
var/list/friends = list()
var/vision_range = 10
var/idle_env_destroyer = 0
stop_automated_movement_when_pulled = 0
var/vision_range = 9 //How big of an area to search for targets in, a vision of 9 attempts to find targets as soon as they walk into screen view
/mob/living/simple_animal/hostile/proc/FindTarget()
var/aggro_vision_range = 9 //If a mob is aggro, we search in this radius. Defaults to 9 to keep in line with original simple mob aggro radius
var/idle_vision_range = 9 //If a mob is just idling around, it's vision range is limited to this. Defaults to 9 to keep in line with original simple mob aggro radius
var/ranged_message = "fires" //Fluff text for ranged mobs
var/ranged_cooldown = 0 //What the starting cooldown is on ranged attacks
var/ranged_cooldown_cap = 3 //What ranged attacks, after being used are set to, to go back on cooldown, defaults to 3 life() ticks
var/retreat_distance = null //If our mob runs from players when they're too close, set in tile distance. By default, mobs do not retreat.
var/minimum_distance = 1 //Minimum approach distance, so ranged mobs chase targets down, but still keep their distance set in tiles to the target, set higher to make mobs keep distance
var/search_objects = 0 //If we want to consider objects when searching around, set this to 1. If you want to search for objects while also ignoring mobs until hurt, set it to 2. To completely ignore mobs, even when attacked, set it to 3
var/list/wanted_objects = list() //A list of objects that will be checked against to attack, should we have search_objects enabled
var/stat_attack = 0 //Mobs with stat_attack to 1 will attempt to attack things that are unconscious, Mobs with stat_attack set to 2 will attempt to attack the dead.
var/stat_exclusive = 0 //Mobs with this set to 1 will exclusively attack things defined by stat_attack, stat_attack 2 means they will only attack corpses
var/attack_faction = null //Put a faction string here to have a mob only ever attack a specific faction
var/atom/T = null
stop_automated_movement = 0
for(var/atom/A in ListTargets())
/mob/living/simple_animal/hostile/Life()
var/atom/F = Found(A)
if(F)
T = F
break
if(!CanAttack(A))
continue
if(isliving(A))
T = A
break
else if(istype(A, /obj/mecha)) // Our line of sight stuff was already done in ListTargets().
var/obj/mecha/M = A
if (M.occupant)
T = M
break
return T
/mob/living/simple_animal/hostile/CanAttack(var/atom/the_target)
if(!..())
. = ..()
if(!.)
walk(src, 0)
return 0
if(isliving(the_target))
var/mob/living/L = the_target
if(L.faction == src.faction && !attack_same)
return 0
else if(L in friends)
return 0
return 1
if(client)
return 0
if(!stat)
switch(stance)
if(HOSTILE_STANCE_IDLE)
if(environment_smash)
EscapeConfinement()
var/new_target = FindTarget()
GiveTarget(new_target)
/mob/living/simple_animal/hostile/proc/GiveTarget(var/new_target)
if(HOSTILE_STANCE_ATTACK)
MoveToTarget()
DestroySurroundings()
if(HOSTILE_STANCE_ATTACKING)
AttackTarget()
DestroySurroundings()
if(ranged)
ranged_cooldown--
//////////////HOSTILE MOB TARGETTING AND AGGRESSION////////////
/mob/living/simple_animal/hostile/proc/ListTargets()//Step 1, find out what we can see
var/list/L = list()
if(!search_objects)
var/list/Mobs = hearers(vision_range, src) - src //Remove self, so we don't suicide
L += Mobs
for(var/obj/mecha/M in mechas_list)
if(get_dist(M, src) <= vision_range && can_see(src, M, vision_range))
L += M
else
var/list/Objects = oview(vision_range, src)
L += Objects
return L
/mob/living/simple_animal/hostile/proc/FindTarget()//Step 2, filter down possible targets to things we actually care about
var/list/Targets = list()
var/Target
for(var/atom/A in ListTargets())
if(Found(A))//Just in case people want to override targetting
var/list/FoundTarget = list()
FoundTarget += A
Targets = FoundTarget
break
if(CanAttack(A))//Can we attack it?
Targets += A
continue
Target = PickTarget(Targets)
return Target //We now have a target
/mob/living/simple_animal/hostile/proc/Found(var/atom/A)//This is here as a potential override to pick a specific target if available
return
/mob/living/simple_animal/hostile/proc/PickTarget(var/list/Targets)//Step 3, pick amongst the possible, attackable targets
if(target != null)//If we already have a target, but are told to pick again, calculate the lowest distance between all possible, and pick from the lowest distance targets
for(var/atom/A in Targets)
var/target_dist = get_dist(src, target)
var/possible_target_distance = get_dist(src, A)
if(target_dist < possible_target_distance)
Targets -= A
if(!Targets.len)//We didnt find nothin!
return
var/chosen_target = pick(Targets)//Pick the remaining targets (if any) at random
return chosen_target
/mob/living/simple_animal/hostile/CanAttack(var/atom/the_target)//Can we actually attack a possible target?
if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it
return 0
if(isliving(the_target) && search_objects < 2)
var/mob/living/L = the_target
if(L.stat > stat_attack || L.stat != stat_attack && stat_exclusive == 1)
return 0
if(L.faction == src.faction && !attack_same || L.faction != src.faction && attack_same == 2 || L.faction != attack_faction && attack_faction)
return 0
if(L in friends)
return 0
return 1
if(isobj(the_target))
if(the_target.type in wanted_objects)
return 1
if(istype(the_target, /obj/mecha) && search_objects < 2)
var/obj/mecha/M = the_target
if(M.occupant)//Just so we don't attack empty mechs
return 1
return 0
/mob/living/simple_animal/hostile/proc/GiveTarget(var/new_target)//Step 4, give us our selected target
target = new_target
if(target != null)
Aggro()
stance = HOSTILE_STANCE_ATTACK
return
/mob/living/simple_animal/hostile/proc/Goto(var/target, var/delay)
walk_to(src, target, 1, delay)
/mob/living/simple_animal/hostile/proc/Found(var/atom/A)
return
/mob/living/simple_animal/hostile/proc/MoveToTarget()
/mob/living/simple_animal/hostile/proc/MoveToTarget()//Step 5, handle movement between us and our target
stop_automated_movement = 1
if(!target || !CanAttack(target))
LoseTarget()
return
if(target in ListTargets())
if(ranged)
if(get_dist(src, target) <= 6)
var/target_distance = get_dist(src,target)
if(ranged)//We ranged? Shoot at em
if(target_distance >= 2 && ranged_cooldown <= 0)//But make sure they're a tile away at least, and our range attack is off cooldown
OpenFire(target)
if(retreat_distance != null)//If we have a retreat distance, check if we need to run from our target
if(target_distance <= retreat_distance)//If target's closer than our retreat distance, run
walk_away(src,target,retreat_distance,move_to_delay)
else
Goto(target, move_to_delay)
Goto(target,move_to_delay,minimum_distance)//Otherwise, get to our minimum distance so we chase them
else
stance = HOSTILE_STANCE_ATTACKING
Goto(target, move_to_delay)
Goto(target,move_to_delay,minimum_distance)
if(isturf(loc) && target.Adjacent(src)) //If they're next to us, attack
AttackingTarget()
return
if(target.loc != null && get_dist(src, target.loc) <= vision_range)//We can't see our target, but he's in our vision range still
if(FindHidden(target) && environment_smash)//Check if he tried to hide in something to lose us
var/atom/A = target.loc
Goto(A,move_to_delay,minimum_distance)
if(A.Adjacent(src))
A.attack_animal(src)
return
else
LostTarget()
LostTarget()
/mob/living/simple_animal/hostile/proc/Goto(var/target, var/delay, var/minimum_distance)
walk_to(src, target, minimum_distance, delay)
/mob/living/simple_animal/hostile/adjustBruteLoss(var/damage)
..(damage)
if(!stat && search_objects < 3)//Not unconscious, and we don't ignore mobs
if(search_objects)//Turn off item searching and ignore whatever item we were looking at, we're more concerned with fight or flight
search_objects = 0
target = null
if(stance == HOSTILE_STANCE_IDLE)//If we took damage while idle, immediately attempt to find the source of it so we find a living target
Aggro()
var/new_target = FindTarget()
GiveTarget(new_target)
if(stance == HOSTILE_STANCE_ATTACK)//No more pulling a mob forever and having a second player attack it, it can switch targets now if it finds a more suitable one
if(target != null && prob(25))
var/new_target = FindTarget()
GiveTarget(new_target)
/mob/living/simple_animal/hostile/proc/AttackTarget()
@@ -86,76 +187,43 @@
if(!(target in ListTargets()))
LostTarget()
return 0
if(isturf(loc) && target.Adjacent(src)) //Attacking
if(isturf(loc) && target.Adjacent(src))
AttackingTarget()
return 1
/mob/living/simple_animal/hostile/proc/AttackingTarget()
if(isliving(target))
var/mob/living/L = target
L.attack_animal(src)
return L
if(istype(target,/obj/mecha))
var/obj/mecha/M = target
M.attack_animal(src)
return M
target.attack_animal(src)
/mob/living/simple_animal/hostile/proc/Aggro()
vision_range = aggro_vision_range
/mob/living/simple_animal/hostile/proc/LoseAggro()
stop_automated_movement = 0
vision_range = idle_vision_range
/mob/living/simple_animal/hostile/proc/LoseTarget()
stance = HOSTILE_STANCE_IDLE
target = null
walk(src, 0)
LoseAggro()
/mob/living/simple_animal/hostile/proc/LostTarget()
stance = HOSTILE_STANCE_IDLE
walk(src, 0)
LoseAggro()
/mob/living/simple_animal/hostile/proc/ListTargets(var/override = -1)
// Allows you to override how much the mob can see. Defaults to vision_range if none is entered.
if(override == -1)
override = vision_range
var/list/L = hearers(src, override)
for(var/obj/mecha/M in mechas_list)
// Will check the distance before checking the line of sight, if the distance is small enough.
if(get_dist(M, src) <= override && can_see(src, M, override))
L += M
return L
//////////////END HOSTILE MOB TARGETTING AND AGGRESSION////////////
/mob/living/simple_animal/hostile/Die()
LoseAggro()
mouse_opacity = 1
..()
walk(src, 0)
/mob/living/simple_animal/hostile/Life()
. = ..()
if(!.)
walk(src, 0)
return 0
if(client)
return 0
if(!stat)
switch(stance)
if(HOSTILE_STANCE_IDLE)
var/new_target = FindTarget()
GiveTarget(new_target)
if(idle_env_destroyer)
DestroySurroundings()
if(HOSTILE_STANCE_ATTACK)
DestroySurroundings()
MoveToTarget()
if(HOSTILE_STANCE_ATTACKING)
DestroySurroundings()
AttackTarget()
/mob/living/simple_animal/hostile/proc/OpenFire(var/the_target)
var/target = the_target
visible_message("\red <b>[src]</b> fires at [target]!", 1)
visible_message("\red <b>[src]</b> [ranged_message] at [target]!", 1)
var/tturf = get_turf(target)
if(rapid)
@@ -175,11 +243,9 @@
Shoot(tturf, src.loc, src)
if(casingtype)
new casingtype
LoseTarget()
ranged_cooldown = ranged_cooldown_cap
return
/mob/living/simple_animal/hostile/proc/Shoot(var/target, var/start, var/user, var/bullet = 0)
if(target == start)
return
@@ -199,9 +265,27 @@
return
/mob/living/simple_animal/hostile/proc/DestroySurroundings()
for(var/dir in cardinal) // North, South, East, West
for(var/obj/structure/obstacle in get_step(src, dir))
if(!obstacle.Adjacent(src))
continue
if(istype(obstacle, /obj/structure/window) || istype(obstacle, /obj/structure/closet) || istype(obstacle, /obj/structure/table) || istype(obstacle, /obj/structure/grille))
obstacle.attack_animal(src)
if(environment_smash)
EscapeConfinement()
for(var/dir in cardinal)
var/turf/T = get_step(src, dir)
if(istype(T, /turf/simulated/wall))
T.attack_animal(src)
for(var/atom/A in T)
if(istype(A, /obj/structure/window) || istype(A, /obj/structure/closet) || istype(A, /obj/structure/table) || istype(A, /obj/structure/grille) || istype(A, /obj/structure/rack))
A.attack_animal(src)
return
/mob/living/simple_animal/hostile/proc/EscapeConfinement()
if(buckled)
buckled.attack_animal(src)
if(!isturf(src.loc) && src.loc != null)//Did someone put us in something?
var/atom/A = src.loc
A.attack_animal(src)//Bang on it till we get out
return
/mob/living/simple_animal/hostile/proc/FindHidden(var/atom/hidden_target)
if(istype(target.loc, /obj/structure/closet) || istype(target.loc, /obj/machinery/disposal) || istype(target.loc, /obj/machinery/sleeper))
return 1
else
return 0
@@ -0,0 +1,310 @@
/mob/living/simple_animal/hostile/asteroid/
vision_range = 2
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 15
faction = "mining"
environment_smash = 2
minbodytemp = 0
heat_damage_per_tick = 20
response_help = "pokes"
response_disarm = "shoves"
response_harm = "strikes"
status_flags = 0
a_intent = "harm"
var/throw_message = "bounces off of"
var/icon_aggro = null // for swapping to when we get aggressive
/mob/living/simple_animal/hostile/asteroid/Aggro()
..()
icon_state = icon_aggro
/mob/living/simple_animal/hostile/asteroid/LoseAggro()
..()
icon_state = icon_living
/mob/living/simple_animal/hostile/asteroid/bullet_act(var/obj/item/projectile/P)//Limits the weapons available to kill them at range
if(!stat)
Aggro()
if(P.damage < 30)
visible_message("<span class='danger'>The [P.name] had no effect on [src.name]!</span>")
return
..()
/mob/living/simple_animal/hostile/asteroid/hitby(atom/movable/AM)//No floor tiling them to death, wiseguy
if(istype(AM, /obj/item))
var/obj/item/T = AM
if(!stat)
Aggro()
if(T.throwforce <= 15)
visible_message("<span class='notice'>The [T.name] [src.throw_message] [src.name]!</span>")
return
..()
/mob/living/simple_animal/hostile/asteroid/basilisk
name = "basilisk"
desc = "A territorial beast, covered in a thick shell that absorbs energy. Its stare causes victims to freeze from the inside."
icon = 'icons/mob/animal.dmi'
icon_state = "Basilisk"
icon_living = "Basilisk"
icon_aggro = "Basilisk_alert"
icon_dead = "Basilisk_dead"
icon_gib = "syndicate_gib"
move_to_delay = 20
projectiletype = /obj/item/projectile/temp/basilisk
projectilesound = 'sound/weapons/pierce.ogg'
ranged = 1
ranged_message = "stares"
ranged_cooldown_cap = 8
throw_message = "does nothing against the hard shell of"
vision_range = 2
speed = 3
maxHealth = 200
health = 200
harm_intent_damage = 5
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "bites into"
a_intent = "harm"
attack_sound = 'sound/weapons/bladeslice.ogg'
ranged_cooldown_cap = 4
aggro_vision_range = 9
idle_vision_range = 2
/obj/item/projectile/temp/basilisk
name = "freezing blast"
icon_state = "ice_2"
damage = 0
damage_type = BURN
nodamage = 1
flag = "energy"
temperature = 50
/mob/living/simple_animal/hostile/asteroid/basilisk/GiveTarget(var/new_target)
target = new_target
if(target != null)
Aggro()
stance = HOSTILE_STANCE_ATTACK
if(isliving(target))
var/mob/living/L = target
if(L.bodytemperature > 261)
L.bodytemperature = 261
visible_message("<span class='danger'>The [src.name]'s stare chills [L.name] to the bone!</span>")
return
/mob/living/simple_animal/hostile/asteroid/goldgrub
name = "goldgrub"
desc = "A worm that grows fat from eating everything in its sight. Seems to enjoy precious metals and other shiny things, hence the name."
icon = 'icons/mob/animal.dmi'
icon_state = "Goldgrub"
icon_living = "Goldgrub"
icon_aggro = "Goldgrub_alert"
icon_dead = "Goldgrub_dead"
icon_gib = "syndicate_gib"
vision_range = 6
aggro_vision_range = 9
idle_vision_range = 6
move_to_delay = 3
friendly = "harmlessly rolls into"
maxHealth = 45
health = 45
harm_intent_damage = 5
melee_damage_lower = 0
melee_damage_upper = 0
attacktext = "barrels into"
a_intent = "help"
throw_message = "sinks in slowly, before being pushed out of "
status_flags = CANPUSH
search_objects = 2
wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver, /obj/item/weapon/ore/plasma,
/obj/item/weapon/ore/uranium, /obj/item/weapon/ore/iron, /obj/item/weapon/ore/clown)
var/alerted = 0
/mob/living/simple_animal/hostile/asteroid/goldgrub/GiveTarget(var/new_target)
target = new_target
if(target != null)
if(istype(target, /obj/item/weapon/ore))
visible_message("<span class='notice'>The [src.name] looks at [target.name] with hungry eyes.</span>")
stance = HOSTILE_STANCE_ATTACK
if(isliving(target) && !search_objects)
Aggro()
stance = HOSTILE_STANCE_ATTACK
visible_message("<span class='danger'>The [src.name] tries to flee from [target.name]!</span>")
retreat_distance = 10
Burrow()
return
/obj/item/weapon/ore/attack_animal(var/mob/living/L)
if(istype(L, /mob/living/simple_animal/hostile/asteroid/goldgrub))
L.visible_message("<span class='notice'>The [src.name] was swallowed whole!</span>")
del(src)
..()
/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/Burrow()//Begin the chase to kill the goldgrub in time
if(!alerted)
alerted = 1
spawn(100)
if(alerted)
visible_message("<span class='danger'>The [src.name] buries into the ground, vanishing from sight!</span>")
del(src)
/mob/living/simple_animal/hostile/asteroid/goldgrub/bullet_act(var/obj/item/projectile/P)
visible_message("<span class='danger'>The [P.name] was repelled by [src.name]'s girth!</span>")
return
/mob/living/simple_animal/hostile/asteroid/goldgrub/Die()
alerted = 0
..()
/mob/living/simple_animal/hostile/asteroid/hivelord
name = "hivelord"
desc = "A truly alien creature, it is a mass of unknown organic material, constantly fluctuating. When attacking, pieces of it split off and attack in tandem with the original."
icon = 'icons/mob/animal.dmi'
icon_state = "Hivelord"
icon_living = "Hivelord"
icon_aggro = "Hivelord_alert"
icon_dead = "Hivelord_dead"
icon_gib = "syndicate_gib"
mouse_opacity = 2
move_to_delay = 12
ranged = 1
vision_range = 5
aggro_vision_range = 9
idle_vision_range = 5
speed = 3
maxHealth = 75
health = 75
harm_intent_damage = 5
melee_damage_lower = 2
melee_damage_upper = 2
attacktext = "lashes out at"
throw_message = "falls right through the strange body of the"
ranged_cooldown = 0
ranged_cooldown_cap = 0
environment_smash = 0
retreat_distance = 5
minimum_distance = 5
pass_flags = PASSTABLE
/mob/living/simple_animal/hostile/asteroid/hivelord/OpenFire(var/the_target)
var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/A = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood(src.loc)
A.GiveTarget(target)
return
/mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget()
OpenFire()
..()
/mob/living/simple_animal/hostile/asteroid/hivelordbrood
name = "hivelord brood"
desc = "A fragment of the original Hivelord, rallying behind its original. One isn't much of a threat, but..."
icon = 'icons/mob/animal.dmi'
icon_state = "Hivelordbrood"
icon_living = "Hivelordbrood"
icon_aggro = "Hivelordbrood"
icon_dead = "Hivelordbrood"
icon_gib = "syndicate_gib"
mouse_opacity = 2
move_to_delay = 0
friendly = "buzzes near"
vision_range = 10
speed = 3
maxHealth = 1
health = 1
harm_intent_damage = 5
melee_damage_lower = 2
melee_damage_upper = 2
attacktext = "slashes"
throw_message = "falls right through the strange body of the"
environment_smash = 0
pass_flags = PASSTABLE
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/New()
..()
spawn(100)
del(src)
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/Die()
del(src)
/mob/living/simple_animal/hostile/asteroid/goliath
name = "goliath"
desc = "A massive beast that uses long tentacles to ensare its prey, threatening them is not advised under any conditions."
icon = 'icons/mob/animal.dmi'
icon_state = "Goliath"
icon_living = "Goliath"
icon_aggro = "Goliath_alert"
icon_dead = "Goliath_dead"
icon_gib = "syndicate_gib"
attack_sound = 'sound/weapons/punch4.ogg'
mouse_opacity = 2
move_to_delay = 40
ranged = 1
ranged_cooldown_cap = 8
friendly = "wails at"
vision_range = 5
speed = 3
maxHealth = 300
health = 300
harm_intent_damage = 0
melee_damage_lower = 25
melee_damage_upper = 25
attacktext = "pulverizes"
throw_message = "does nothing to the rocky hide of the"
aggro_vision_range = 9
idle_vision_range = 5
/mob/living/simple_animal/hostile/asteroid/goliath/OpenFire()
visible_message("<span class='warning'>The [src.name] digs its tentacles under [target.name]!</span>")
var/tturf = get_turf(target)
new /obj/effect/goliath_tentacle/original(tturf)
ranged_cooldown = ranged_cooldown_cap
return
/mob/living/simple_animal/hostile/asteroid/goliath/adjustBruteLoss(var/damage)
ranged_cooldown--
..()
/obj/effect/goliath_tentacle/
name = "Goliath tentacle"
icon = 'icons/mob/animal.dmi'
icon_state = "Goliath_tentacle"
/obj/effect/goliath_tentacle/New()
var/turftype = get_turf(src)
if(istype(turftype, /turf/simulated/mineral))
var/turf/simulated/mineral/M = turftype
M.gets_drilled()
spawn(20)
Trip()
/obj/effect/goliath_tentacle/original
/obj/effect/goliath_tentacle/original/New()
var/list/directions = cardinal.Copy()
var/counter
for(counter = 1, counter <= 3, counter++)
var/spawndir = pick(directions)
directions -= spawndir
var/turf/T = get_step(src,spawndir)
new /obj/effect/goliath_tentacle(T)
..()
/obj/effect/goliath_tentacle/proc/Trip()
for(var/mob/living/M in src.loc)
M.Weaken(5)
visible_message("<span class='warning'>The [src.name] knocks [M.name] down!</span>")
del(src)
/obj/effect/goliath_tentacle/Crossed(AM as mob|obj)
if(isliving(AM))
Trip()
return
..()
@@ -33,7 +33,6 @@
var/weapon1 = /obj/item/weapon/melee/energy/sword/pirate
faction = "pirate"
idle_env_destroyer = 0
/mob/living/simple_animal/hostile/pirate/ranged
name = "Pirate Gunner"
@@ -43,6 +42,8 @@
projectilesound = 'sound/weapons/laser.ogg'
ranged = 1
rapid = 1
retreat_distance = 5
minimum_distance = 5
projectiletype = /obj/item/projectile/beam
corpse = /obj/effect/landmark/mobcorpse/pirate/ranged
weapon1 = /obj/item/weapon/gun/energy/laser
@@ -32,7 +32,6 @@
unsuitable_atoms_damage = 15
faction = "russian"
status_flags = CANPUSH
idle_env_destroyer = 0
/mob/living/simple_animal/hostile/russian/ranged
@@ -41,6 +40,8 @@
corpse = /obj/effect/landmark/mobcorpse/russian/ranged
weapon1 = /obj/item/weapon/gun/projectile/revolver/mateba
ranged = 1
retreat_distance = 5
minimum_distance = 5
projectiletype = /obj/item/projectile/bullet
projectilesound = 'sound/weapons/Gunshot.ogg'
casingtype = /obj/item/ammo_casing/a357
@@ -31,10 +31,8 @@
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 15
wall_smash = 1
faction = "syndicate"
status_flags = CANPUSH
idle_env_destroyer = 0
/mob/living/simple_animal/hostile/syndicate/Die()
..()
@@ -105,6 +103,8 @@
/mob/living/simple_animal/hostile/syndicate/ranged
ranged = 1
rapid = 1
retreat_distance = 5
minimum_distance = 5
icon_state = "syndicateranged"
icon_living = "syndicateranged"
casingtype = /obj/item/ammo_casing/a12mm
@@ -53,7 +53,7 @@
var/attacktext = "attacks"
var/attack_sound = null
var/friendly = "nuzzles" //If the mob does no damage with it's attack
var/wall_smash = 0 //if they can smash walls
var/environment_smash = 0 //Set to 1 to allow breaking of crates,lockers,racks,tables; 2 for walls; 3 for Rwalls
var/speed = 0 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster
+1
View File
@@ -94,6 +94,7 @@
var/obj/item/weapon/storage/s_active = null//Carbon
var/seer = 0 //for cult//Carbon, probably Human
var/see_override = 0 //0 for no override, sets see_invisible = see_override in mob life process
var/datum/hud/hud_used = null
+13
View File
@@ -220,6 +220,19 @@
return(OXYLOSS)
/obj/item/weapon/cable_coil/attack(mob/living/carbon/human/H, mob/user)
var/obj/item/organ/limb/affecting = H.get_organ(check_zone(user.zone_sel.selecting))
if(istype(H))
if(affecting.status == ORGAN_ROBOTIC)
src.item_heal_robotic(H, user, 0, 30)
src.use(1)
return
else
return ..()
else
return ..()
/obj/item/weapon/cable_coil/New(loc, length = MAXCOIL, var/param_color = null)
..()
src.amount = length
@@ -103,4 +103,10 @@
/obj/item/ammo_casing/energy/meteor
projectile_type = /obj/item/projectile/meteor
select_name = "goddamn meteor"
select_name = "goddamn meteor"
/obj/item/ammo_casing/energy/kinetic
projectile_type = /obj/item/projectile/kinetic
select_name = "kinetic"
e_cost = 500
fire_sound = 'sound/weapons/Gunshot4.ogg'
+4
View File
@@ -21,6 +21,10 @@
BB.firer = user
BB.def_zone = user.zone_sel.selecting
BB.silenced = quiet
if(reagents && BB.reagents)
reagents.trans_to(BB, reagents.total_volume) //For chemical darts/bullets
reagents.delete()
return
/obj/item/ammo_casing/proc/throw_proj(var/turf/targloc, mob/living/user as mob|obj, params)
@@ -102,4 +102,30 @@
name = "mind flayer"
desc = "A prototype weapon recovered from the ruins of Research-Station Epsilon."
icon_state = "xray"
ammo_type = list(/obj/item/ammo_casing/energy/mindflayer)
ammo_type = list(/obj/item/ammo_casing/energy/mindflayer)
/obj/item/weapon/gun/energy/kinetic_accelerator
name = "proto-kinetic accelerator"
desc = "According to Nanotrasen accounting, this is mining equipment. It's been modified for extreme power output to crush rocks, but often serves as a miner's first defense against hostile alien life; it's not very powerful unless used in a low pressure environment."
icon_state = "kineticgun"
item_state = "kineticgun"
ammo_type = list(/obj/item/ammo_casing/energy/kinetic)
cell_type = "/obj/item/weapon/cell/crap"
var/overheat = 0
var/recent_reload = 1
/obj/item/weapon/gun/energy/kinetic_accelerator/shoot_live_shot()
overheat = 1
spawn(20)
overheat = 0
recent_reload = 0
..()
/obj/item/weapon/gun/energy/kinetic_accelerator/attack_self(var/mob/living/user/L)
if(overheat || recent_reload)
return
power_supply.give(500)
playsound(src.loc, 'sound/weapons/shotgunpump.ogg', 60, 1)
recent_reload = 1
update_icon()
return
@@ -36,11 +36,6 @@
else if (magazine.ammo_count())
chambered = magazine.get_round()
chambered.loc = src
if(chambered.BB)
if(chambered.reagents && chambered.BB.reagents)
var/datum/reagents/casting_reagents = chambered.reagents
casting_reagents.trans_to(chambered.BB, casting_reagents.total_volume) //For chemical darts/bullets
casting_reagents.delete()
return
/obj/item/weapon/gun/projectile/attackby(var/obj/item/A as obj, mob/user as mob)
+4
View File
@@ -141,4 +141,8 @@
if(!(original in permutated))
Bump(original)
sleep(1)
Range()
return
/obj/item/projectile/proc/Range()
return
@@ -1,17 +0,0 @@
/obj/item/projectile/animate
name = "bolt of animation"
icon_state = "red_1"
damage = 0
damage_type = BURN
nodamage = 1
flag = "energy"
/obj/item/projectile/animate/Bump(var/atom/change)
. = ..()
if(istype(change, /obj/item) || istype(change, /obj/structure) && !is_type_in_list(change, protected_objects))
var/obj/O = change
new /mob/living/simple_animal/hostile/mimic/copy(O.loc, O, firer)
else if(istype(change, /mob/living/simple_animal/hostile/mimic/copy))
// Change our allegiance!
var/mob/living/simple_animal/hostile/mimic/copy/C = change
C.ChangeOwner(firer)
@@ -1,112 +0,0 @@
/obj/item/projectile/change
name = "bolt of change"
icon_state = "ice_1"
damage = 0
damage_type = BURN
nodamage = 1
flag = "energy"
on_hit(var/atom/change)
wabbajack(change)
/obj/item/projectile/change/proc/wabbajack (mob/M as mob in living_mob_list)
if(istype(M, /mob/living) && M.stat != DEAD)
if(M.notransform) return
M.notransform = 1
M.canmove = 0
M.icon = null
M.overlays.Cut()
M.invisibility = 101
if(istype(M, /mob/living/silicon/robot))
var/mob/living/silicon/robot/Robot = M
if(Robot.mmi) del(Robot.mmi)
else
for(var/obj/item/W in M)
if(istype(W, /obj/item/weapon/implant)) //TODO: Carn. give implants a dropped() or something
del(W)
continue
W.layer = initial(W.layer)
W.loc = M.loc
W.dropped(M)
var/mob/living/new_mob
var/randomize = pick("monkey","robot","slime","xeno","human","animal")
switch(randomize)
if("monkey")
new_mob = new /mob/living/carbon/monkey(M.loc)
new_mob.universal_speak = 1
if("robot")
new_mob = new /mob/living/silicon/robot(M.loc)
new_mob.gender = M.gender
new_mob.invisibility = 0
new_mob.job = "Cyborg"
var/mob/living/silicon/robot/Robot = new_mob
Robot.mmi = new /obj/item/device/mmi(new_mob)
Robot.mmi.transfer_identity(M) //Does not transfer key/client.
if("slime")
if(prob(50)) new_mob = new /mob/living/carbon/slime/adult(M.loc)
else new_mob = new /mob/living/carbon/slime(M.loc)
new_mob.universal_speak = 1
if("xeno")
if(prob(50))
new_mob = new /mob/living/carbon/alien/humanoid/hunter(M.loc)
else
new_mob = new /mob/living/carbon/alien/humanoid/sentinel(M.loc)
new_mob.universal_speak = 1
/*var/alien_caste = pick("Hunter","Sentinel","Drone","Larva")
switch(alien_caste)
if("Hunter") new_mob = new /mob/living/carbon/alien/humanoid/hunter(M.loc)
if("Sentinel") new_mob = new /mob/living/carbon/alien/humanoid/sentinel(M.loc)
if("Drone") new_mob = new /mob/living/carbon/alien/humanoid/drone(M.loc)
else new_mob = new /mob/living/carbon/alien/larva(M.loc)
new_mob.universal_speak = 1*/
if("animal")
var/animal = pick("parrot","corgi","crab","pug","cat","carp","bear","mushroom","tomato","mouse","chicken","cow","lizard","chick")
switch(animal)
if("parrot") new_mob = new /mob/living/simple_animal/parrot(M.loc)
if("corgi") new_mob = new /mob/living/simple_animal/corgi(M.loc)
if("crab") new_mob = new /mob/living/simple_animal/crab(M.loc)
if("pug") new_mob = new /mob/living/simple_animal/pug(M.loc)
if("cat") new_mob = new /mob/living/simple_animal/cat(M.loc)
if("carp") new_mob = new /mob/living/simple_animal/hostile/carp(M.loc)
if("bear") new_mob = new /mob/living/simple_animal/hostile/bear(M.loc)
if("mushroom") new_mob = new /mob/living/simple_animal/mushroom(M.loc)
if("tomato") new_mob = new /mob/living/simple_animal/tomato(M.loc)
if("mouse") new_mob = new /mob/living/simple_animal/mouse(M.loc)
if("chicken") new_mob = new /mob/living/simple_animal/chicken(M.loc)
if("cow") new_mob = new /mob/living/simple_animal/cow(M.loc)
if("lizard") new_mob = new /mob/living/simple_animal/lizard(M.loc)
else new_mob = new /mob/living/simple_animal/chick(M.loc)
new_mob.universal_speak = 1
if("human")
new_mob = new /mob/living/carbon/human(M.loc)
var/datum/preferences/A = new() //Randomize appearance for the human
A.copy_to(new_mob)
var/mob/living/carbon/human/H = new_mob
ready_dna(H)
if(H.dna)
H.dna.mutantrace = pick("lizard","golem","slime","plant","fly","shadow","adamantine","skeleton",8;"")
H.update_body()
else
return
for (var/obj/effect/proc_holder/spell/S in M.spell_list)
new_mob.spell_list += new S.type
new_mob.a_intent = "harm"
if(M.mind)
M.mind.transfer_to(new_mob)
else
new_mob.key = M.key
new_mob << "<B>Your form morphs into that of a [randomize].</B>"
del(M)
return new_mob
@@ -135,3 +135,46 @@
var/mob/living/carbon/human/M = target
M.adjustBrainLoss(20)
M.hallucination += 20
/obj/item/projectile/kinetic
name = "kinetic force"
icon_state = null
damage = 15
damage_type = BRUTE
flag = "bomb"
var/range = 2
obj/item/projectile/kinetic/New()
var/turf/proj_turf = get_turf(src)
if(!istype(proj_turf, /turf))
return
var/datum/gas_mixture/environment = proj_turf.return_air()
var/pressure = environment.return_pressure()
if(pressure < 50)
name = "full strength kinetic force"
damage = 30
..()
/obj/item/projectile/kinetic/Range()
range--
if(range <= 0)
new /obj/item/effect/kinetic_blast(src.loc)
delete()
/obj/item/projectile/kinetic/on_hit(var/atom/target)
var/turf/target_turf= get_turf(target)
if(istype(target_turf, /turf/simulated/mineral))
var/turf/simulated/mineral/M = target_turf
M.gets_drilled()
new /obj/item/effect/kinetic_blast(target_turf)
..()
/obj/item/effect/kinetic_blast
name = "kinetic explosion"
icon = 'icons/obj/projectiles.dmi'
icon_state = "kinetic_blast"
layer = 4.1
/obj/item/effect/kinetic_blast/New()
spawn(4)
del(src)
+18 -11
View File
@@ -1,35 +1,42 @@
/proc/GetColors(hex)
hex = uppertext(hex)
var/hi1 = text2ascii(hex, 2)
var/lo1 = text2ascii(hex, 3)
var/hi2 = text2ascii(hex, 4)
var/lo2 = text2ascii(hex, 5)
var/hi3 = text2ascii(hex, 6)
var/lo3 = text2ascii(hex, 7)
// No alpha set? Default to full alpha.
if(length(hex) == 7)
hex += "FF"
var/hi1 = text2ascii(hex, 2) // R
var/lo1 = text2ascii(hex, 3) // R
var/hi2 = text2ascii(hex, 4) // G
var/lo2 = text2ascii(hex, 5) // G
var/hi3 = text2ascii(hex, 6) // B
var/lo3 = text2ascii(hex, 7) // B
var/hi4 = text2ascii(hex, 8) // A
var/lo4 = text2ascii(hex, 9) // A
return list(((hi1>= 65 ? hi1-55 : hi1-48)<<4) | (lo1 >= 65 ? lo1-55 : lo1-48),
((hi2 >= 65 ? hi2-55 : hi2-48)<<4) | (lo2 >= 65 ? lo2-55 : lo2-48),
((hi3 >= 65 ? hi3-55 : hi3-48)<<4) | (lo3 >= 65 ? lo3-55 : lo3-48))
((hi3 >= 65 ? hi3-55 : hi3-48)<<4) | (lo3 >= 65 ? lo3-55 : lo3-48),
((hi4 >= 65 ? hi4-55 : hi4-48)<<4) | (lo4 >= 65 ? lo4-55 : lo4-48))
/proc/mix_color_from_reagents(var/list/reagent_list)
if(!reagent_list || !reagent_list.len) return 0
var/list/rgbcolor = list(0,0,0)
var/list/rgbcolor = list(0,0,0,0)
var/finalcolor = 0
for(var/datum/reagent/re in reagent_list) // natural color mixing bullshit/algorithm
if(!finalcolor)
rgbcolor = GetColors(re.color)
finalcolor = re.color
else
var/newcolor[3]
var/prergbcolor[3]
var/newcolor[4]
var/prergbcolor[4]
prergbcolor = rgbcolor
newcolor = GetColors(re.color)
rgbcolor[1] = (prergbcolor[1]+newcolor[1])/2
rgbcolor[2] = (prergbcolor[2]+newcolor[2])/2
rgbcolor[3] = (prergbcolor[3]+newcolor[3])/2
rgbcolor[4] = (prergbcolor[4]+newcolor[4])/2
finalcolor = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3])
finalcolor = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3], rgbcolor[4])
return finalcolor
// This isn't a perfect color mixing system, the more reagents that are inside,
@@ -407,6 +407,11 @@ datum
return 1
add_reagent_list(var/list/list_reagents, var/list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15)
for(var/r_id in list_reagents)
var/amt = list_reagents[r_id]
add_reagent(r_id, amt, data)
remove_reagent(var/reagent, var/amount, var/safety)//Added a safety check for the trans_id_to
if(!isnum(amount)) return 1
@@ -485,5 +490,7 @@ datum
// Convenience proc to create a reagents holder for an atom
// Max vol is maximum volume of holder
atom/proc/create_reagents(var/max_vol)
if(reagents)
reagents.delete()
reagents = new/datum/reagents(max_vol)
reagents.my_atom = src
+4 -3
View File
@@ -109,15 +109,15 @@
if(temp)
chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("dispense" = temp.id)))) // list in a list because Byond merges the first list...
data["chemicals"] = chemicals
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "chem_dispenser.tmpl", "Chem Dispenser 5000", 390, 610)
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
ui.set_initial_data(data)
// open the new ui window
ui.open()
@@ -776,6 +776,7 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
/obj/item/toy/crayon/green = list("greencrayonpowder" = 10),
/obj/item/toy/crayon/blue = list("bluecrayonpowder" = 10),
/obj/item/toy/crayon/purple = list("purplecrayonpowder" = 10),
/obj/item/toy/crayon/mime = list("invisiblecrayonpowder" = 50),
//Blender Stuff
/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = list("soymilk" = 0),
+8 -18
View File
@@ -209,7 +209,7 @@ datum
id = "water"
description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen."
reagent_state = LIQUID
color = "#0064C8" // rgb: 0, 100, 200
color = "#AAAAAA77" // rgb: 170, 170, 170, 77 (alpha)
reaction_turf(var/turf/simulated/T, var/volume)
if (!istype(T)) return
@@ -1291,7 +1291,7 @@ datum
id = "plasma"
description = "Plasma in its liquid form."
reagent_state = LIQUID
color = "#E71B00" // rgb: 231, 27, 0
color = "#DB2D08" // rgb: 219, 45, 8
toxpwr = 3
on_mob_life(var/mob/living/M as mob)
@@ -1675,52 +1675,42 @@ datum
name = "Red Crayon Powder"
id = "redcrayonpowder"
colorname = "red"
color = "#DA0000" // red
New()
..()
crayonpowder/orange
name = "Orange Crayon Powder"
id = "orangecrayonpowder"
colorname = "orange"
color = "#FF9300" // orange
New()
..()
crayonpowder/yellow
name = "Yellow Crayon Powder"
id = "yellowcrayonpowder"
colorname = "yellow"
color = "#FFF200" // yellow
New()
..()
crayonpowder/green
name = "Green Crayon Powder"
id = "greencrayonpowder"
colorname = "green"
color = "#A8E61D" // green
New()
..()
crayonpowder/blue
name = "Blue Crayon Powder"
id = "bluecrayonpowder"
colorname = "blue"
color = "#00B7EF" // blue
New()
..()
crayonpowder/purple
name = "Purple Crayon Powder"
id = "purplecrayonpowder"
colorname = "purple"
color = "#DA00FF" // purple
New()
..()
crayonpowder/invisible
name = "Invisible Crayon Powder"
id = "invisiblecrayonpowder"
colorname = "invisible"
color = "#FFFFFF00" // white + no alpha
/////////////////////////Food Reagents////////////////////////////
@@ -98,10 +98,11 @@
else
name = "misc Condiment Bottle"
main_reagent = reagents.get_master_reagent_name()
if (reagents.reagent_list.len==1)
desc = "Looks like it is [main_reagent], but you are not sure."
desc = "Looks like it is [lowertext(main_reagent)], but you are not sure."
else
desc = "A mixture of various condiments. [main_reagent] is one of them."
desc = "A mixture of various condiments. [lowertext(main_reagent)] is one of them."
icon_state = "mixedcondiments"
else
icon_state = "emptycondiment"
+7
View File
@@ -242,6 +242,13 @@
*/
interact(user, 0)
// hostile mob escape from disposals
/obj/machinery/disposal/attack_animal(var/mob/living/simple_animal/M)
if(M.environment_smash)
visible_message("<span class='danger'>[M.name] smashes [src] apart!</span>")
del(src)
return
// user interaction
/obj/machinery/disposal/interact(mob/user, var/ai=0)
+1 -1
View File
@@ -58,7 +58,7 @@
//saw bone
/datum/surgery_step/saw
implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/hatchet = 35, /obj/item/weapon/butch = 25)
implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/melee/arm_blade = 75, /obj/item/weapon/hatchet = 35, /obj/item/weapon/butch = 25)
time = 64
/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+24
View File
@@ -151,6 +151,30 @@
return update_organ_icon()
/obj/item/proc/item_heal_robotic(var/mob/living/carbon/human/H, var/mob/user, var/brute, var/burn)
var/obj/item/organ/limb/affecting = H.get_organ(check_zone(user.zone_sel.selecting))
var/dam //changes repair text based on how much brute/burn was supplied
if(brute > burn)
dam = 1
else
dam = 0
if(affecting.status == ORGAN_ROBOTIC)
if(brute > 0 && affecting.brute_dam > 0 || burn > 0 && affecting.burn_dam > 0)
affecting.heal_damage(brute,burn,1)
H.update_damage_overlays(0)
H.updatehealth()
for(var/mob/O in viewers(user, null))
O.show_message(text("<span class='notice'>[user] has fixed some of the [dam ? "dents on" : "burnt wires in"] [H]'s [affecting.getDisplayName()]!</span>"), 1)
return
else
user << "<span class='notice'>[H]'s [affecting.getDisplayName()] is already in good condition</span>"
return
else
return
//Returns total damage...kinda pointless really
/obj/item/organ/limb/proc/get_damage()
return brute_dam + burn_dam
+1
View File
@@ -85,6 +85,7 @@
icon = 'icons/obj/surgery.dmi'
icon_state = "saw"
hitsound = 'sound/weapons/circsawhit.ogg'
throwhitsound = 'sound/weapons/pierce.ogg'
flags = CONDUCT
force = 15.0
w_class = 3.0
+2
View File
@@ -128,6 +128,8 @@
src.sight &= ~SEE_OBJS
src.see_in_dark = 8
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
if(see_override)
see_invisible = see_override
if (src.healths)
if (src.stat != 2)
+2 -1
View File
@@ -10,6 +10,7 @@
rolan7 = Game Master
quarxink = Game Master
adrix89 = Game Master
tle = Game Master
xsi = Game Master
scaredofshadows = Game Master
@@ -53,4 +54,4 @@ kazeespada = Game Master
rumia29 = Game Master
bobylein = Game Master
sirbayer = Game Master
hornygranny = Game Master
hornygranny = Game Master
+36 -2
View File
@@ -35,7 +35,7 @@
<td valign='top'>
<font size='2'><b>Current Project Maintainers:</b> <a href='https://github.com/tgstation?tab=members'>-Click Here-</a><br></font>
<font size='2'><b>Currently Active GitHub contributor list:</b> <a href='https://github.com/tgstation/-tg-station/graphs/contributors'>-Click Here-</a><br></font>
<font size='2'><b>Coders:</b> TLE, NEO, Errorage, muskets, veryinky, Skie, Noise, Numbers, Agouri, Noka, Urist McDorf, Uhangi, Darem, Mport, rastaf0, Doohl, Superxpdude, Rockdtben, ConstantA, Petethegoat, Kor, Polymorph, Carn, Nodrak, Donkie, Sieve, Giacom, Ikarrus, trubble_bass, Aranclanos, Cael_Aislinn, Cheridan, Intigracy, Malkevin, SuperSayu, DumpDavidson, Tastyfish, Yvar, Elo001, Fleure, ManeaterMildred.<br></font>
<font size='2'><b>Coders:</b> TLE, NEO, Errorage, muskets, veryinky, Skie, Noise, Numbers, Agouri, Noka, Urist McDorf, Uhangi, Darem, Mport, rastaf0, Doohl, Superxpdude, Rockdtben, ConstantA, Petethegoat, Kor, Polymorph, Carn, Nodrak, Donkie, Sieve, Giacom, Ikarrus, trubble_bass, Aranclanos, Cael_Aislinn, Cheridan, Intigracy, Malkevin, SuperSayu, DumpDavidson, Tastyfish, Yvar, Elo001, Fleure, ManeaterMildred, Miauw.<br></font>
<font size='2'><b>Spriters:</b> Agouri, Cheridan, Cruazy Guest, Deeaych, Deuryn, Matty406, Microwave, ShiftyEyesShady, Skie, Uhangi, Veyveyr, Petethegoat, Kor, Ricotez, Ausops, TankNut, Pewtershmitz, Firecage, Nienhaus2<br></font>
<font size='2'><b>Sounds:</b> Skie, Lasty/Vinyl<br></font>
<font size='2'><b>Main Testers:</b> Tenebrosity<br></font>
@@ -52,7 +52,41 @@ should be listed in the changelog upon commit tho. Thanks. -->
<!-- You can simply add changelogs using AddToChangelog.exe -->
<!-- DO NOT REMOVE OR MOVE THIS COMMENT! THIS MUST BE THE LAST NON-EMPTY LINE BEFORE THE LOGS #ADDTOCHANGELOGMARKER# --><div class='commit sansserif'>
<!-- DO NOT REMOVE OR MOVE THIS COMMENT! THIS MUST BE THE LAST NON-EMPTY LINE BEFORE THE LOGS #ADDTOCHANGELOGMARKER# -->␍␍
<div class='commit sansserif'>
<h2 class='date'>26 January 2014</h2>
<h3 class='author'>Balrog updated:</h3>
<ul class='changes bgimages16'>
<li class='rscadd'>Syndicate Playing Cards can now be found on the Syndicate Mothership and purchased from uplinks for 1 telecrystal.</li>
<li class='rscadd'>Syndicate Playing Cards are lethal weapons both in melee and when thrown, but make the user's true allegiance to the Syndicate obvious.</li>
<li class='imageadd'>Sprites are courtesy of Nienhaus.</li>
</ul>
</div>
<div class='commit sansserif'>
<h2 class='date'>25 januari 2014</h2>
<h3 class='author'>Miauw updated:</h3>
<ul class='changes bgimages16'>
<li class='rscadd'>Adds changeling arm blades that cost 20 chems and do 25 brute damage.</li>
<li class='rscadd'>Arm blades can pry open unpowered doors, replace surgical saws in brain removal, slice tables and smash computers.</li>
</ul>
</div>
<div class='commit sansserif'>
<h2 class='date'>24 January 2014</h2>
<h3 class='author'>Ergovisavi updated:</h3>
<ul class='changes bgimages16'>
<li class='rscadd'>Gibtonite, the explosive ore, can now be found on the asteroid. It's very hard to tell between it and diamonds, at first glance.</li>
<li class='rscadd'>Gibtonite deposits will blow up after a countdown when you attempt to mine it, but you can stop it with an analyzer at any time. It makes for a good mining explosive.</li>
<li class='rscadd'>The closer you were to the explosion when you analyze the Gibtonite deposit, the better the Gibtonite you can get from it.</li>
<li class='rscadd'>Once extracted, it must be struck with a pickaxe or drill to activate it, where it will go through its countdown again to explode!</li>
<li class='tweak'>Explosives will no longer destroy the ore inside of asteroid walls or lying on the floor.</li>
</ul>
</div>
<div class='commit sansserif'>
<h2 class='date'>21 January 2014</h2>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 446 KiB

After

Width:  |  Height:  |  Size: 447 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

After

Width:  |  Height:  |  Size: 148 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 971 B

After

Width:  |  Height:  |  Size: 957 B

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More