mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-24 04:27:35 +01:00
Energy projectiles work again.
Rewrote the job selection system to use bitflags and the jobs are now objects. Fixed a path conflict with effect which caused a few things to be unable to be clicked on. Commented out the job.txt, Urist if you still want it to load from the .txt give me a yell and I can update it to work with the job objects. Fixed up the bits that were missing the slightly updated mob organ attack code. Moved the traps file into unused. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2340 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
@@ -392,10 +392,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
//Now for special roles and equipment.
|
||||
switch(new_character.mind.special_role)
|
||||
if("Changeling")
|
||||
new_character.Equip_Rank(new_character.mind.assigned_role, joined_late=1)
|
||||
job_master.EquipRank(new_character, new_character.mind.assigned_role, 1)
|
||||
new_character.make_changeling()
|
||||
if("traitor")
|
||||
new_character.Equip_Rank(new_character.mind.assigned_role, joined_late=1)
|
||||
job_master.EquipRank(new_character, new_character.mind.assigned_role, 1)
|
||||
ticker.mode.equip_traitor(new_character)
|
||||
if("Wizard")
|
||||
new_character.loc = pick(wizardstart)
|
||||
@@ -433,7 +433,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
call(/datum/game_mode/proc/add_law_zero)(new_character)
|
||||
//Add aliens.
|
||||
else
|
||||
new_character.Equip_Rank(new_character.mind.assigned_role, joined_late=1)//Or we simply equip them.
|
||||
job_master.EquipRank(new_character, new_character.mind.assigned_role, 1)//Or we simply equip them.
|
||||
|
||||
//Announces the character on all the systems, based on the record.
|
||||
if(!issilicon(new_character))//If they are not a cyborg/AI.
|
||||
|
||||
@@ -24,7 +24,7 @@ datum
|
||||
var/datum/reagent/self = src
|
||||
src = null //of the reagent to the mob on TOUCHING it.
|
||||
|
||||
if(!istype(self.holder.my_atom, /obj/effect/chem_smoke))
|
||||
if(!istype(self.holder.my_atom, /obj/effect/effect/chem_smoke))
|
||||
// If the chemicals are in a smoke cloud, do not try to let the chemicals "penetrate" into the mob's system (balance station 13) -- Doohl
|
||||
|
||||
if(method == TOUCH)
|
||||
@@ -644,7 +644,7 @@ datum
|
||||
return
|
||||
|
||||
if(prob(15) && istype(M, /mob/living/carbon/human) && volume >= 30)
|
||||
var/datum/organ/external/affecting = M:organs["head"]
|
||||
var/datum/organ/external/affecting = M:get_organ("head")
|
||||
if(affecting)
|
||||
affecting.take_damage(25, 0)
|
||||
M:UpdateDamage()
|
||||
@@ -691,7 +691,7 @@ datum
|
||||
del (M:head)
|
||||
M << "\red Your helmet melts into uselessness!"
|
||||
return
|
||||
var/datum/organ/external/affecting = M:organs["head"]
|
||||
var/datum/organ/external/affecting = M:get_organ("head")
|
||||
affecting.take_damage(35, 0)
|
||||
M:UpdateDamage()
|
||||
M:UpdateDamageIcon()
|
||||
@@ -706,7 +706,7 @@ datum
|
||||
M.take_organ_damage(min(15, volume * 4)) // same deal as sulphuric acid
|
||||
else
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/datum/organ/external/affecting = M:organs["head"]
|
||||
var/datum/organ/external/affecting = M:get_organ("head")
|
||||
affecting.take_damage(30, 0)
|
||||
M:UpdateDamage()
|
||||
M:UpdateDamageIcon()
|
||||
|
||||
@@ -28,7 +28,7 @@ datum
|
||||
result_amount = 2
|
||||
on_reaction(var/datum/reagents/holder, var/created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
var/datum/effect/system/reagents_explosion/e = new()
|
||||
var/datum/effect/effect/system/reagents_explosion/e = new()
|
||||
e.set_up(round (created_volume/10, 1), location, 0, 0)
|
||||
e.start()
|
||||
|
||||
@@ -277,7 +277,7 @@ datum
|
||||
result_amount = 2
|
||||
on_reaction(var/datum/reagents/holder, var/created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
var/datum/effect/system/reagents_explosion/e = new()
|
||||
var/datum/effect/effect/system/reagents_explosion/e = new()
|
||||
e.set_up(round (created_volume/2, 1), location, 0, 0)
|
||||
e.start()
|
||||
|
||||
@@ -299,7 +299,7 @@ datum
|
||||
result_amount = null
|
||||
on_reaction(var/datum/reagents/holder, var/created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(2, 1, location)
|
||||
s.start()
|
||||
for(var/mob/living/carbon/M in viewers(world.view, location))
|
||||
@@ -378,7 +378,7 @@ datum
|
||||
secondary = 1
|
||||
on_reaction(var/datum/reagents/holder, var/created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
var/datum/effect/system/chem_smoke_spread/S = new /datum/effect/system/chem_smoke_spread
|
||||
var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread
|
||||
S.attach(location)
|
||||
S.set_up(holder, 10, 0, location)
|
||||
playsound(location, 'smoke.ogg', 50, 1, -3)
|
||||
@@ -438,7 +438,7 @@ datum
|
||||
//for(var/datum/reagent/R in holder.reagent_list)
|
||||
// world << "[R.name] = [R.volume]"
|
||||
|
||||
var/datum/effect/system/foam_spread/s = new()
|
||||
var/datum/effect/effect/system/foam_spread/s = new()
|
||||
s.set_up(created_volume, location, holder, 0)
|
||||
s.start()
|
||||
holder.clear_reagents()
|
||||
@@ -460,7 +460,7 @@ datum
|
||||
for(var/mob/M in viewers(5, location))
|
||||
M << "\red The solution spews out a metalic foam!"
|
||||
|
||||
var/datum/effect/system/foam_spread/s = new()
|
||||
var/datum/effect/effect/system/foam_spread/s = new()
|
||||
s.set_up(created_volume/2, location, holder, 1)
|
||||
s.start()
|
||||
return
|
||||
@@ -480,7 +480,7 @@ datum
|
||||
for(var/mob/M in viewers(5, location))
|
||||
M << "\red The solution spews out a metalic foam!"
|
||||
|
||||
var/datum/effect/system/foam_spread/s = new()
|
||||
var/datum/effect/effect/system/foam_spread/s = new()
|
||||
s.set_up(created_volume/2, location, holder, 2)
|
||||
s.start()
|
||||
return
|
||||
@@ -537,7 +537,7 @@ datum
|
||||
required_other = 2
|
||||
on_reaction(var/datum/reagents/holder, var/created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
var/datum/effect/system/reagents_explosion/e = new()
|
||||
var/datum/effect/effect/system/reagents_explosion/e = new()
|
||||
e.set_up(round (created_volume/10, 1), location, 0, 0)
|
||||
e.start()
|
||||
|
||||
@@ -759,7 +759,7 @@ datum
|
||||
//for(var/datum/reagent/R in holder.reagent_list)
|
||||
// world << "[R.name] = [R.volume]"
|
||||
|
||||
var/datum/effect/system/foam_spread/s = new()
|
||||
var/datum/effect/effect/system/foam_spread/s = new()
|
||||
s.set_up(created_volume, location, holder, 0)
|
||||
s.start()
|
||||
holder.clear_reagents()
|
||||
|
||||
@@ -225,7 +225,7 @@
|
||||
G.reagents.trans_to(src, G.reagents.total_volume)
|
||||
|
||||
if(src.reagents.total_volume) //The possible reactions didnt use up all reagents.
|
||||
var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread()
|
||||
var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread()
|
||||
steam.set_up(10, 0, get_turf(src))
|
||||
steam.attach(src)
|
||||
steam.start()
|
||||
@@ -530,12 +530,12 @@
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
new /obj/effect/water(src.loc)
|
||||
new /obj/effect/effect/water(src.loc)
|
||||
del(src)
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(5))
|
||||
new /obj/effect/water(src.loc)
|
||||
new /obj/effect/effect/water(src.loc)
|
||||
del(src)
|
||||
return
|
||||
else
|
||||
@@ -543,7 +543,7 @@
|
||||
|
||||
blob_act()
|
||||
if(prob(50))
|
||||
new /obj/effect/water(src.loc)
|
||||
new /obj/effect/effect/water(src.loc)
|
||||
del(src)
|
||||
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
//Important parts of the suit.
|
||||
mob/living/carbon/affecting = null//The wearer.
|
||||
obj/item/weapon/cell/cell//Starts out with a high-capacity cell using New().
|
||||
datum/effect/system/spark_spread/spark_system//To create sparks.
|
||||
datum/effect/effect/system/spark_spread/spark_system//To create sparks.
|
||||
reagent_list[] = list("tricordrazine","dexalinp","spaceacillin","anti_toxin","nutriment","radium","hyronalin")//The reagents ids which are added to the suit at New().
|
||||
stored_research[]//For stealing station research.
|
||||
obj/item/weapon/disk/tech_disk/t_disk//To copy design onto disk.
|
||||
|
||||
@@ -154,24 +154,13 @@
|
||||
O.show_message("\red <B>[src]</B> [src.attacktext] [src.target]!", 1)
|
||||
if(ismob(src.target))
|
||||
|
||||
|
||||
var/damage = rand(melee_damage_lower, melee_damage_upper)
|
||||
|
||||
if(istype(target, /mob/living/carbon/human))
|
||||
var/dam_zone = pick("head", "chest", "l_hand", "r_hand", "l_leg", "r_leg", "groin")
|
||||
if (dam_zone == "chest")
|
||||
if ((((target:wear_suit && target:wear_suit.body_parts_covered & UPPER_TORSO) || (target:w_uniform && target:w_uniform.body_parts_covered & LOWER_TORSO)) && prob(10)))
|
||||
if(prob(20))
|
||||
target:show_message("\blue You have been protected from a hit to the chest.")
|
||||
return
|
||||
if (istype(target:organs[text("[]", dam_zone)], /datum/organ/external))
|
||||
var/datum/organ/external/temp = target:organs[text("[]", dam_zone)]
|
||||
if (temp.take_damage(damage, 0))
|
||||
target:UpdateDamageIcon()
|
||||
else
|
||||
target:UpdateDamage()
|
||||
target:updatehealth()
|
||||
|
||||
var/mob/living/carbon/human/H = target
|
||||
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
|
||||
var/datum/organ/external/affecting = H.get_organ(ran_zone(dam_zone))
|
||||
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"))
|
||||
else
|
||||
target:bruteloss += damage
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
src.visible_message("<b>[src]</b> blows apart!")
|
||||
var/turf/Ts = get_turf(src)
|
||||
new /obj/effect/decal/cleanable/robot_debris(Ts)
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
del(src)
|
||||
@@ -198,7 +198,7 @@
|
||||
|
||||
New()
|
||||
..()
|
||||
var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
|
||||
var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
|
||||
smoke.set_up(5, 0, src.loc)
|
||||
smoke.start()
|
||||
for(var/mob/O in viewers(src, null))
|
||||
|
||||
@@ -548,7 +548,7 @@
|
||||
if (stunned < power)
|
||||
stunned = power
|
||||
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
|
||||
|
||||
@@ -212,7 +212,7 @@
|
||||
breath = loc.remove_air(breath_moles)
|
||||
|
||||
// Handle chem smoke effect -- Doohl
|
||||
for(var/obj/effect/chem_smoke/smoke in view(1, src))
|
||||
for(var/obj/effect/effect/chem_smoke/smoke in view(1, src))
|
||||
if(smoke.reagents.total_volume)
|
||||
smoke.reagents.reaction(src, INGEST)
|
||||
spawn(5)
|
||||
|
||||
@@ -193,7 +193,7 @@
|
||||
breath = loc.remove_air(breath_moles)
|
||||
|
||||
// Handle chem smoke effect -- Doohl
|
||||
for(var/obj/effect/chem_smoke/smoke in view(1, src))
|
||||
for(var/obj/effect/effect/chem_smoke/smoke in view(1, src))
|
||||
if(smoke.reagents.total_volume)
|
||||
smoke.reagents.reaction(src, INGEST)
|
||||
spawn(5)
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
var/d = rand(round(I.force / 4), I.force)
|
||||
if(istype(src, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src
|
||||
var/organ = H.organs["chest"]
|
||||
var/organ = H.get_organ("chest")
|
||||
if (istype(organ, /datum/organ/external))
|
||||
var/datum/organ/external/temp = organ
|
||||
temp.take_damage(d, 0)
|
||||
|
||||
@@ -264,107 +264,29 @@
|
||||
if (prob(50) && !shielded)
|
||||
paralysis += 10
|
||||
|
||||
for(var/organ in organs)
|
||||
var/datum/organ/external/temp = organs[text("[]", organ)]
|
||||
if (istype(temp, /datum/organ/external))
|
||||
switch(temp.name)
|
||||
if("head")
|
||||
temp.take_damage(b_loss * 0.2, f_loss * 0.2)
|
||||
if("chest")
|
||||
temp.take_damage(b_loss * 0.4, f_loss * 0.4)
|
||||
if("groin")
|
||||
temp.take_damage(b_loss * 0.1, f_loss * 0.1)
|
||||
if("l_arm")
|
||||
temp.take_damage(b_loss * 0.05, f_loss * 0.05)
|
||||
if("r_arm")
|
||||
temp.take_damage(b_loss * 0.05, f_loss * 0.05)
|
||||
/* if("l_hand")
|
||||
/ temp.take_damage(b_loss * 0.0225, f_loss * 0.0225)
|
||||
if("r_hand")
|
||||
temp.take_damage(b_loss * 0.0225, f_loss * 0.0225)*/
|
||||
if("l_leg")
|
||||
temp.take_damage(b_loss * 0.05, f_loss * 0.05)
|
||||
if("r_leg")
|
||||
temp.take_damage(b_loss * 0.05, f_loss * 0.05)
|
||||
/* if("l_foot")
|
||||
temp.take_damage(b_loss * 0.0225, f_loss * 0.0225)
|
||||
if("r_foot")
|
||||
temp.take_damage(b_loss * 0.0225, f_loss * 0.0225)*/
|
||||
|
||||
for(var/datum/organ/external/temp in organs)
|
||||
switch(temp.name)
|
||||
if("head")
|
||||
temp.take_damage(b_loss * 0.2, f_loss * 0.2)
|
||||
if("chest")
|
||||
temp.take_damage(b_loss * 0.4, f_loss * 0.4)
|
||||
if("l_arm")
|
||||
temp.take_damage(b_loss * 0.05, f_loss * 0.05)
|
||||
if("r_arm")
|
||||
temp.take_damage(b_loss * 0.05, f_loss * 0.05)
|
||||
if("l_leg")
|
||||
temp.take_damage(b_loss * 0.05, f_loss * 0.05)
|
||||
if("r_leg")
|
||||
temp.take_damage(b_loss * 0.05, f_loss * 0.05)
|
||||
UpdateDamageIcon()
|
||||
|
||||
|
||||
/mob/living/carbon/human/blob_act()
|
||||
if (stat == 2)
|
||||
return
|
||||
var/damage = null
|
||||
if (stat != 2)
|
||||
damage = rand(30,40)
|
||||
|
||||
if(stat == 2) return
|
||||
show_message("\red The blob attacks you!")
|
||||
|
||||
var/list/zones = list("head","chest","chest", "groin", "l_arm", "r_arm", "l_leg", "r_leg")
|
||||
|
||||
var/zone = pick(zones)
|
||||
|
||||
var/datum/organ/external/temp = organs["[zone]"]
|
||||
|
||||
switch(zone)//This really needs an update badly
|
||||
if ("head")
|
||||
if ((((head && head.body_parts_covered & HEAD) || (wear_mask && wear_mask.body_parts_covered & HEAD)) && prob(99)))
|
||||
if (prob(20))
|
||||
temp.take_damage(damage, 0)
|
||||
else
|
||||
show_message("\red You have been protected from a hit to the head.")
|
||||
return
|
||||
if (damage > 4.9)
|
||||
if (weakened < 10)
|
||||
weakened = rand(10, 15)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("\red <B>The blob has weakened []!</B>", src), 1, "\red You hear someone fall.", 2)
|
||||
temp.take_damage(damage)
|
||||
if ("chest")
|
||||
if ((((wear_suit && wear_suit.body_parts_covered & UPPER_TORSO) || (w_uniform && w_uniform.body_parts_covered & UPPER_TORSO)) && prob(85)))
|
||||
show_message("\red You have been protected from a hit to the chest.")
|
||||
return
|
||||
if (damage > 4.9)
|
||||
if (prob(50))
|
||||
if (weakened < 5)
|
||||
weakened = 5
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("\red <B>The blob has knocked down []!</B>", src), 1, "\red You hear someone fall.", 2)
|
||||
else
|
||||
if (stunned < 5)
|
||||
stunned = 5
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if(O.client) O.show_message(text("\red <B>The blob has stunned []!</B>", src), 1)
|
||||
if(stat != 2) stat = 1
|
||||
temp.take_damage(damage)
|
||||
if ("groin")
|
||||
if ((((wear_suit && wear_suit.body_parts_covered & LOWER_TORSO) || (w_uniform && w_uniform.body_parts_covered & LOWER_TORSO)) && prob(75)))
|
||||
show_message("\red You have been protected from a hit to the lower chest.")
|
||||
return
|
||||
else
|
||||
temp.take_damage(damage, 0)
|
||||
|
||||
|
||||
if("l_arm")
|
||||
temp.take_damage(damage, 0)
|
||||
if("r_arm")
|
||||
temp.take_damage(damage, 0)
|
||||
if("l_hand")
|
||||
temp.take_damage(damage, 0)
|
||||
if("r_hand")
|
||||
temp.take_damage(damage, 0)
|
||||
if("l_leg")
|
||||
temp.take_damage(damage, 0)
|
||||
if("r_leg")
|
||||
temp.take_damage(damage, 0)
|
||||
if("l_foot")
|
||||
temp.take_damage(damage, 0)
|
||||
if("r_foot")
|
||||
temp.take_damage(damage, 0)
|
||||
|
||||
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
|
||||
var/datum/organ/external/affecting = get_organ(ran_zone(dam_zone))
|
||||
apply_damage(rand(30,40), BRUTE, affecting, run_armor_check(affecting, "melee"))
|
||||
UpdateDamageIcon()
|
||||
return
|
||||
|
||||
@@ -1137,51 +1059,19 @@
|
||||
*/
|
||||
last_b_state = stat
|
||||
|
||||
/mob/living/carbon/human/hand_p(mob/M as mob)//update needed
|
||||
if (M.a_intent == "hurt")
|
||||
if (istype(M.wear_mask, /obj/item/clothing/mask/muzzle))
|
||||
return
|
||||
if (health > 0)
|
||||
if (istype(wear_suit, /obj/item/clothing/suit/space))
|
||||
if (prob(25))
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("\red <B>[M.name] has attempted to bite []!</B>", src), 1)
|
||||
return
|
||||
else if (istype(wear_suit, /obj/item/clothing/suit/space/santa))
|
||||
if (prob(25))
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("\red <B>[M.name] has attempted to bite []!</B>", src), 1)
|
||||
return
|
||||
else if (istype(wear_suit, /obj/item/clothing/suit/bio_suit))
|
||||
if (prob(25))
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("\red <B>[M.name] has attempted to bite []!</B>", src), 1)
|
||||
return
|
||||
else if (istype(wear_suit, /obj/item/clothing/suit/armor))
|
||||
if (prob(25))
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("\red <B>[M.name] has attempted to bite []!</B>", src), 1)
|
||||
return
|
||||
else
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>[M.name] has bit []!</B>", src), 1)
|
||||
var/damage = rand(1, 3)
|
||||
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg", "groin")
|
||||
if (istype(organs[text("[]", dam_zone)], /datum/organ/external))
|
||||
var/datum/organ/external/temp = organs[text("[]", dam_zone)]
|
||||
if (temp.take_damage(damage, 0))
|
||||
UpdateDamageIcon()
|
||||
else
|
||||
UpdateDamage()
|
||||
updatehealth()
|
||||
/mob/living/carbon/human/hand_p(mob/M as mob)
|
||||
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
|
||||
var/datum/organ/external/affecting = get_organ(ran_zone(dam_zone))
|
||||
var/armor = run_armor_check(affecting, "melee")
|
||||
apply_damage(rand(1,2), BRUTE, affecting, armor)
|
||||
if(armor >= 2) return
|
||||
|
||||
for(var/datum/disease/D in M.viruses)
|
||||
if(istype(D, /datum/disease/jungle_fever))
|
||||
var/mob/living/carbon/human/H = src
|
||||
src = null
|
||||
src = H.monkeyize()
|
||||
contract_disease(D,1,0)
|
||||
for(var/datum/disease/D in M.viruses)
|
||||
if(istype(D, /datum/disease/jungle_fever))
|
||||
var/mob/living/carbon/human/H = src
|
||||
src = null
|
||||
src = H.monkeyize()
|
||||
contract_disease(D,1,0)
|
||||
return
|
||||
|
||||
|
||||
@@ -1240,7 +1130,7 @@
|
||||
if (stunned < power)
|
||||
stunned = power
|
||||
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
|
||||
|
||||
@@ -90,7 +90,6 @@
|
||||
visible_message("\red <B>[M] has weakened [src]!</B>")
|
||||
apply_effect(4, WEAKEN, armor_block)
|
||||
UpdateDamageIcon()
|
||||
updatehealth()
|
||||
|
||||
|
||||
if("disarm")
|
||||
@@ -99,7 +98,7 @@
|
||||
|
||||
if(w_uniform)
|
||||
w_uniform.add_fingerprint(M)
|
||||
var/datum/organ/external/affecting = organs[ran_zone(M.zone_sel.selecting)]
|
||||
var/datum/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
|
||||
var/randn = rand(1, 100)
|
||||
if (randn <= 25)
|
||||
apply_effect(2, WEAKEN, run_armor_check(affecting, "melee"))
|
||||
|
||||
@@ -10,11 +10,9 @@
|
||||
O.show_message(text("\red <B>[M.name] has bit []!</B>", src), 1)
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg", "groin")
|
||||
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
|
||||
var/datum/organ/external/affecting = get_organ(ran_zone(dam_zone))
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
apply_damage(damage, BRUTE, affecting, armor_block)
|
||||
UpdateDamageIcon()
|
||||
apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "melee"))
|
||||
|
||||
for(var/datum/disease/D in M.viruses)
|
||||
if(istype(D, /datum/disease/jungle_fever))
|
||||
|
||||
@@ -29,20 +29,14 @@
|
||||
body_lying = list()
|
||||
UpdateDamage()
|
||||
for(var/datum/organ/external/O in organs)
|
||||
if(istype(O, /datum/organ/external))
|
||||
var/icon/DI = new /icon('dam_human.dmi', O.damage_state) // the damage icon for whole human
|
||||
DI.Blend(new /icon('dam_mask.dmi', O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
|
||||
|
||||
// world << "[O.icon_name] [O.damage_state] \icon[DI]"
|
||||
|
||||
body_standing += DI
|
||||
|
||||
DI = new /icon('dam_human.dmi', "[O.damage_state]-2") // repeat for lying icons
|
||||
DI.Blend(new /icon('dam_mask.dmi', "[O.icon_name]2"), ICON_MULTIPLY)
|
||||
|
||||
// world << "[O.r_name]2 [O.d_i_state]-2 \icon[DI]"
|
||||
|
||||
body_lying += DI
|
||||
var/icon/DI = new /icon('dam_human.dmi', O.damage_state) // the damage icon for whole human
|
||||
DI.Blend(new /icon('dam_mask.dmi', O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
|
||||
// world << "[O.icon_name] [O.damage_state] \icon[DI]"
|
||||
body_standing += DI
|
||||
DI = new /icon('dam_human.dmi', "[O.damage_state]-2") // repeat for lying icons
|
||||
DI.Blend(new /icon('dam_mask.dmi', "[O.icon_name]2"), ICON_MULTIPLY)
|
||||
// world << "[O.r_name]2 [O.d_i_state]-2 \icon[DI]"
|
||||
body_lying += DI
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/get_organ(var/zone)
|
||||
|
||||
@@ -28,9 +28,8 @@ emp_act
|
||||
|
||||
//If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values
|
||||
for(var/datum/organ/external/organ in organs)
|
||||
if(istype(organ))
|
||||
armorval += checkarmor(organ, type)
|
||||
organnum++
|
||||
armorval += checkarmor(organ, type)
|
||||
organnum++
|
||||
return armorval/max(organnum, 1)
|
||||
|
||||
|
||||
@@ -48,14 +47,15 @@ emp_act
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/check_shields(var/damage = 0, var/attack_text = "the attack")
|
||||
var/list/hand_held_shields = list("/obj/item/weapon/shield/riot","/obj/item/weapon/melee/energy/sword")
|
||||
if(l_hand && is_type_in_list(l_hand, hand_held_shields))//Current base is the prob(50-d/3)
|
||||
if(prob(50 - round(damage / 3)))
|
||||
show_message("\red You block [attack_text] with your [l_hand.name]!", 4)
|
||||
if(l_hand && istype(l_hand, /obj/item))//Current base is the prob(50-d/3)
|
||||
var/obj/item/I = l_hand
|
||||
if(I.IsShield() && (prob(50 - round(damage / 3))))
|
||||
visible_message("\red <B>[src] blocks [attack_text] with the [l_hand.name]!</B>")
|
||||
return 1
|
||||
if(r_hand && is_type_in_list(r_hand, hand_held_shields))
|
||||
if(prob(50 - round(damage / 3)))
|
||||
show_message("\red You block [attack_text] with your [l_hand.name]!", 4)
|
||||
if(r_hand && istype(r_hand, /obj/item))
|
||||
var/obj/item/I = r_hand
|
||||
if(I.IsShield() && (prob(50 - round(damage / 3))))
|
||||
visible_message("\red <B>[src] blocks [attack_text] with the [r_hand.name]!</B>")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
@@ -257,7 +257,7 @@
|
||||
|
||||
if(!block)
|
||||
|
||||
for(var/obj/effect/chem_smoke/smoke in view(1, src))
|
||||
for(var/obj/effect/effect/chem_smoke/smoke in view(1, src))
|
||||
if(smoke.reagents.total_volume)
|
||||
smoke.reagents.reaction(src, INGEST)
|
||||
spawn(5)
|
||||
|
||||
@@ -211,7 +211,7 @@
|
||||
|
||||
if(!block)
|
||||
|
||||
for(var/obj/effect/chem_smoke/smoke in view(1, src))
|
||||
for(var/obj/effect/effect/chem_smoke/smoke in view(1, src))
|
||||
if(smoke.reagents.total_volume)
|
||||
smoke.reagents.reaction(src, INGEST)
|
||||
spawn(5)
|
||||
|
||||
@@ -364,7 +364,7 @@
|
||||
if (stunned < power)
|
||||
stunned = power
|
||||
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
|
||||
|
||||
@@ -22,12 +22,9 @@
|
||||
return 0
|
||||
var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part
|
||||
var/divided_damage = (burn_amount)/(H.organs.len)
|
||||
var/datum/organ/external/affecting = null
|
||||
var/extradam = 0 //added to when organ is at max dam
|
||||
for(var/A in H.organs)
|
||||
if(!H.organs[A]) continue
|
||||
affecting = H.organs[A]
|
||||
if(!istype(affecting, /datum/organ/external)) continue
|
||||
for(var/datum/organ/external/affecting in H.organs)
|
||||
if(!affecting) continue
|
||||
if(affecting.take_damage(0, divided_damage+extradam))
|
||||
extradam = 0
|
||||
else
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
/mob/living/silicon/robot/New(loc,var/syndie = 0)
|
||||
spark_system = new /datum/effect/system/spark_spread()
|
||||
spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, src)
|
||||
spark_system.attach(src)
|
||||
spawn (1)
|
||||
@@ -584,7 +584,7 @@
|
||||
|
||||
flick("noise", flash)
|
||||
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
mob/new_player
|
||||
var/datum/preferences/preferences
|
||||
var/ready = 0
|
||||
var/spawning = 0//Referenced when you want to delete the new_player later on in the code.
|
||||
/mob/new_player
|
||||
var
|
||||
datum/preferences/preferences = null
|
||||
ready = 0
|
||||
spawning = 0//Referenced when you want to delete the new_player later on in the code.
|
||||
|
||||
invisibility = 101
|
||||
|
||||
@@ -10,12 +11,8 @@ mob/new_player
|
||||
canmove = 0
|
||||
|
||||
anchored = 1 // don't get pushed around
|
||||
// var/list/jobs_restricted_by_gamemode
|
||||
|
||||
Login()
|
||||
//Next line is commented out because seem it does nothing helpful and on the other hand it calls mob/new_player/Move() to EACH turf in the world. --rastaf0
|
||||
//..()
|
||||
|
||||
if(!preferences)
|
||||
preferences = new
|
||||
|
||||
@@ -25,8 +22,10 @@ mob/new_player
|
||||
mind.current = src
|
||||
|
||||
var/starting_loc = pick(newplayer_start)
|
||||
if(!starting_loc) starting_loc = locate(1,1,1)
|
||||
loc = starting_loc
|
||||
sight |= SEE_TURFS
|
||||
|
||||
var/list/watch_locations = list()
|
||||
for(var/obj/effect/landmark/landmark in world)
|
||||
if(landmark.tag == "landmark*new_player")
|
||||
@@ -103,38 +102,27 @@ mob/new_player
|
||||
del(src)
|
||||
return
|
||||
|
||||
verb
|
||||
new_player_panel()
|
||||
set src = usr
|
||||
new_player_panel_proc()
|
||||
|
||||
proc
|
||||
verb/new_player_panel()
|
||||
set src = usr
|
||||
new_player_panel_proc()
|
||||
|
||||
var/output = "<B>New Player Options</B>"
|
||||
/*output += " | <a href='byond://?src=\ref[src];refresh=1'>Refresh</A><hr>"
|
||||
|
||||
output += "<b>Name:</b> [preferences.be_random_name ? "Random" :preferences.real_name]"*/
|
||||
proc/new_player_panel_proc()
|
||||
var/output = "<B>New Player Options</B>"
|
||||
output +="<hr>"
|
||||
output += "<br><a href='byond://?src=\ref[src];show_preferences=1'>Setup Character</A><BR><BR>"
|
||||
|
||||
output +="<hr>"
|
||||
if(!ticker || ticker.current_state <= GAME_STATE_PREGAME)
|
||||
if(!ready) output += "<a href='byond://?src=\ref[src];ready=1'>Declare Ready</A><BR>"
|
||||
else output += "<b>You are ready</b> (<a href='byond://?src=\ref[src];ready=2'>Cancel</A>)<BR>"
|
||||
|
||||
/*output += "<b>Preferred jobs:</b><br>"
|
||||
output += "[preferences.occupation[1]]<br>"
|
||||
output += "[preferences.occupation[2]]<br>"
|
||||
output += "[preferences.occupation[3]]<hr>"*/
|
||||
else
|
||||
output += "<a href='byond://?src=\ref[src];late_join=1'>Join Game!</A><BR>"
|
||||
|
||||
output += "<br><a href='byond://?src=\ref[src];show_preferences=1'>Setup Character</A><BR><BR>"
|
||||
if(!ticker || ticker.current_state <= GAME_STATE_PREGAME)
|
||||
if(!ready)
|
||||
output += "<a href='byond://?src=\ref[src];ready=1'>Declare Ready</A><BR>"
|
||||
else
|
||||
output += "<b>You are ready</b> (<a href='byond://?src=\ref[src];ready=2'>Cancel</A>)<BR>"
|
||||
else
|
||||
output += "<a href='byond://?src=\ref[src];late_join=1'>Join Game!</A><BR>"
|
||||
output += "<BR><a href='byond://?src=\ref[src];observe=1'>Observe</A><BR>"
|
||||
|
||||
output += "<BR><a href='byond://?src=\ref[src];observe=1'>Observe</A><BR>"
|
||||
|
||||
src << browse(output,"window=playersetup;size=250x210;can_close=0")
|
||||
src << browse(output,"window=playersetup;size=250x210;can_close=0")
|
||||
return
|
||||
|
||||
Stat()
|
||||
..()
|
||||
@@ -203,93 +191,37 @@ mob/new_player
|
||||
LateChoices()
|
||||
|
||||
if(href_list["SelectedJob"])
|
||||
if (!usr.client.authenticated)
|
||||
if(!usr.client.authenticated)
|
||||
src << "You are not authorized to enter the game."
|
||||
return
|
||||
|
||||
if (!enter_allowed)
|
||||
if(!enter_allowed)
|
||||
usr << "\blue There is an administrative lock on entering the game!"
|
||||
return
|
||||
|
||||
switch(href_list["SelectedJob"])
|
||||
if ("1")
|
||||
AttemptLateSpawn("Captain")
|
||||
if ("2")
|
||||
AttemptLateSpawn("Head of Security")
|
||||
if ("3")
|
||||
AttemptLateSpawn("Head of Personnel")
|
||||
if ("4")
|
||||
AttemptLateSpawn("Station Engineer")
|
||||
if ("5")
|
||||
AttemptLateSpawn("Bartender")
|
||||
if ("6")
|
||||
AttemptLateSpawn("Scientist")
|
||||
if ("7")
|
||||
AttemptLateSpawn("Chemist")
|
||||
if ("8")
|
||||
AttemptLateSpawn("Geneticist")
|
||||
if ("9")
|
||||
AttemptLateSpawn("Security Officer")
|
||||
if ("10")
|
||||
AttemptLateSpawn("Medical Doctor")
|
||||
if ("11")
|
||||
AttemptLateSpawn("Atmospheric Technician")
|
||||
if ("12")
|
||||
AttemptLateSpawn("Detective")
|
||||
if ("13")
|
||||
AttemptLateSpawn("Chaplain")
|
||||
if ("14")
|
||||
AttemptLateSpawn("Janitor")
|
||||
if ("15")
|
||||
AttemptLateSpawn("Clown")
|
||||
if ("16")
|
||||
AttemptLateSpawn("Chef")
|
||||
if ("17")
|
||||
AttemptLateSpawn("Roboticist")
|
||||
if ("18")
|
||||
AttemptLateSpawn("Assistant")
|
||||
if ("19")
|
||||
AttemptLateSpawn("Quartermaster")
|
||||
if ("20")
|
||||
AttemptLateSpawn("Research Director")
|
||||
if ("21")
|
||||
AttemptLateSpawn("Chief Engineer")
|
||||
if ("22")
|
||||
AttemptLateSpawn("Botanist")
|
||||
if ("23")
|
||||
AttemptLateSpawn("Librarian")
|
||||
if ("24")
|
||||
AttemptLateSpawn("Virologist")
|
||||
if ("25")
|
||||
AttemptLateSpawn("Lawyer")
|
||||
if ("26")
|
||||
AttemptLateSpawn("Cargo Technician")
|
||||
if ("27")
|
||||
AttemptLateSpawn("Chief Medical Officer")
|
||||
if ("28")
|
||||
AttemptLateSpawn("Warden")
|
||||
if ("29")
|
||||
AttemptLateSpawn("Shaft Miner")
|
||||
if ("30")
|
||||
AttemptLateSpawn("Mime")
|
||||
AttemptLateSpawn(href_list["SelectedJob"])
|
||||
return
|
||||
|
||||
if(!ready && href_list["preferences"])
|
||||
preferences.process_link(src, href_list)
|
||||
else if(!href_list["late_join"])
|
||||
new_player_panel()
|
||||
|
||||
proc/IsJobAvailable(rank)
|
||||
if(((jobMax[rank] < 0) || (countJob(rank) < jobMax[rank])) && !jobban_isbanned(src,rank))
|
||||
|
||||
/* proc/IsJobAvailable(rank)
|
||||
if(((occupations[rank] < 0) || (countJob(rank) < occupations[rank])) && !jobban_isbanned(src,rank))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return 0*/
|
||||
|
||||
proc/AttemptLateSpawn(rank, maxAllowed)
|
||||
if(IsJobAvailable(rank, maxAllowed))
|
||||
|
||||
proc/AttemptLateSpawn(rank)
|
||||
var/datum/job/job = job_master.GetJob(rank)
|
||||
if(job && ((job.title == "Assistant") || (job.current_positions < job.total_positions)))
|
||||
var/mob/living/carbon/human/character = create_character()
|
||||
var/icon/char_icon = getFlatIcon(character,0)//We're creating out own cache so it's not needed.
|
||||
if (character)
|
||||
character.Equip_Rank(rank, joined_late=1)
|
||||
if(job_master.AssignRole(character, rank, 1))
|
||||
job_master.EquipRank(character, rank, 1)
|
||||
if(character.mind)
|
||||
if(character.mind.assigned_role != "Cyborg")
|
||||
ManifestLateSpawn(character,char_icon)
|
||||
@@ -305,6 +237,7 @@ mob/new_player
|
||||
else
|
||||
src << alert("[rank] is not available. Please try another.")
|
||||
|
||||
|
||||
proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank)
|
||||
if (ticker.current_state == GAME_STATE_PLAYING)
|
||||
var/ailist[] = list()
|
||||
@@ -336,7 +269,7 @@ mob/new_player
|
||||
M.fields["id"] = G.fields["id"]
|
||||
S.fields["name"] = G.fields["name"]
|
||||
S.fields["id"] = G.fields["id"]
|
||||
if (H.gender == FEMALE)
|
||||
if(H.gender == FEMALE)
|
||||
G.fields["sex"] = "Female"
|
||||
else
|
||||
G.fields["sex"] = "Male"
|
||||
@@ -381,102 +314,17 @@ mob/new_player
|
||||
data_core.locked += L
|
||||
return
|
||||
|
||||
// This fxn creates positions for assistants based on existing positions. This could be more elegant.
|
||||
|
||||
proc/LateChoices()
|
||||
var/dat = "<html><body>"
|
||||
dat += "Choose from the following open positions:<br>"
|
||||
if (IsJobAvailable("Captain"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=1'>Captain</a><br>"
|
||||
|
||||
if (IsJobAvailable("Head of Security"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=2'>Head of Security</a><br>"
|
||||
|
||||
if (IsJobAvailable("Head of Personnel"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=3'>Head of Personnel</a><br>"
|
||||
|
||||
if (IsJobAvailable("Research Director"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=20'>Research Director</a><br>"
|
||||
|
||||
if (IsJobAvailable("Chief Engineer"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=21'>Chief Engineer</a><br>"
|
||||
|
||||
if (IsJobAvailable("Station Engineer"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=4'>Station Engineer</a><br>"
|
||||
|
||||
if (IsJobAvailable("Bartender"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=5'>Bartender</a><br>"
|
||||
|
||||
if (IsJobAvailable("Scientist"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=6'>Scientist</a><br>"
|
||||
|
||||
if (IsJobAvailable("Chemist"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=7'>Chemist</a><br>"
|
||||
|
||||
if (IsJobAvailable("Geneticist"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=8'>Geneticist</a><br>"
|
||||
|
||||
if (IsJobAvailable("Security Officer"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=9'>Security Officer</a><br>"
|
||||
|
||||
if (IsJobAvailable("Medical Doctor"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=10'>Medical Doctor</a><br>"
|
||||
|
||||
if (IsJobAvailable("Atmospheric Technician"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=11'>Atmospheric Technician</a><br>"
|
||||
|
||||
if (IsJobAvailable("Detective"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=12'>Detective</a><br>"
|
||||
|
||||
if (IsJobAvailable("Chaplain"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=13'>Chaplain</a><br>"
|
||||
|
||||
if (IsJobAvailable("Janitor"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=14'>Janitor</a><br>"
|
||||
|
||||
if (IsJobAvailable("Clown"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=15'>Clown</a><br>"
|
||||
|
||||
if (IsJobAvailable("Mime"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=30'>Mime</a><br>"
|
||||
|
||||
if (IsJobAvailable("Chef"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=16'>Chef</a><br>"
|
||||
|
||||
if (IsJobAvailable("Roboticist"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=17'>Roboticist</a><br>"
|
||||
|
||||
if (IsJobAvailable("Quartermaster"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=19'>Quartermaster</a><br>"
|
||||
|
||||
if (IsJobAvailable("Botanist"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=22'>Botanist</a><br>"
|
||||
|
||||
if (IsJobAvailable("Librarian"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=23'>Librarian</a><br>"
|
||||
|
||||
if (IsJobAvailable("Virologist"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=24'>Virologist</a><br>"
|
||||
|
||||
if (IsJobAvailable("Lawyer"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=25'>Lawyer</a><br>"
|
||||
|
||||
if (IsJobAvailable("Cargo Technician"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=26'>Cargo Technician</a><br>"
|
||||
|
||||
if (IsJobAvailable("Chief Medical Officer"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=27'>Chief Medical Officer</a><br>"
|
||||
|
||||
if (IsJobAvailable("Warden"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=28'>Warden</a><br>"
|
||||
|
||||
if (IsJobAvailable("Shaft Miner"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=29'>Shaft Miner</a><br>"
|
||||
|
||||
if (!jobban_isbanned(src,"Assistant"))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=18'>Assistant</a><br>"
|
||||
for(var/datum/job/job in job_master.occupations)
|
||||
if(job && ((job.title == "Assistant") || (job.current_positions < job.total_positions)))
|
||||
dat += "<a href='byond://?src=\ref[src];SelectedJob=[job.title]'>[job.title]</a><br>"
|
||||
|
||||
src << browse(dat, "window=latechoices;size=300x640;can_close=0")
|
||||
|
||||
|
||||
proc/create_character()
|
||||
spawning = 1
|
||||
var/mob/living/carbon/human/new_character = new(loc)
|
||||
@@ -489,9 +337,9 @@ mob/new_player
|
||||
mind.transfer_to(new_character)
|
||||
mind.original = new_character
|
||||
|
||||
|
||||
return new_character
|
||||
|
||||
|
||||
Move()
|
||||
return 0
|
||||
|
||||
|
||||
@@ -28,354 +28,83 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
|
||||
"infested monkey" = ispath(text2path("/datum/game_mode/monkey")),
|
||||
)
|
||||
*/
|
||||
var/const
|
||||
BE_TRAITOR =(1<<0)
|
||||
BE_OPERATIVE =(1<<1)
|
||||
BE_CHANGELING=(1<<2)
|
||||
BE_WIZARD =(1<<3)
|
||||
BE_MALF =(1<<4)
|
||||
BE_REV =(1<<5)
|
||||
BE_ALIEN =(1<<6)
|
||||
BE_CULTIST =(1<<7)
|
||||
BE_MONKEY =(1<<8)
|
||||
BE_PAI =(1<<9)
|
||||
|
||||
datum/preferences
|
||||
var/real_name
|
||||
var/gender = MALE
|
||||
var/age = 30.0
|
||||
var/b_type = "A+"
|
||||
var
|
||||
real_name
|
||||
be_random_name = 0
|
||||
gender = MALE
|
||||
age = 30.0
|
||||
b_type = "A+"
|
||||
|
||||
var/be_special //bitfields. See defines in setup.dm. --rastaf0
|
||||
var/midis = 1
|
||||
var/lastchangelog = 0 // size of last seen changelog file -- rastaf0
|
||||
var/ooccolor = "#b82e00"
|
||||
var/be_random_name = 0
|
||||
var/underwear = 1
|
||||
var/bubbles = 0 // 0 if the player doesn't want bubbles to appear
|
||||
//Special role selection
|
||||
be_special = 0
|
||||
//Play admin midis
|
||||
midis = 1
|
||||
//Saved changlog filesize to detect if there was a change
|
||||
lastchangelog = 0
|
||||
|
||||
var/occupation[length(occupations)]
|
||||
var/datum/jobs/wanted_jobs = list()
|
||||
//Just like it sounds
|
||||
ooccolor = "#b82e00"
|
||||
underwear = 1
|
||||
|
||||
var/h_style = "Short Hair"
|
||||
var/f_style = "Shaved"
|
||||
//Hair type
|
||||
h_style = "Short Hair"
|
||||
//Hair color
|
||||
r_hair = 0
|
||||
g_hair = 0
|
||||
b_hair = 0
|
||||
|
||||
var/r_hair = 0
|
||||
var/g_hair = 0
|
||||
var/b_hair = 0
|
||||
//Face hair type
|
||||
f_style = "Shaved"
|
||||
//Face hair color
|
||||
r_facial = 0
|
||||
g_facial = 0
|
||||
b_facial = 0
|
||||
|
||||
var/r_facial = 0
|
||||
var/g_facial = 0
|
||||
var/b_facial = 0
|
||||
//Skin color
|
||||
s_tone = 0
|
||||
|
||||
var/s_tone = 0
|
||||
var/r_eyes = 0
|
||||
var/g_eyes = 0
|
||||
var/b_eyes = 0
|
||||
//Eye color
|
||||
r_eyes = 0
|
||||
g_eyes = 0
|
||||
b_eyes = 0
|
||||
|
||||
var/UI = UI_OLD // saving the whole .DMI in preferences is not a good idea. --rastaf0 //'screen1_old.dmi' // Skie
|
||||
//UI style
|
||||
UI = UI_OLD
|
||||
|
||||
//Mob preview
|
||||
icon/preview_icon = null
|
||||
|
||||
//Jobs, uses bitflags
|
||||
job_civilian_high = 0
|
||||
job_civilian_med = 0
|
||||
job_civilian_low = 0
|
||||
|
||||
job_medsci_high = 0
|
||||
job_medsci_med = 0
|
||||
job_medsci_low = 0
|
||||
|
||||
job_engsec_high = 0
|
||||
job_engsec_med = 0
|
||||
job_engsec_low = 0
|
||||
|
||||
var/icon/preview_icon = null
|
||||
|
||||
New()
|
||||
randomize_name()
|
||||
for(var/n in occupation)
|
||||
n=0
|
||||
..()
|
||||
|
||||
//The mob should have a gender you want before running this proc.
|
||||
proc/randomize_appearance_for(var/mob/living/carbon/human/H)
|
||||
if(H.gender == MALE)
|
||||
gender = MALE
|
||||
else
|
||||
gender = FEMALE
|
||||
randomize_skin_tone()
|
||||
randomize_hair(gender)
|
||||
randomize_hair_color("hair")
|
||||
if(gender == MALE)//only for dudes.
|
||||
randomize_facial()
|
||||
randomize_hair_color("facial")
|
||||
randomize_eyes_color()
|
||||
underwear = pick(0,1)
|
||||
b_type = pick("A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-")
|
||||
age = rand(19,35)
|
||||
copy_to(H,1)
|
||||
|
||||
proc/randomize_name()
|
||||
if (gender == MALE)
|
||||
real_name = capitalize(pick(first_names_male) + " " + capitalize(pick(last_names)))
|
||||
else
|
||||
real_name = capitalize(pick(first_names_female) + " " + capitalize(pick(last_names)))
|
||||
|
||||
proc/randomize_hair(var/gender)
|
||||
//Women are more likely to have longer hair.
|
||||
var/temp = gender==FEMALE&&prob(80) ? pick(2,6,8) : rand(1,9)
|
||||
switch(temp)
|
||||
if(1)
|
||||
h_style = "Short Hair"
|
||||
if(2)
|
||||
h_style = "Long Hair"
|
||||
if(3)
|
||||
h_style = "Cut Hair"
|
||||
if(4)
|
||||
h_style = "Mohawk"
|
||||
if(5)
|
||||
h_style = "Balding"
|
||||
if(6)
|
||||
h_style = "Fag"
|
||||
if(7)
|
||||
h_style = "Bedhead"
|
||||
if(8)
|
||||
h_style = "Dreadlocks"
|
||||
else
|
||||
h_style = "bald"
|
||||
|
||||
proc/randomize_facial()
|
||||
var/temp = prob(50) ? 14 : rand(1,13)//50% of not having a beard. Otherwise get a random one.
|
||||
switch(temp)
|
||||
if(1)
|
||||
f_style = "Watson"
|
||||
if(2)
|
||||
f_style = "Chaplin"
|
||||
if(3)
|
||||
f_style = "Selleck"
|
||||
if(4)
|
||||
f_style = "Neckbeard"
|
||||
if(5)
|
||||
f_style = "Full Beard"
|
||||
if(6)
|
||||
f_style = "Long Beard"
|
||||
if(7)
|
||||
f_style = "Van Dyke"
|
||||
if(8)
|
||||
f_style = "Elvis"
|
||||
if(9)
|
||||
f_style = "Abe"
|
||||
if(10)
|
||||
f_style = "Chinstrap"
|
||||
if(11)
|
||||
f_style = "Hipster"
|
||||
if(12)
|
||||
f_style = "Goatee"
|
||||
if(13)
|
||||
f_style = "Hogan"
|
||||
else
|
||||
f_style = "bald"
|
||||
|
||||
proc/randomize_skin_tone()
|
||||
var/tone
|
||||
|
||||
var/tmp = pickweight ( list ("caucasian" = 55, "afroamerican" = 15, "african" = 10, "latino" = 10, "albino" = 5, "weird" = 5))
|
||||
switch (tmp)
|
||||
if ("caucasian")
|
||||
tone = -45 + 35
|
||||
if ("afroamerican")
|
||||
tone = -150 + 35
|
||||
if ("african")
|
||||
tone = -200 + 35
|
||||
if ("latino")
|
||||
tone = -90 + 35
|
||||
if ("albino")
|
||||
tone = -1 + 35
|
||||
if ("weird")
|
||||
tone = -(rand (1, 220)) + 35
|
||||
|
||||
s_tone = min(max(tone + rand (-25, 25), -185), 34)
|
||||
|
||||
proc/randomize_hair_color(var/target = "hair")
|
||||
if (prob (75) && target == "facial") // Chance to inherit hair color
|
||||
r_facial = r_hair
|
||||
g_facial = g_hair
|
||||
b_facial = b_hair
|
||||
return
|
||||
|
||||
var/red
|
||||
var/green
|
||||
var/blue
|
||||
|
||||
var/col = pick ("blonde", "black", "chestnut", "copper", "brown", "wheat", "old", "punk")
|
||||
switch (col)
|
||||
if ("blonde")
|
||||
red = 255
|
||||
green = 255
|
||||
blue = 0
|
||||
if ("black")
|
||||
red = 0
|
||||
green = 0
|
||||
blue = 0
|
||||
if ("chestnut")
|
||||
red = 153
|
||||
green = 102
|
||||
blue = 51
|
||||
if ("copper")
|
||||
red = 255
|
||||
green = 153
|
||||
blue = 0
|
||||
if ("brown")
|
||||
red = 102
|
||||
green = 51
|
||||
blue = 0
|
||||
if ("wheat")
|
||||
red = 255
|
||||
green = 255
|
||||
blue = 153
|
||||
if ("old")
|
||||
red = rand (100, 255)
|
||||
green = red
|
||||
blue = red
|
||||
if ("punk")
|
||||
red = rand (0, 255)
|
||||
green = rand (0, 255)
|
||||
blue = rand (0, 255)
|
||||
|
||||
red = max(min(red + rand (-25, 25), 255), 0)
|
||||
green = max(min(green + rand (-25, 25), 255), 0)
|
||||
blue = max(min(blue + rand (-25, 25), 255), 0)
|
||||
|
||||
switch (target)
|
||||
if ("hair")
|
||||
r_hair = red
|
||||
g_hair = green
|
||||
b_hair = blue
|
||||
if ("facial")
|
||||
r_facial = red
|
||||
g_facial = green
|
||||
b_facial = blue
|
||||
|
||||
proc/randomize_eyes_color()
|
||||
var/red
|
||||
var/green
|
||||
var/blue
|
||||
|
||||
var/col = pick ("black", "grey", "brown", "chestnut", "blue", "lightblue", "green", "albino", "weird")
|
||||
switch (col)
|
||||
if ("black")
|
||||
red = 0
|
||||
green = 0
|
||||
blue = 0
|
||||
if ("grey")
|
||||
red = rand (100, 200)
|
||||
green = red
|
||||
blue = red
|
||||
if ("brown")
|
||||
red = 102
|
||||
green = 51
|
||||
blue = 0
|
||||
if ("chestnut")
|
||||
red = 153
|
||||
green = 102
|
||||
blue = 0
|
||||
if ("blue")
|
||||
red = 51
|
||||
green = 102
|
||||
blue = 204
|
||||
if ("lightblue")
|
||||
red = 102
|
||||
green = 204
|
||||
blue = 255
|
||||
if ("green")
|
||||
red = 0
|
||||
green = 102
|
||||
blue = 0
|
||||
if ("albino")
|
||||
red = rand (200, 255)
|
||||
green = rand (0, 150)
|
||||
blue = rand (0, 150)
|
||||
if ("weird")
|
||||
red = rand (0, 255)
|
||||
green = rand (0, 255)
|
||||
blue = rand (0, 255)
|
||||
|
||||
red = max(min(red + rand (-25, 25), 255), 0)
|
||||
green = max(min(green + rand (-25, 25), 255), 0)
|
||||
blue = max(min(blue + rand (-25, 25), 255), 0)
|
||||
|
||||
r_eyes = red
|
||||
g_eyes = green
|
||||
b_eyes = blue
|
||||
|
||||
proc/update_preview_icon()
|
||||
del(preview_icon)
|
||||
|
||||
var/g = "m"
|
||||
if (gender == MALE)
|
||||
g = "m"
|
||||
else if (gender == FEMALE)
|
||||
g = "f"
|
||||
|
||||
preview_icon = new /icon('human.dmi', "body_[g]_s")
|
||||
|
||||
// Skin tone
|
||||
if (s_tone >= 0)
|
||||
preview_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
|
||||
else
|
||||
preview_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
|
||||
|
||||
if (underwear > 0)
|
||||
preview_icon.Blend(new /icon('human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY)
|
||||
|
||||
var/icon/eyes_s = new/icon("icon" = 'human_face.dmi', "icon_state" = "eyes_s")
|
||||
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
|
||||
|
||||
var/h_style_r = null
|
||||
switch(h_style)
|
||||
if("Short Hair")
|
||||
h_style_r = "hair_a"
|
||||
if("Long Hair")
|
||||
h_style_r = "hair_b"
|
||||
if("Cut Hair")
|
||||
h_style_r = "hair_c"
|
||||
if("Mohawk")
|
||||
h_style_r = "hair_d"
|
||||
if("Balding")
|
||||
h_style_r = "hair_e"
|
||||
if("Fag")
|
||||
h_style_r = "hair_f"
|
||||
if("Bedhead")
|
||||
h_style_r = "hair_bedhead"
|
||||
if("Dreadlocks")
|
||||
h_style_r = "hair_dreads"
|
||||
else
|
||||
h_style_r = "bald"
|
||||
|
||||
var/f_style_r = null
|
||||
switch(f_style)
|
||||
if ("Watson")
|
||||
f_style_r = "facial_watson"
|
||||
if ("Chaplin")
|
||||
f_style_r = "facial_chaplin"
|
||||
if ("Selleck")
|
||||
f_style_r = "facial_selleck"
|
||||
if ("Neckbeard")
|
||||
f_style_r = "facial_neckbeard"
|
||||
if ("Full Beard")
|
||||
f_style_r = "facial_fullbeard"
|
||||
if ("Long Beard")
|
||||
f_style_r = "facial_longbeard"
|
||||
if ("Van Dyke")
|
||||
f_style_r = "facial_vandyke"
|
||||
if ("Elvis")
|
||||
f_style_r = "facial_elvis"
|
||||
if ("Abe")
|
||||
f_style_r = "facial_abe"
|
||||
if ("Chinstrap")
|
||||
f_style_r = "facial_chin"
|
||||
if ("Hipster")
|
||||
f_style_r = "facial_hip"
|
||||
if ("Goatee")
|
||||
f_style_r = "facial_gt"
|
||||
if ("Hogan")
|
||||
f_style_r = "facial_hogan"
|
||||
else
|
||||
f_style_r = "bald"
|
||||
|
||||
var/icon/hair_s = new/icon("icon" = 'human_face.dmi', "icon_state" = "[h_style_r]_s")
|
||||
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
|
||||
|
||||
var/icon/facial_s = new/icon("icon" = 'human_face.dmi', "icon_state" = "[f_style_r]_s")
|
||||
facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
|
||||
|
||||
var/icon/mouth_s = new/icon("icon" = 'human_face.dmi', "icon_state" = "mouth_[g]_s")
|
||||
|
||||
eyes_s.Blend(hair_s, ICON_OVERLAY)
|
||||
eyes_s.Blend(mouth_s, ICON_OVERLAY)
|
||||
eyes_s.Blend(facial_s, ICON_OVERLAY)
|
||||
|
||||
preview_icon.Blend(eyes_s, ICON_OVERLAY)
|
||||
|
||||
del(mouth_s)
|
||||
del(facial_s)
|
||||
del(hair_s)
|
||||
del(eyes_s)
|
||||
|
||||
proc/ShowChoices(mob/user)
|
||||
update_preview_icon()
|
||||
@@ -394,7 +123,6 @@ datum/preferences
|
||||
dat += "<br>"
|
||||
dat += "<b>UI Style:</b> <a href=\"byond://?src=\ref[user];preferences=1;UI=input\"><b>[UI == UI_NEW ? "New" : "Old"]</b></a><br>"
|
||||
dat += "<b>Play admin midis:</b> <a href=\"byond://?src=\ref[user];preferences=1;midis=input\"><b>[midis == 1 ? "Yes" : "No"]</b></a><br>"
|
||||
//dat += "<b>Show chat bubbles:</b> <a href=\"byond://?src=\ref[user];preferences=1;bubbles=input\"><b>[bubbles == 1 ? "Yes" : "No"]</b></a><br>"
|
||||
|
||||
if((user.client) && (user.client.holder) && (user.client.holder.rank) && (user.client.holder.rank == "Game Master"))
|
||||
dat += "<hr><b>OOC</b><br>"
|
||||
@@ -440,7 +168,7 @@ datum/preferences
|
||||
src.be_special = 0
|
||||
dat += "<hr>"
|
||||
|
||||
if (!IsGuestKey(user.key))
|
||||
if(!IsGuestKey(user.key))
|
||||
dat += "<a href='byond://?src=\ref[user];preferences=1;load=1'>Load Setup</a><br>"
|
||||
dat += "<a href='byond://?src=\ref[user];preferences=1;save=1'>Save Setup</a><br>"
|
||||
|
||||
@@ -453,38 +181,35 @@ datum/preferences
|
||||
var/HTML = "<body>"
|
||||
HTML += "<tt><center>"
|
||||
HTML += "<b>Choose occupation chances</b><br>Unavailable occupations are in red.<br>"
|
||||
for(var/job in occupations)
|
||||
if(!occupation[job])
|
||||
occupation[job] = 0
|
||||
if(jobban_isbanned(user, job))
|
||||
HTML += "<font color=red>[job]</font><br>"
|
||||
for(var/datum/job/job in job_master.occupations)
|
||||
var/rank = job.title
|
||||
if(jobban_isbanned(user, rank))
|
||||
HTML += "<font color=red>[rank]</font><br>"
|
||||
continue
|
||||
if((occupation["Assistant"] != 0) && (job != "Assistant"))
|
||||
HTML += "<font color=orange>[job]</font><br>"
|
||||
if((job_civilian_low & ASSISTANT) && (rank != "Assistant"))
|
||||
HTML += "<font color=orange>[rank]</font><br>"
|
||||
continue
|
||||
if((job in command_positions) || (job == "AI"))//Bold head jobs
|
||||
HTML += "<b>[job]<a href=\"byond://?src=\ref[user];preferences=1;occ=1;job=[job]\"></b>"
|
||||
if((rank in command_positions) || (rank == "AI"))//Bold head jobs
|
||||
HTML += "<b>[rank]<a href=\"byond://?src=\ref[user];preferences=1;occ=1;job=[rank]\"></b>"
|
||||
else
|
||||
HTML += "[job]<a href=\"byond://?src=\ref[user];preferences=1;occ=1;job=[job]\">"
|
||||
HTML += "[rank]<a href=\"byond://?src=\ref[user];preferences=1;occ=1;job=[rank]\">"
|
||||
|
||||
if(job == "Assistant")//Assistant is special
|
||||
if(occupation[job] != 0)
|
||||
if(rank == "Assistant")//Assistant is special
|
||||
if(job_civilian_low & ASSISTANT)
|
||||
HTML += "<font color=green>\[Yes]</font>"
|
||||
else
|
||||
HTML += "<font color=red>\[No]</font>"
|
||||
HTML += "</a><br>"
|
||||
continue
|
||||
|
||||
switch(occupation[job])
|
||||
if(0)
|
||||
HTML += "<font color=red>\[NEVER]</font>"
|
||||
if(1)
|
||||
HTML += "<font color=blue>\[High]</font>"
|
||||
if(2)
|
||||
HTML += "<font color=green>\[Medium]</font>"
|
||||
if(3)
|
||||
HTML += "<font color=orange>\[Low]</font>"
|
||||
else HTML += "*"+occupation[job]+"*"
|
||||
if(GetJobDepartment(job, 1) & job.flag)
|
||||
HTML += "<font color=blue>\[High]</font>"
|
||||
else if(GetJobDepartment(job, 2) & job.flag)
|
||||
HTML += "<font color=green>\[Medium]</font>"
|
||||
else if(GetJobDepartment(job, 3) & job.flag)
|
||||
HTML += "<font color=orange>\[Low]</font>"
|
||||
else
|
||||
HTML += "<font color=red>\[NEVER]</font>"
|
||||
HTML += "</a><br>"
|
||||
|
||||
HTML += "<br>"
|
||||
@@ -495,37 +220,118 @@ datum/preferences
|
||||
user << browse(HTML, "window=mob_occupation;size=320x600")
|
||||
return
|
||||
|
||||
proc/SetJob(mob/user, job="Captain")
|
||||
if((!(occupations.Find(job)) && !(assistant_occupations.Find(job)) && (job != "No Preference")))
|
||||
|
||||
proc/SetJob(mob/user, role)
|
||||
var/datum/job/job = job_master.GetJob(role)
|
||||
if(!job)
|
||||
user << browse(null, "window=mob_occupation")
|
||||
ShowChoices(user)
|
||||
return
|
||||
|
||||
if(job == "Assistant")
|
||||
if(occupation[job] == 0)
|
||||
occupation[job] = 4
|
||||
if(role == "Assistant")
|
||||
if(job_civilian_low & job.flag)
|
||||
job_civilian_low &= ~job.flag
|
||||
else
|
||||
occupation[job] = 0
|
||||
job_civilian_low |= job.flag
|
||||
SetChoices(user)
|
||||
return 1
|
||||
|
||||
if(occupation[job] == 2)//Only one job may be set to "High"
|
||||
for(var/j in occupation)
|
||||
if(occupation[j] == 1)
|
||||
occupation[j] = 2
|
||||
|
||||
occupation[job] = (occupation[job]-1)
|
||||
if(occupation[job] < 0)
|
||||
occupation[job] = 3
|
||||
if(GetJobDepartment(job, 1) & job.flag)
|
||||
SetJobDepartment(job, 1)
|
||||
else if(GetJobDepartment(job, 2) & job.flag)
|
||||
SetJobDepartment(job, 2)
|
||||
else if(GetJobDepartment(job, 3) & job.flag)
|
||||
SetJobDepartment(job, 3)
|
||||
else//job = Never
|
||||
SetJobDepartment(job, 4)
|
||||
|
||||
SetChoices(user)
|
||||
|
||||
return 1
|
||||
|
||||
proc/process_link(mob/user, list/link_tags)
|
||||
|
||||
if (link_tags["occ"])
|
||||
if (link_tags["cancel"])
|
||||
proc/GetJobDepartment(var/datum/job/job, var/level)
|
||||
if(!job || !level) return 0
|
||||
switch(job.department_flag)
|
||||
if(CIVILIAN)
|
||||
switch(level)
|
||||
if(1)
|
||||
return job_civilian_high
|
||||
if(2)
|
||||
return job_civilian_med
|
||||
if(3)
|
||||
return job_civilian_low
|
||||
if(MEDSCI)
|
||||
switch(level)
|
||||
if(1)
|
||||
return job_medsci_high
|
||||
if(2)
|
||||
return job_medsci_med
|
||||
if(3)
|
||||
return job_medsci_low
|
||||
if(ENGSEC)
|
||||
switch(level)
|
||||
if(1)
|
||||
return job_engsec_high
|
||||
if(2)
|
||||
return job_engsec_med
|
||||
if(3)
|
||||
return job_engsec_low
|
||||
return 0
|
||||
|
||||
|
||||
proc/SetJobDepartment(var/datum/job/job, var/level)
|
||||
if(!job || !level) return 0
|
||||
switch(level)
|
||||
if(1)//Only one of these should ever be active at once so clear them all here
|
||||
job_civilian_high = 0
|
||||
job_medsci_high = 0
|
||||
job_engsec_high = 0
|
||||
return 1
|
||||
if(2)//Set current highs to med, then reset them
|
||||
job_civilian_med |= job_civilian_high
|
||||
job_medsci_med |= job_medsci_high
|
||||
job_engsec_med |= job_engsec_high
|
||||
job_civilian_high = 0
|
||||
job_medsci_high = 0
|
||||
job_engsec_high = 0
|
||||
|
||||
switch(job.department_flag)
|
||||
if(CIVILIAN)
|
||||
switch(level)
|
||||
if(2)
|
||||
job_civilian_high = job.flag
|
||||
job_civilian_med &= ~job.flag
|
||||
if(3)
|
||||
job_civilian_med |= job.flag
|
||||
job_civilian_low &= ~job.flag
|
||||
else
|
||||
job_civilian_low |= job.flag
|
||||
if(MEDSCI)
|
||||
switch(level)
|
||||
if(2)
|
||||
job_medsci_high = job.flag
|
||||
job_medsci_med &= ~job.flag
|
||||
if(3)
|
||||
job_medsci_med |= job.flag
|
||||
job_medsci_low &= ~job.flag
|
||||
else
|
||||
job_medsci_low |= job.flag
|
||||
if(ENGSEC)
|
||||
switch(level)
|
||||
if(2)
|
||||
job_engsec_high = job.flag
|
||||
job_engsec_med &= ~job.flag
|
||||
if(3)
|
||||
job_engsec_med |= job.flag
|
||||
job_engsec_low &= ~job.flag
|
||||
else
|
||||
job_engsec_low |= job.flag
|
||||
return 1
|
||||
|
||||
|
||||
proc/process_link(mob/user, list/link_tags)
|
||||
if(link_tags["occ"])
|
||||
if(link_tags["cancel"])
|
||||
user << browse(null, "window=\ref[user]occupation")
|
||||
return
|
||||
else if(link_tags["job"])
|
||||
@@ -535,7 +341,7 @@ datum/preferences
|
||||
|
||||
return 1
|
||||
|
||||
if (link_tags["real_name"])
|
||||
if(link_tags["real_name"])
|
||||
var/new_name
|
||||
|
||||
switch(link_tags["real_name"])
|
||||
@@ -556,135 +362,132 @@ datum/preferences
|
||||
new_name = copytext(new_name, 1, 26)
|
||||
real_name = new_name
|
||||
|
||||
if (link_tags["age"])
|
||||
if(link_tags["age"])
|
||||
switch(link_tags["age"])
|
||||
if ("input")
|
||||
if("input")
|
||||
var/new_age = input(user, "Please select type in age: 20-45", "Character Generation") as num
|
||||
if(new_age)
|
||||
age = max(min(round(text2num(new_age)), 45), 20)
|
||||
if ("random")
|
||||
if("random")
|
||||
age = rand (20, 45)
|
||||
|
||||
if (link_tags["b_type"])
|
||||
if(link_tags["b_type"])
|
||||
switch(link_tags["b_type"])
|
||||
if ("input")
|
||||
if("input")
|
||||
var/new_b_type = input(user, "Please select a blood type:", "Character Generation") as null|anything in list( "A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-" )
|
||||
if (new_b_type)
|
||||
if(new_b_type)
|
||||
b_type = new_b_type
|
||||
if ("random")
|
||||
if("random")
|
||||
b_type = pickweight ( list ("A+" = 31, "A-" = 7, "B+" = 8, "B-" = 2, "AB+" = 2, "AB-" = 1, "O+" = 40, "O-" = 9))
|
||||
|
||||
|
||||
if (link_tags["hair"])
|
||||
if(link_tags["hair"])
|
||||
switch(link_tags["hair"])
|
||||
if ("input")
|
||||
if("input")
|
||||
var/new_hair = input(user, "Please select hair color.", "Character Generation") as color
|
||||
if(new_hair)
|
||||
r_hair = hex2num(copytext(new_hair, 2, 4))
|
||||
g_hair = hex2num(copytext(new_hair, 4, 6))
|
||||
b_hair = hex2num(copytext(new_hair, 6, 8))
|
||||
if ("random")
|
||||
if("random")
|
||||
randomize_hair_color("hair")
|
||||
|
||||
if (link_tags["facial"])
|
||||
if(link_tags["facial"])
|
||||
switch(link_tags["facial"])
|
||||
if ("input")
|
||||
if("input")
|
||||
var/new_facial = input(user, "Please select facial hair color.", "Character Generation") as color
|
||||
if(new_facial)
|
||||
r_facial = hex2num(copytext(new_facial, 2, 4))
|
||||
g_facial = hex2num(copytext(new_facial, 4, 6))
|
||||
b_facial = hex2num(copytext(new_facial, 6, 8))
|
||||
if ("random")
|
||||
if("random")
|
||||
randomize_hair_color("facial")
|
||||
|
||||
if (link_tags["eyes"])
|
||||
if(link_tags["eyes"])
|
||||
switch(link_tags["eyes"])
|
||||
if ("input")
|
||||
if("input")
|
||||
var/new_eyes = input(user, "Please select eye color.", "Character Generation") as color
|
||||
if(new_eyes)
|
||||
r_eyes = hex2num(copytext(new_eyes, 2, 4))
|
||||
g_eyes = hex2num(copytext(new_eyes, 4, 6))
|
||||
b_eyes = hex2num(copytext(new_eyes, 6, 8))
|
||||
if ("random")
|
||||
if("random")
|
||||
randomize_eyes_color()
|
||||
|
||||
if (link_tags["s_tone"])
|
||||
if(link_tags["s_tone"])
|
||||
switch(link_tags["s_tone"])
|
||||
if ("random")
|
||||
if("random")
|
||||
randomize_skin_tone()
|
||||
if("input")
|
||||
var/new_tone = input(user, "Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation") as text
|
||||
if (new_tone)
|
||||
if(new_tone)
|
||||
s_tone = max(min(round(text2num(new_tone)), 220), 1)
|
||||
s_tone = -s_tone + 35
|
||||
|
||||
if (link_tags["h_style"])
|
||||
if(link_tags["h_style"])
|
||||
switch(link_tags["h_style"])
|
||||
if ("random")
|
||||
if (gender == FEMALE)
|
||||
if("random")
|
||||
if(gender == FEMALE)
|
||||
h_style = pickweight ( list ("Cut Hair" = 5, "Short Hair" = 5, "Long Hair" = 5, "Mohawk" = 5, "Balding" = 1, "Fag" = 5, "Bedhead" = 5, "Dreadlocks" = 5, "Bald" = 5))
|
||||
else
|
||||
h_style = pickweight ( list ("Cut Hair" = 5, "Short Hair" = 5, "Long Hair" = 5, "Mohawk" = 5, "Balding" = 5, "Fag" = 5, "Bedhead" = 5, "Dreadlocks" = 5, "Bald" = 5))
|
||||
|
||||
if("input")
|
||||
var/new_style = input(user, "Please select hair style", "Character Generation") as null|anything in list( "Cut Hair", "Short Hair", "Long Hair", "Mohawk", "Balding", "Fag", "Bedhead", "Dreadlocks", "Bald" )
|
||||
if (new_style)
|
||||
if(new_style)
|
||||
h_style = new_style
|
||||
|
||||
if (link_tags["ooccolor"])
|
||||
if(link_tags["ooccolor"])
|
||||
var/ooccolor = input(user, "Please select OOC colour.", "OOC colour") as color
|
||||
|
||||
if(ooccolor)
|
||||
src.ooccolor = ooccolor
|
||||
|
||||
if (link_tags["f_style"])
|
||||
if(link_tags["f_style"])
|
||||
switch(link_tags["f_style"])
|
||||
if ("random")
|
||||
if (gender == FEMALE)
|
||||
if("random")
|
||||
if(gender == FEMALE)
|
||||
f_style = pickweight ( list("Watson" = 1, "Chaplin" = 1, "Selleck" = 1, "Full Beard" = 1, "Long Beard" = 1, "Neckbeard" = 1, "Van Dyke" = 1, "Elvis" = 1, "Abe" = 1, "Chinstrap" = 1, "Hipster" = 1, "Goatee" = 1, "Hogan" = 1, "Shaved" = 100))
|
||||
else
|
||||
f_style = pickweight ( list("Watson" = 1, "Chaplin" = 1, "Selleck" = 1, "Full Beard" = 1, "Long Beard" = 1, "Neckbeard" = 1, "Van Dyke" = 1, "Elvis" = 1, "Abe" = 1, "Chinstrap" = 1, "Hipster" = 1, "Goatee" = 1, "Hogan" = 1, "Shaved" = 10))
|
||||
if("input")
|
||||
var/new_style = input(user, "Please select facial style", "Character Generation") as null|anything in list("Watson", "Chaplin", "Selleck", "Full Beard", "Long Beard", "Neckbeard", "Van Dyke", "Elvis", "Abe", "Chinstrap", "Hipster", "Goatee", "Hogan", "Shaved")
|
||||
if (new_style)
|
||||
if(new_style)
|
||||
f_style = new_style
|
||||
|
||||
if (link_tags["gender"])
|
||||
if (gender == MALE)
|
||||
if(link_tags["gender"])
|
||||
if(gender == MALE)
|
||||
gender = FEMALE
|
||||
else
|
||||
gender = MALE
|
||||
|
||||
if (link_tags["UI"])
|
||||
if (UI == UI_OLD)
|
||||
if(link_tags["UI"])
|
||||
if(UI == UI_OLD)
|
||||
UI = UI_NEW
|
||||
else
|
||||
UI = UI_OLD
|
||||
|
||||
if (link_tags["midis"])
|
||||
if(link_tags["midis"])
|
||||
midis = (midis+1)%2
|
||||
|
||||
if (link_tags["bubbles"])
|
||||
bubbles = !bubbles
|
||||
|
||||
if (link_tags["underwear"])
|
||||
if(link_tags["underwear"])
|
||||
if(!IsGuestKey(user.key))
|
||||
switch(link_tags["underwear"])
|
||||
if ("random")
|
||||
if (prob (75))
|
||||
if("random")
|
||||
if(prob (75))
|
||||
underwear = 1
|
||||
else
|
||||
underwear = 0
|
||||
if("input")
|
||||
if (underwear == 1)
|
||||
if(underwear == 1)
|
||||
underwear = 0
|
||||
else
|
||||
underwear = 1
|
||||
|
||||
if (link_tags["be_special"])
|
||||
if(link_tags["be_special"])
|
||||
src.be_special^=(1<<text2num(link_tags["be_special"])) //bitwize magic, sorry for that. --rastaf0
|
||||
|
||||
if (link_tags["b_random_name"])
|
||||
if(link_tags["b_random_name"])
|
||||
be_random_name = !be_random_name
|
||||
|
||||
if(!IsGuestKey(user.key))
|
||||
@@ -692,18 +495,24 @@ datum/preferences
|
||||
savefile_save(user)
|
||||
|
||||
else if(link_tags["load"])
|
||||
if (!savefile_load(user, 0))
|
||||
if(!savefile_load(user, 0))
|
||||
alert(user, "You do not have a savefile.")
|
||||
|
||||
if (link_tags["reset_all"])
|
||||
if(link_tags["reset_all"])
|
||||
gender = MALE
|
||||
randomize_name()
|
||||
|
||||
age = 30
|
||||
for(var/o in occupation)
|
||||
occupation[o] = 0
|
||||
job_civilian_high = 0
|
||||
job_civilian_med = 0
|
||||
job_civilian_low = 0
|
||||
job_medsci_high = 0
|
||||
job_medsci_med = 0
|
||||
job_medsci_low = 0
|
||||
job_engsec_high = 0
|
||||
job_engsec_med = 0
|
||||
job_engsec_low = 0
|
||||
underwear = 1
|
||||
//be_syndicate = 0
|
||||
be_special = 0
|
||||
be_random_name = 0
|
||||
r_hair = 0.0
|
||||
@@ -721,11 +530,10 @@ datum/preferences
|
||||
b_type = "A+"
|
||||
UI = UI_OLD
|
||||
midis = 1
|
||||
bubbles = 1
|
||||
|
||||
|
||||
ShowChoices(user)
|
||||
|
||||
|
||||
proc/copy_to(mob/living/carbon/human/character, safety = 0)
|
||||
if(be_random_name)
|
||||
randomize_name()
|
||||
@@ -754,9 +562,9 @@ datum/preferences
|
||||
character.f_style = f_style
|
||||
|
||||
switch (UI)
|
||||
if (UI_OLD)
|
||||
if(UI_OLD)
|
||||
character.UI = 'screen1_old.dmi'
|
||||
if (UI_NEW)
|
||||
if(UI_NEW)
|
||||
character.UI = 'screen1.dmi'
|
||||
|
||||
switch(h_style)
|
||||
@@ -780,31 +588,31 @@ datum/preferences
|
||||
character.hair_icon_state = "bald"
|
||||
|
||||
switch(f_style)
|
||||
if ("Watson")
|
||||
if("Watson")
|
||||
character.face_icon_state = "facial_watson"
|
||||
if ("Chaplin")
|
||||
if("Chaplin")
|
||||
character.face_icon_state = "facial_chaplin"
|
||||
if ("Selleck")
|
||||
if("Selleck")
|
||||
character.face_icon_state = "facial_selleck"
|
||||
if ("Neckbeard")
|
||||
if("Neckbeard")
|
||||
character.face_icon_state = "facial_neckbeard"
|
||||
if ("Full Beard")
|
||||
if("Full Beard")
|
||||
character.face_icon_state = "facial_fullbeard"
|
||||
if ("Long Beard")
|
||||
if("Long Beard")
|
||||
character.face_icon_state = "facial_longbeard"
|
||||
if ("Van Dyke")
|
||||
if("Van Dyke")
|
||||
character.face_icon_state = "facial_vandyke"
|
||||
if ("Elvis")
|
||||
if("Elvis")
|
||||
character.face_icon_state = "facial_elvis"
|
||||
if ("Abe")
|
||||
if("Abe")
|
||||
character.face_icon_state = "facial_abe"
|
||||
if ("Chinstrap")
|
||||
if("Chinstrap")
|
||||
character.face_icon_state = "facial_chin"
|
||||
if ("Hipster")
|
||||
if("Hipster")
|
||||
character.face_icon_state = "facial_hip"
|
||||
if ("Goatee")
|
||||
if("Goatee")
|
||||
character.face_icon_state = "facial_gt"
|
||||
if ("Hogan")
|
||||
if("Hogan")
|
||||
character.face_icon_state = "facial_hogan"
|
||||
else
|
||||
character.face_icon_state = "bald"
|
||||
@@ -818,26 +626,9 @@ datum/preferences
|
||||
spawn(10)
|
||||
if(character&&character.client)
|
||||
character.client.midis = midis
|
||||
character.client.bubbles = bubbles
|
||||
character.client.ooccolor = ooccolor
|
||||
character.client.be_alien = be_special&BE_ALIEN
|
||||
character.client.be_pai = be_special&BE_PAI
|
||||
|
||||
/*
|
||||
|
||||
if (!M.real_name || M.be_random_name)
|
||||
if (M.gender == "male")
|
||||
M.real_name = capitalize(pick(first_names_male) + " " + capitalize(pick(last_names)))
|
||||
else
|
||||
M.real_name = capitalize(pick(first_names_female) + " " + capitalize(pick(last_names)))
|
||||
for(var/mob/living/carbon/human/H in world)
|
||||
if(cmptext(H.real_name,M.real_name))
|
||||
usr << "You are using a name that is very similar to a currently used name, please choose another one using Character Setup."
|
||||
return
|
||||
if(cmptext("Unknown",M.real_name))
|
||||
usr << "This name is reserved for use by the game, please choose another one using Character Setup."
|
||||
return
|
||||
|
||||
*/
|
||||
#undef UI_OLD
|
||||
#undef UI_NEW
|
||||
@@ -0,0 +1,306 @@
|
||||
datum/preferences
|
||||
//The mob should have a gender you want before running this proc.
|
||||
proc/randomize_appearance_for(var/mob/living/carbon/human/H)
|
||||
if(H.gender == MALE)
|
||||
gender = MALE
|
||||
else
|
||||
gender = FEMALE
|
||||
randomize_skin_tone()
|
||||
randomize_hair(gender)
|
||||
randomize_hair_color("hair")
|
||||
if(gender == MALE)//only for dudes.
|
||||
randomize_facial()
|
||||
randomize_hair_color("facial")
|
||||
randomize_eyes_color()
|
||||
underwear = pick(0,1)
|
||||
b_type = pick("A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-")
|
||||
age = rand(19,35)
|
||||
copy_to(H,1)
|
||||
|
||||
proc/randomize_name()
|
||||
if(gender == MALE)
|
||||
real_name = capitalize(pick(first_names_male) + " " + capitalize(pick(last_names)))
|
||||
else
|
||||
real_name = capitalize(pick(first_names_female) + " " + capitalize(pick(last_names)))
|
||||
return
|
||||
|
||||
proc/randomize_hair(var/gender)
|
||||
//Women are more likely to have longer hair.
|
||||
var/temp = gender==FEMALE&&prob(80) ? pick(2,6,8) : rand(1,9)
|
||||
switch(temp)
|
||||
if(1)
|
||||
h_style = "Short Hair"
|
||||
if(2)
|
||||
h_style = "Long Hair"
|
||||
if(3)
|
||||
h_style = "Cut Hair"
|
||||
if(4)
|
||||
h_style = "Mohawk"
|
||||
if(5)
|
||||
h_style = "Balding"
|
||||
if(6)
|
||||
h_style = "Fag"
|
||||
if(7)
|
||||
h_style = "Bedhead"
|
||||
if(8)
|
||||
h_style = "Dreadlocks"
|
||||
else
|
||||
h_style = "bald"
|
||||
|
||||
proc/randomize_facial()
|
||||
var/temp = prob(50) ? 14 : rand(1,13)//50% of not having a beard. Otherwise get a random one.
|
||||
switch(temp)
|
||||
if(1)
|
||||
f_style = "Watson"
|
||||
if(2)
|
||||
f_style = "Chaplin"
|
||||
if(3)
|
||||
f_style = "Selleck"
|
||||
if(4)
|
||||
f_style = "Neckbeard"
|
||||
if(5)
|
||||
f_style = "Full Beard"
|
||||
if(6)
|
||||
f_style = "Long Beard"
|
||||
if(7)
|
||||
f_style = "Van Dyke"
|
||||
if(8)
|
||||
f_style = "Elvis"
|
||||
if(9)
|
||||
f_style = "Abe"
|
||||
if(10)
|
||||
f_style = "Chinstrap"
|
||||
if(11)
|
||||
f_style = "Hipster"
|
||||
if(12)
|
||||
f_style = "Goatee"
|
||||
if(13)
|
||||
f_style = "Hogan"
|
||||
else
|
||||
f_style = "bald"
|
||||
|
||||
proc/randomize_skin_tone()
|
||||
var/tone
|
||||
|
||||
var/tmp = pickweight ( list ("caucasian" = 55, "afroamerican" = 15, "african" = 10, "latino" = 10, "albino" = 5, "weird" = 5))
|
||||
switch (tmp)
|
||||
if ("caucasian")
|
||||
tone = -45 + 35
|
||||
if ("afroamerican")
|
||||
tone = -150 + 35
|
||||
if ("african")
|
||||
tone = -200 + 35
|
||||
if ("latino")
|
||||
tone = -90 + 35
|
||||
if ("albino")
|
||||
tone = -1 + 35
|
||||
if ("weird")
|
||||
tone = -(rand (1, 220)) + 35
|
||||
|
||||
s_tone = min(max(tone + rand (-25, 25), -185), 34)
|
||||
|
||||
proc/randomize_hair_color(var/target = "hair")
|
||||
if (prob (75) && target == "facial") // Chance to inherit hair color
|
||||
r_facial = r_hair
|
||||
g_facial = g_hair
|
||||
b_facial = b_hair
|
||||
return
|
||||
|
||||
var/red
|
||||
var/green
|
||||
var/blue
|
||||
|
||||
var/col = pick ("blonde", "black", "chestnut", "copper", "brown", "wheat", "old", "punk")
|
||||
switch (col)
|
||||
if ("blonde")
|
||||
red = 255
|
||||
green = 255
|
||||
blue = 0
|
||||
if ("black")
|
||||
red = 0
|
||||
green = 0
|
||||
blue = 0
|
||||
if ("chestnut")
|
||||
red = 153
|
||||
green = 102
|
||||
blue = 51
|
||||
if ("copper")
|
||||
red = 255
|
||||
green = 153
|
||||
blue = 0
|
||||
if ("brown")
|
||||
red = 102
|
||||
green = 51
|
||||
blue = 0
|
||||
if ("wheat")
|
||||
red = 255
|
||||
green = 255
|
||||
blue = 153
|
||||
if ("old")
|
||||
red = rand (100, 255)
|
||||
green = red
|
||||
blue = red
|
||||
if ("punk")
|
||||
red = rand (0, 255)
|
||||
green = rand (0, 255)
|
||||
blue = rand (0, 255)
|
||||
|
||||
red = max(min(red + rand (-25, 25), 255), 0)
|
||||
green = max(min(green + rand (-25, 25), 255), 0)
|
||||
blue = max(min(blue + rand (-25, 25), 255), 0)
|
||||
|
||||
switch (target)
|
||||
if ("hair")
|
||||
r_hair = red
|
||||
g_hair = green
|
||||
b_hair = blue
|
||||
if ("facial")
|
||||
r_facial = red
|
||||
g_facial = green
|
||||
b_facial = blue
|
||||
|
||||
proc/randomize_eyes_color()
|
||||
var/red
|
||||
var/green
|
||||
var/blue
|
||||
|
||||
var/col = pick ("black", "grey", "brown", "chestnut", "blue", "lightblue", "green", "albino", "weird")
|
||||
switch (col)
|
||||
if ("black")
|
||||
red = 0
|
||||
green = 0
|
||||
blue = 0
|
||||
if ("grey")
|
||||
red = rand (100, 200)
|
||||
green = red
|
||||
blue = red
|
||||
if ("brown")
|
||||
red = 102
|
||||
green = 51
|
||||
blue = 0
|
||||
if ("chestnut")
|
||||
red = 153
|
||||
green = 102
|
||||
blue = 0
|
||||
if ("blue")
|
||||
red = 51
|
||||
green = 102
|
||||
blue = 204
|
||||
if ("lightblue")
|
||||
red = 102
|
||||
green = 204
|
||||
blue = 255
|
||||
if ("green")
|
||||
red = 0
|
||||
green = 102
|
||||
blue = 0
|
||||
if ("albino")
|
||||
red = rand (200, 255)
|
||||
green = rand (0, 150)
|
||||
blue = rand (0, 150)
|
||||
if ("weird")
|
||||
red = rand (0, 255)
|
||||
green = rand (0, 255)
|
||||
blue = rand (0, 255)
|
||||
|
||||
red = max(min(red + rand (-25, 25), 255), 0)
|
||||
green = max(min(green + rand (-25, 25), 255), 0)
|
||||
blue = max(min(blue + rand (-25, 25), 255), 0)
|
||||
|
||||
r_eyes = red
|
||||
g_eyes = green
|
||||
b_eyes = blue
|
||||
|
||||
proc/update_preview_icon()
|
||||
del(preview_icon)
|
||||
|
||||
var/g = "m"
|
||||
if (gender == MALE)
|
||||
g = "m"
|
||||
else if (gender == FEMALE)
|
||||
g = "f"
|
||||
|
||||
preview_icon = new /icon('human.dmi', "body_[g]_s")
|
||||
|
||||
// Skin tone
|
||||
if (s_tone >= 0)
|
||||
preview_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
|
||||
else
|
||||
preview_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
|
||||
|
||||
if (underwear > 0)
|
||||
preview_icon.Blend(new /icon('human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY)
|
||||
|
||||
var/icon/eyes_s = new/icon("icon" = 'human_face.dmi', "icon_state" = "eyes_s")
|
||||
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
|
||||
|
||||
var/h_style_r = null
|
||||
switch(h_style)
|
||||
if("Short Hair")
|
||||
h_style_r = "hair_a"
|
||||
if("Long Hair")
|
||||
h_style_r = "hair_b"
|
||||
if("Cut Hair")
|
||||
h_style_r = "hair_c"
|
||||
if("Mohawk")
|
||||
h_style_r = "hair_d"
|
||||
if("Balding")
|
||||
h_style_r = "hair_e"
|
||||
if("Fag")
|
||||
h_style_r = "hair_f"
|
||||
if("Bedhead")
|
||||
h_style_r = "hair_bedhead"
|
||||
if("Dreadlocks")
|
||||
h_style_r = "hair_dreads"
|
||||
else
|
||||
h_style_r = "bald"
|
||||
|
||||
var/f_style_r = null
|
||||
switch(f_style)
|
||||
if ("Watson")
|
||||
f_style_r = "facial_watson"
|
||||
if ("Chaplin")
|
||||
f_style_r = "facial_chaplin"
|
||||
if ("Selleck")
|
||||
f_style_r = "facial_selleck"
|
||||
if ("Neckbeard")
|
||||
f_style_r = "facial_neckbeard"
|
||||
if ("Full Beard")
|
||||
f_style_r = "facial_fullbeard"
|
||||
if ("Long Beard")
|
||||
f_style_r = "facial_longbeard"
|
||||
if ("Van Dyke")
|
||||
f_style_r = "facial_vandyke"
|
||||
if ("Elvis")
|
||||
f_style_r = "facial_elvis"
|
||||
if ("Abe")
|
||||
f_style_r = "facial_abe"
|
||||
if ("Chinstrap")
|
||||
f_style_r = "facial_chin"
|
||||
if ("Hipster")
|
||||
f_style_r = "facial_hip"
|
||||
if ("Goatee")
|
||||
f_style_r = "facial_gt"
|
||||
if ("Hogan")
|
||||
f_style_r = "facial_hogan"
|
||||
else
|
||||
f_style_r = "bald"
|
||||
|
||||
var/icon/hair_s = new/icon("icon" = 'human_face.dmi', "icon_state" = "[h_style_r]_s")
|
||||
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
|
||||
|
||||
var/icon/facial_s = new/icon("icon" = 'human_face.dmi', "icon_state" = "[f_style_r]_s")
|
||||
facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
|
||||
|
||||
var/icon/mouth_s = new/icon("icon" = 'human_face.dmi', "icon_state" = "mouth_[g]_s")
|
||||
|
||||
eyes_s.Blend(hair_s, ICON_OVERLAY)
|
||||
eyes_s.Blend(mouth_s, ICON_OVERLAY)
|
||||
eyes_s.Blend(facial_s, ICON_OVERLAY)
|
||||
|
||||
preview_icon.Blend(eyes_s, ICON_OVERLAY)
|
||||
|
||||
del(mouth_s)
|
||||
del(facial_s)
|
||||
del(hair_s)
|
||||
del(eyes_s)
|
||||
@@ -1,5 +1,5 @@
|
||||
#define SAVEFILE_VERSION_MIN 2
|
||||
#define SAVEFILE_VERSION_MAX 3
|
||||
#define SAVEFILE_VERSION_MIN 3
|
||||
#define SAVEFILE_VERSION_MAX 4
|
||||
|
||||
datum/preferences/proc/savefile_path(mob/user)
|
||||
return "data/player_saves/[copytext(user.ckey, 1, 2)]/[user.ckey]/preferences.sav"
|
||||
@@ -9,25 +9,31 @@ datum/preferences/proc/savefile_save(mob/user)
|
||||
return 0
|
||||
|
||||
var/savefile/F = new /savefile(src.savefile_path(user))
|
||||
var/version
|
||||
F["version"] >> version
|
||||
|
||||
if (!isnull(version) && version<=2)
|
||||
F["be_syndicate"] << null
|
||||
F["be_alien"] << null
|
||||
F["UI"] << null
|
||||
// var/version
|
||||
// F["version"] >> version
|
||||
|
||||
F["version"] << SAVEFILE_VERSION_MAX
|
||||
|
||||
F["real_name"] << src.real_name
|
||||
F["name_is_always_random"] << src.be_random_name
|
||||
|
||||
F["gender"] << src.gender
|
||||
F["age"] << src.age
|
||||
for(var/job in uniquelist(occupations + assistant_occupations))
|
||||
//world << src.occupation[job]
|
||||
F["occupation_"+job] << src.occupation[job]
|
||||
//F["occupation_1"] << src.occupation[1]
|
||||
//F["occupation_2"] << src.occupation[2]
|
||||
//F["occupation_3"] << src.occupation[3]
|
||||
|
||||
//Job data
|
||||
F["job_civilian_high"] << src.job_civilian_high
|
||||
F["job_civilian_med"] << src.job_civilian_med
|
||||
F["job_civilian_low"] << src.job_civilian_low
|
||||
|
||||
F["job_medsci_high"] << src.job_medsci_high
|
||||
F["job_medsci_med"] << src.job_medsci_med
|
||||
F["job_medsci_low"] << src.job_medsci_low
|
||||
|
||||
F["job_engsec_high"] << src.job_engsec_high
|
||||
F["job_engsec_med"] << src.job_engsec_med
|
||||
F["job_engsec_low"] << src.job_engsec_low
|
||||
|
||||
//Body data
|
||||
F["hair_red"] << src.r_hair
|
||||
F["hair_green"] << src.g_hair
|
||||
F["hair_blue"] << src.b_hair
|
||||
@@ -41,17 +47,13 @@ datum/preferences/proc/savefile_save(mob/user)
|
||||
F["eyes_green"] << src.g_eyes
|
||||
F["eyes_blue"] << src.b_eyes
|
||||
F["blood_type"] << src.b_type
|
||||
//F["be_syndicate"] << src.be_syndicate
|
||||
F["be_special"] << src.be_special
|
||||
F["underwear"] << src.underwear
|
||||
F["name_is_always_random"] << src.be_random_name
|
||||
F["UI"] << src.UI // Skie
|
||||
//world << "DEBUG: saving UI as [UI]"
|
||||
//F["be_alien"] << src.be_alien // Urist
|
||||
F["midis"] << src.midis // Urist
|
||||
F["bubbles"] << src.bubbles // Doohl
|
||||
F["ooccolor"] << src.ooccolor // Urist
|
||||
F["lastchangelog"] << src.lastchangelog // rastaf0
|
||||
|
||||
F["be_special"] << src.be_special
|
||||
F["UI"] << src.UI
|
||||
F["midis"] << src.midis
|
||||
F["ooccolor"] << src.ooccolor
|
||||
F["lastchangelog"] << src.lastchangelog
|
||||
|
||||
|
||||
return 1
|
||||
@@ -61,14 +63,11 @@ datum/preferences/proc/savefile_save(mob/user)
|
||||
// returns 1 if loaded (or file was incompatible)
|
||||
// returns 0 if savefile did not exist
|
||||
|
||||
datum/preferences/proc/savefile_load(mob/user, var/silent = 1)
|
||||
if (IsGuestKey(user.key))
|
||||
return 0
|
||||
datum/preferences/proc/savefile_load(mob/user)
|
||||
if(IsGuestKey(user.key)) return 0
|
||||
|
||||
var/path = savefile_path(user)
|
||||
|
||||
if (!fexists(path))
|
||||
return 0
|
||||
if(!fexists(path)) return 0
|
||||
|
||||
var/savefile/F = new /savefile(path)
|
||||
|
||||
@@ -77,20 +76,13 @@ datum/preferences/proc/savefile_load(mob/user, var/silent = 1)
|
||||
|
||||
if (isnull(version) || version < SAVEFILE_VERSION_MIN || version > SAVEFILE_VERSION_MAX)
|
||||
fdel(path)
|
||||
|
||||
// if (!silent)
|
||||
// alert(user, "Your savefile was incompatible with this version and was deleted.")
|
||||
|
||||
alert(user, "Your savefile was incompatible with this version and was deleted.")
|
||||
return 0
|
||||
|
||||
F["real_name"] >> src.real_name
|
||||
F["gender"] >> src.gender
|
||||
F["age"] >> src.age
|
||||
for(var/job in uniquelist(occupations + assistant_occupations))
|
||||
F["occupation_"+job] >> src.occupation[job]
|
||||
//F["occupation_1"] >> src.occupation[1]
|
||||
//F["occupation_2"] >> src.occupation[2]
|
||||
//F["occupation_3"] >> src.occupation[3]
|
||||
|
||||
F["hair_red"] >> src.r_hair
|
||||
F["hair_green"] >> src.g_hair
|
||||
F["hair_blue"] >> src.b_hair
|
||||
@@ -106,37 +98,25 @@ datum/preferences/proc/savefile_load(mob/user, var/silent = 1)
|
||||
F["blood_type"] >> src.b_type
|
||||
F["underwear"] >> src.underwear
|
||||
F["name_is_always_random"] >> src.be_random_name
|
||||
//F["be_alien"] >> src.be_alien // Urist
|
||||
F["midis"] >> src.midis // Urist
|
||||
F["bubbles"] >> src.bubbles // Doohl
|
||||
F["ooccolor"] >> src.ooccolor // Urist
|
||||
F["lastchangelog"] >> src.lastchangelog // rastaf0
|
||||
F["midis"] >> src.midis
|
||||
F["ooccolor"] >> src.ooccolor
|
||||
F["lastchangelog"] >> src.lastchangelog
|
||||
F["UI"] >> src.UI
|
||||
F["be_special"] >> src.be_special
|
||||
|
||||
if(version && (version >= SAVEFILE_VERSION_MAX))
|
||||
F["job_civilian_high"] >> src.job_civilian_high
|
||||
F["job_civilian_med"] >> src.job_civilian_med
|
||||
F["job_civilian_low"] >> src.job_civilian_low
|
||||
|
||||
F["job_medsci_high"] >> src.job_medsci_high
|
||||
F["job_medsci_med"] >> src.job_medsci_med
|
||||
F["job_medsci_low"] >> src.job_medsci_low
|
||||
|
||||
F["job_engsec_high"] >> src.job_engsec_high
|
||||
F["job_engsec_med"] >> src.job_engsec_med
|
||||
F["job_engsec_low"] >> src.job_engsec_low
|
||||
|
||||
if (version<=2) // migration from old preferences file format --rastaf0
|
||||
src.UI = 0 // swithing from storing an image file to storing boolean value --rastaf0
|
||||
//world << "DEBUG: loading legacy UI as [UI]"
|
||||
var/tmp
|
||||
F["be_syndicate"] >> tmp
|
||||
if (tmp)
|
||||
be_special |= BE_TRAITOR
|
||||
be_special |= BE_OPERATIVE
|
||||
be_special |= BE_CHANGELING
|
||||
be_special |= BE_WIZARD
|
||||
be_special |= BE_MALF
|
||||
be_special |= BE_REV
|
||||
F["be_alien"] >> tmp
|
||||
F["be_pai"] >> tmp
|
||||
if (tmp)
|
||||
be_special |= BE_ALIEN
|
||||
be_special |= BE_PAI
|
||||
del(F)
|
||||
fdel(path)
|
||||
savefile_save(user)
|
||||
else // /migration end
|
||||
F["UI"] >> src.UI
|
||||
F["be_special"] >> src.be_special
|
||||
//world << "DEBUG: loading new UI as [UI]"
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
@@ -399,7 +399,7 @@
|
||||
if("hand")
|
||||
usr:swap_hand()
|
||||
if("resist")
|
||||
if (usr.next_move < world.time)
|
||||
if(usr.next_move < world.time)
|
||||
return
|
||||
usr.next_move = world.time + 20
|
||||
if ((!( usr.stat ) && usr.canmove && !( usr.restrained() )))
|
||||
|
||||
@@ -11,8 +11,7 @@
|
||||
icon = null
|
||||
invisibility = 101
|
||||
for(var/t in organs)
|
||||
//organs[text("[]", t)] = null
|
||||
del(organs[text("[]", t)])
|
||||
del(t)
|
||||
var/atom/movable/overlay/animation = new /atom/movable/overlay( loc )
|
||||
animation.icon_state = "blank"
|
||||
animation.icon = 'mob.dmi'
|
||||
@@ -53,7 +52,7 @@
|
||||
if (monkeyizing)
|
||||
return
|
||||
for(var/t in organs)
|
||||
del(organs[text("[]", t)])
|
||||
del(t)
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/AIize()
|
||||
@@ -155,7 +154,7 @@
|
||||
icon = null
|
||||
invisibility = 101
|
||||
for(var/t in organs)
|
||||
del(organs[text("[t]")])
|
||||
del(t)
|
||||
if(client)
|
||||
//client.screen -= main_hud1.contents
|
||||
client.screen -= hud_used.contents
|
||||
@@ -218,7 +217,7 @@
|
||||
icon = null
|
||||
invisibility = 101
|
||||
for(var/t in organs)
|
||||
del(organs[t])
|
||||
del(t)
|
||||
|
||||
var/alien_caste = pick("Hunter","Sentinel","Drone")
|
||||
var/mob/living/carbon/alien/humanoid/new_xeno
|
||||
@@ -258,7 +257,7 @@
|
||||
icon = null
|
||||
invisibility = 101
|
||||
for(var/t in organs)
|
||||
del(organs[t])
|
||||
del(t)
|
||||
|
||||
if(reproduce)
|
||||
var/number = pick(2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4)
|
||||
|
||||
@@ -327,7 +327,7 @@
|
||||
var/turf/T = get_turf_loc(src)
|
||||
var/obj/structure/cable/N = T.get_cable_node()
|
||||
if (prob(50) && electrocute_mob(usr, N, N))
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
return
|
||||
@@ -345,7 +345,7 @@
|
||||
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
|
||||
if(do_after(user, 50))
|
||||
if (prob(50) && electrocute_mob(usr, terminal.powernet, terminal))
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
return
|
||||
@@ -851,11 +851,11 @@
|
||||
malfai << "Hack complete. The APC is now under your exclusive control. Discharging cell to fuse interface."
|
||||
updateicon()
|
||||
|
||||
var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
|
||||
var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
|
||||
smoke.set_up(3, 0, src.loc)
|
||||
smoke.attach(src)
|
||||
smoke.start()
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
for(var/mob/M in viewers(src))
|
||||
@@ -880,11 +880,11 @@
|
||||
cell.corrupt()
|
||||
src.malfhack = 1
|
||||
updateicon()
|
||||
var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
|
||||
var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
|
||||
smoke.set_up(3, 0, src.loc)
|
||||
smoke.attach(src)
|
||||
smoke.start()
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
for(var/mob/M in viewers(src))
|
||||
@@ -1160,7 +1160,7 @@
|
||||
/obj/machinery/power/apc/proc/shock(mob/user, prb)
|
||||
if(!prob(prb))
|
||||
return 0
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
if (electrocute_mob(user, src, src))
|
||||
|
||||
@@ -193,7 +193,7 @@
|
||||
if(!prob(prb))
|
||||
return 0
|
||||
if (electrocute_mob(user, powernets[src.netnum], src, siemens_coeff))
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
return 1
|
||||
|
||||
@@ -222,7 +222,7 @@
|
||||
else if(status == LIGHT_EMPTY)
|
||||
user << "You stick \the [W] into the light socket!"
|
||||
if(has_power() && (W.flags & CONDUCT))
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
//if(!user.mutations & COLD_RESISTANCE)
|
||||
@@ -282,7 +282,7 @@
|
||||
else
|
||||
user << "You try to remove the light [fitting], but you burn your hand on it!"
|
||||
|
||||
var/datum/organ/external/affecting = H.organs["[user.hand ? "l" : "r" ]_hand"]
|
||||
var/datum/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_arm")
|
||||
|
||||
affecting.take_damage( 0, 5 ) // 5 burn damage
|
||||
|
||||
@@ -324,7 +324,7 @@
|
||||
if(status == LIGHT_OK || status == LIGHT_BURNED)
|
||||
playsound(src.loc, 'Glasshit.ogg', 75, 1)
|
||||
if(on)
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
status = LIGHT_BROKEN
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
del(src)
|
||||
return 0
|
||||
if(iscarbon(user))
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, user.loc)
|
||||
s.start()
|
||||
var/shock_damage = min(rand(30,40),rand(30,40))
|
||||
@@ -72,7 +72,7 @@
|
||||
user.throw_at(target, 200, 4)
|
||||
return
|
||||
else if(issilicon(user))
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, user.loc)
|
||||
s.start()
|
||||
var/shock_damage = rand(15,30)
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
A.icon_state = "u_laser"
|
||||
playsound(src.loc, 'emitter.ogg', 25, 1)
|
||||
if(prob(35))
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
A.dir = src.dir
|
||||
|
||||
@@ -324,7 +324,7 @@
|
||||
for(var/mob/M in viewers(src))
|
||||
M.show_message("\red The [src.name] is making strange noises!", 3, "\red You hear sizzling electronics.", 2)
|
||||
sleep(10*pick(4,5,6,7,10,14))
|
||||
var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
|
||||
var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
|
||||
smoke.set_up(3, 0, src.loc)
|
||||
smoke.attach(src)
|
||||
smoke.start()
|
||||
@@ -333,7 +333,7 @@
|
||||
return
|
||||
if(prob(15)) //Power drain
|
||||
world << "\red SMES power drain in [src.loc.loc]"
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if(prob(50))
|
||||
@@ -342,7 +342,7 @@
|
||||
emp_act(2)
|
||||
if(prob(5)) //smoke only
|
||||
world << "\red SMES smoke in [src.loc.loc]"
|
||||
var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
|
||||
var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
|
||||
smoke.set_up(3, 0, src.loc)
|
||||
smoke.attach(src)
|
||||
smoke.start()
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
|
||||
if(istype(user, /mob/living))
|
||||
var/mob/living/M = user
|
||||
if ((M.mutations & CLOWN) && prob(50))
|
||||
if ((M.mutations & CLUMSY) && prob(50))
|
||||
M << "\red The [src.name] blows up in your face."
|
||||
M.take_organ_damage(0,20)
|
||||
M.drop_item()
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
obj/item/weapon/cell/power_supply //What type of power cell this uses
|
||||
charge_cost = 100 //How much energy is needed to fire.
|
||||
cell_type = "/obj/item/weapon/cell"
|
||||
projectile_type = "/obj/item/projectile"
|
||||
projectile_type = "/obj/item/projectile/energy"
|
||||
|
||||
emp_act(severity)
|
||||
power_supply.use(round(power_supply.maxcharge / severity))
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
charge_cost = 100 //How much energy is needed to fire.
|
||||
projectile_type = "/obj/item/projectile/energy/electrode"
|
||||
origin_tech = "combat=3;magnets=2"
|
||||
|
||||
var
|
||||
mode = 0 //0 = stun, 1 = kill
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
icon_state = "taser"
|
||||
fire_sound = 'Taser.ogg'
|
||||
charge_cost = 100
|
||||
projectile_type = "/obj/item/projectile/electrode"
|
||||
projectile_type = "/obj/item/projectile/energy/electrode"
|
||||
cell_type = "/obj/item/weapon/cell/crap"
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
fire_sound = 'Gunshot.ogg'
|
||||
origin_tech = "combat=3;materials=3;powerstorage=2"
|
||||
charge_cost = 125
|
||||
projectile_type = "/obj/item/projectile/electrode"
|
||||
projectile_type = "/obj/item/projectile/energy/electrode"
|
||||
cell_type = "/obj/item/weapon/cell"
|
||||
|
||||
|
||||
@@ -80,6 +80,6 @@
|
||||
w_class = 4.0
|
||||
force = 10
|
||||
m_amt = 200000
|
||||
projectile_type = "/obj/item/projectile/largebolt"
|
||||
projectile_type = "/obj/item/projectile/energy/bolt/large"
|
||||
|
||||
|
||||
|
||||
@@ -1,16 +1,15 @@
|
||||
/obj/item/projectile/energy
|
||||
name = "energy"
|
||||
icon_state = "spark"
|
||||
|
||||
damage = 0
|
||||
damage_type = BURN
|
||||
nodamage = 1
|
||||
flag = "energy"
|
||||
|
||||
|
||||
/obj/item/projectile/energy/electrode
|
||||
name = "electrode"
|
||||
icon_state = "spark"
|
||||
nodamage = 1
|
||||
stun = 10
|
||||
weaken = 10
|
||||
stutter = 10
|
||||
@@ -19,6 +18,7 @@
|
||||
/obj/item/projectile/energy/declone
|
||||
name = "declown"
|
||||
icon_state = "declone"
|
||||
nodamage = 1
|
||||
damage_type = CLONE
|
||||
irradiate = 40
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
return 0
|
||||
if(!prob(prb))
|
||||
return 0
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
if (electrocute_mob(user, get_area(src), src, 0.7))
|
||||
|
||||
Reference in New Issue
Block a user