diff --git a/code/WorkInProgress/Cael_Aislinn/energy_field.dm b/code/WorkInProgress/Cael_Aislinn/energy_field.dm index 96a849f947..4488fc3af0 100644 --- a/code/WorkInProgress/Cael_Aislinn/energy_field.dm +++ b/code/WorkInProgress/Cael_Aislinn/energy_field.dm @@ -15,8 +15,11 @@ var/stress = 0 /obj/effect/energy_field/ex_act(var/severity) - Stress(2) - //nothing + Stress(0.5 + severity) + +/obj/effect/energy_field/bullet_act(var/obj/item/projectile/Proj) + Stress(1 + 1 * (Proj.damage / 100)) + /obj/effect/energy_field/meteorhit(obj/effect/meteor/M as obj) if(M) @@ -31,6 +34,14 @@ invisibility = 2 density = 0 +/obj/effect/energy_field/proc/Strengthen(var/severity) + strength += severity + + //if we take too much damage, drop out - the generator will bring us back up if we have enough power + if(strength > 1) + invisibility = 0 + density = 1 + /obj/effect/energy_field/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0) //Purpose: Determines if the object (or airflow) can pass this atom. //Called by: Movement, airflow. @@ -38,4 +49,4 @@ //Outputs: Boolean if can pass. //return (!density || !height || air_group) - return 0 + return density diff --git a/code/modules/research/xenoarchaeology/artifact_effect.dm b/code/modules/research/xenoarchaeology/artifact_effect.dm index 16a91a4dd3..3b76ef742e 100644 --- a/code/modules/research/xenoarchaeology/artifact_effect.dm +++ b/code/modules/research/xenoarchaeology/artifact_effect.dm @@ -7,6 +7,7 @@ var/effectmode = "aura" // How does it carry out the effect? var/aurarange = 4 // How far the artifact will extend an aura effect. var/list/created_field + var/archived_loc /datum/artifact_effect/New() // @@ -34,11 +35,19 @@ del F /datum/artifact_effect/proc/UpdateEffect(var/atom/originator) - for(var/obj/effect/energy_field/F in created_field) + /*for(var/obj/effect/energy_field/F in created_field) created_field.Remove(F) - del F + del F*/ + if(originator.loc != archived_loc) + archived_loc = originator.loc + update_move(originator) + + for(var/obj/effect/energy_field/E in created_field) + if(E.strength < 5) + E.Strengthen(0.2) /datum/artifact_effect/proc/DoEffect(var/atom/originator) + archived_loc = originator.loc if (src.effectmode == "contact") var/mob/user = originator if(!user) @@ -121,7 +130,13 @@ return 1 else user << "Nothing happens." if("forcefield") - var/obj/effect/energy_field/E = new /obj/effect/energy_field(locate(user.x + 2,user.y,user.z)) + while(created_field.len < 16) + var/obj/effect/energy_field/E = new (locate(user.x,user.y,user.z)) + created_field.Add(E) + E.strength = 1 + E.density = 1 + E.invisibility = 0 + /*var/obj/effect/energy_field/E = new /obj/effect/energy_field(locate(user.x + 2,user.y,user.z)) E.strength = 1 E.invisibility = 0 E = new /obj/effect/energy_field(locate(user.x + 2,user.y + 1,user.z)) @@ -183,7 +198,7 @@ E = new /obj/effect/energy_field(locate(user.x - 1,user.y - 2,user.z)) created_field.Add(E) E.strength = 1 - E.invisibility = 0 + E.invisibility = 0*/ return 1 if("teleport") var/list/randomturfs = new/list() @@ -473,3 +488,52 @@ sparks.set_up(3, 0, get_turf(originator)) //no idea what the 0 is sparks.start() return 1 + +//initially for the force field artifact +/datum/artifact_effect/proc/update_move(var/atom/originator) + switch(effecttype) + if("forcefield") + while(created_field.len < 16) + //for now, just instantly respawn the fields when they get destroyed + var/obj/effect/energy_field/E = new (locate(originator.x,originator.y,originator)) + created_field.Add(E) + E.strength = 1 + E.density = 1 + E.invisibility = 0 + + var/obj/effect/energy_field/E = created_field[1] + E.loc = locate(originator.x + 2,originator.y + 2,originator.z) + E = created_field[2] + E.loc = locate(originator.x + 2,originator.y + 1,originator.z) + E = created_field[3] + E.loc = locate(originator.x + 2,originator.y,originator.z) + E = created_field[4] + E.loc = locate(originator.x + 2,originator.y - 1,originator.z) + E = created_field[5] + E.loc = locate(originator.x + 2,originator.y - 2,originator.z) + E = created_field[6] + E.loc = locate(originator.x + 1,originator.y + 2,originator.z) + E = created_field[7] + E.loc = locate(originator.x + 1,originator.y - 2,originator.z) + E = created_field[8] + E.loc = locate(originator.x,originator.y + 2,originator.z) + E = created_field[9] + E.loc = locate(originator.x,originator.y - 2,originator.z) + E = created_field[10] + E.loc = locate(originator.x - 1,originator.y + 2,originator.z) + E = created_field[11] + E.loc = locate(originator.x - 1,originator.y - 2,originator.z) + E = created_field[12] + E.loc = locate(originator.x - 2,originator.y + 2,originator.z) + E = created_field[13] + E.loc = locate(originator.x - 2,originator.y + 1,originator.z) + E = created_field[14] + E.loc = locate(originator.x - 2,originator.y,originator.z) + E = created_field[15] + E.loc = locate(originator.x - 2,originator.y - 1,originator.z) + E = created_field[16] + E.loc = locate(originator.x - 2,originator.y - 2,originator.z) + + /*for(var/obj/effect/energy_field/F in created_field) + created_field.Remove(F) + del F*/ diff --git a/code/modules/research/xenoarchaeology/artifacts.dm b/code/modules/research/xenoarchaeology/artifacts.dm index 3eb716f900..2c94c630c5 100644 --- a/code/modules/research/xenoarchaeology/artifacts.dm +++ b/code/modules/research/xenoarchaeology/artifacts.dm @@ -35,7 +35,7 @@ icon_state = "ano[icon_num]0" // Low-ish random chance to not look like it's origin - if(prob(20)) src.icon_state = pick("ano0","ano1","ano2","ano3","ano4","ano5") + if(prob(20)) src.icon_state = pick("ano00","ano10","ano20","ano30","ano40","ano50") // Power randomisation my_effect.trigger = pick("force","energy","chemical","heat","touch") @@ -87,6 +87,10 @@ display_id += "-" display_id += num2text(rand(100,999)) +/obj/machinery/artifact/Del() + ..() + my_effect.HaltEffect() + /obj/machinery/artifact/attack_hand(var/mob/user as mob) if (istype(user, /mob/living/silicon/ai) || istype(user, /mob/dead/)) return if (istype(user, /mob/living/silicon/robot)) @@ -176,14 +180,14 @@ chargetime -= 1 else src.charged = 1 - my_effect.HaltEffect(src.loc) my_effect.UpdateEffect(src.loc) //activate - if(src.charged && my_effect.DoEffect(src)) - src.charged = 0 - src.chargetime = src.recharge + if( (my_effect.effectmode == "pulse" || my_effect.effecttype == "worldpulse") && activated) + if(src.charged && my_effect.DoEffect(src)) + src.charged = 0 + src.chargetime = src.recharge /obj/machinery/artifact/proc/Artifact_Activate() src.activated = !src.activated @@ -226,6 +230,11 @@ // this was used in QM for a time but it fell into disuse and wasn't removed, the purpose being to check if an artifact // was benevolent or malicious, to determine whether QMs would be paid or punished for shipping it +/obj/machinery/artifact/Move() + ..() + my_effect.update_move(src, src.loc) + + /proc/artifact_checkgood(var/datum/artifact_effect/A) switch(A.effecttype) if("healing") return 1