massfront-playtest / src /engine /factionenergy.js
CREATORJD's picture
Publish MASSFRONT web 1.33.51
84bc42a verified
Raw History Blame Contribute Delete
7.1 kB
/* ============================================================================
FACTION ENERGY PALETTES
----------------------------------------------------------------------------
Every faction in MASSFRONT now has a distinct visual energy signature.
This is not a tint applied on top of the same effect; it is a profile that
drives emission colour, shockwave shape, particle drag, plasma turbulence
and forcefield hex frequency.
INTEGRATION CONTRACT
mfEnergyProfile(factionKey) -> profile object
mfEnergyColor(factionKey, kind) -> [r,g,b]
mfEnergyBeamStyle(factionKey) -> {width, core, glow, noise}
mfEnergyImpactStyle(factionKey, size)-> opts for vfxExplosion
mfFactionFromTeam(team) -> faction key for live units
============================================================================ */
(function(){
'use strict';
const MF_ENERGY_PROFILES={
nova:{
name:'Nova Coalition',
theme:'precision plasma',
primary:[90,220,255],
secondary:[255,255,255],
tertiary:[40,110,255],
impact:{
flashCore:[220,245,255],
flashSize:1.0,
shockwaveColor:[90,210,255],
shockwaveSpeed:1.25,
sparkColor:[160,235,255],
sparkCount:1.0,
smokeColor:[120,130,145],
smokeCount:0.75,
debris:false,
ringSharp:true,
energyTexture:'energy',
hexFreq:10
},
beam:{width:1.0,core:[255,255,255],glow:[90,220,255],noise:0.35,pulse:1.6},
artillery:{kind:'energy',core:[255,255,255],glow:[105,225,255],fringe:[70,115,255],tail:1.0},
forcefield:{color:[90,220,255],hex:1.0,rim:1.15,opacity:0.55}
},
legion:{
name:'Iron Legion',
theme:'thermite / kinetic',
primary:[255,95,30],
secondary:[255,220,80],
tertiary:[180,30,15],
impact:{
flashCore:[255,240,200],
flashSize:1.15,
shockwaveColor:[255,120,40],
shockwaveSpeed:0.95,
sparkColor:[255,200,60],
sparkCount:0.85,
smokeColor:[95,80,72],
smokeCount:1.15,
debris:true,
ringSharp:false,
energyTexture:'blast',
hexFreq:0
},
beam:{width:1.35,core:[255,245,220],glow:[255,95,30],noise:0.55,pulse:0.9},
artillery:{kind:'shell',core:[255,224,150],glow:[255,112,34],smoke:[88,78,70],tail:0.28},
forcefield:{color:[255,95,30],hex:0.0,rim:0.95,opacity:0.48}
},
syndicate:{
name:'Syndicate',
theme:'nanite / corrosive',
primary:[80,255,100],
secondary:[220,255,60],
tertiary:[20,180,90],
impact:{
flashCore:[200,255,180],
flashSize:0.85,
shockwaveColor:[90,255,120],
shockwaveSpeed:1.05,
sparkColor:[160,255,120],
sparkCount:1.2,
smokeColor:[70,100,65],
smokeCount:0.9,
debris:false,
ringSharp:true,
energyTexture:'energy',
hexFreq:8
},
beam:{width:0.85,core:[220,255,200],glow:[80,255,100],noise:0.85,pulse:2.2},
artillery:{kind:'energy',core:[245,255,238],glow:[92,255,120],fringe:[116,82,255],tail:1.12},
forcefield:{color:[80,255,100],hex:0.75,rim:1.05,opacity:0.52}
},
brood:{
name:'Brood',
theme:'bile / violet bio-plasma',
primary:[190,70,255],
secondary:[120,255,80],
tertiary:[80,20,140],
impact:{
flashCore:[230,160,255],
flashSize:0.9,
shockwaveColor:[180,60,255],
shockwaveSpeed:0.85,
sparkColor:[200,100,255],
sparkCount:0.9,
smokeColor:[80,55,95],
smokeCount:1.0,
debris:false,
ringSharp:false,
energyTexture:'energy',
hexFreq:6
},
beam:{width:1.1,core:[240,200,255],glow:[190,70,255],noise:0.75,pulse:1.4},
artillery:{kind:'organic',core:[238,196,255],glow:[188,72,255],fringe:[112,255,88],tail:.58},
forcefield:{color:[190,70,255],hex:0.6,rim:1.0,opacity:0.50}
},
horde:{
name:'Infestation',
theme:'ichor / acid',
primary:[130,255,60],
secondary:[255,255,120],
tertiary:[60,140,30],
impact:{
flashCore:[210,255,140],
flashSize:0.75,
shockwaveColor:[130,255,60],
shockwaveSpeed:0.8,
sparkColor:[180,255,90],
sparkCount:0.7,
smokeColor:[75,95,55],
smokeCount:1.25,
debris:false,
ringSharp:false,
energyTexture:'smoke',
hexFreq:0
},
beam:{width:1.2,core:[230,255,180],glow:[130,255,60],noise:0.65,pulse:1.1},
artillery:{kind:'organic',core:[234,255,188],glow:[128,255,64],fringe:[184,72,255],tail:.52},
forcefield:{color:[130,255,60],hex:0.0,rim:0.9,opacity:0.45}
}
};
function mfEnergyProfile(key){
return MF_ENERGY_PROFILES[key]||MF_ENERGY_PROFILES.nova;
}
function mfEnergyColor(key, kind){
const p=mfEnergyProfile(key);
if(kind==='core'||kind==='flash') return p.impact.flashCore;
if(kind==='spark') return p.impact.sparkColor;
if(kind==='shockwave') return p.impact.shockwaveColor;
if(kind==='smoke') return p.impact.smokeColor;
if(kind==='beam') return p.beam.glow;
if(kind==='shield') return p.forcefield.color;
return p.primary;
}
function mfEnergyBeamStyle(key){
return mfEnergyProfile(key).beam;
}
function mfEnergyArtilleryStyle(key){
return mfEnergyProfile(key).artillery||MF_ENERGY_PROFILES.legion.artillery;
}
function mfEnergyImpactStyle(key, size){
const p=mfEnergyProfile(key);
const s=Math.max(6, size||18);
return {
faction:key,
flash:p.impact.flashCore,
flashScale:p.impact.flashSize,
shockwave:p.impact.shockwaveColor,
shockwaveSpeed:p.impact.shockwaveSpeed,
sparks:p.impact.sparkColor,
sparkCountMul:p.impact.sparkCount,
smoke:p.impact.smokeColor,
smokeCountMul:p.impact.smokeCount,
debris:p.impact.debris,
ringSharp:p.impact.ringSharp,
size:s,
hexFreq:p.impact.hexFreq,
texture:p.impact.energyTexture
};
}
/* Map a live team/faction to a key. Falls back through known globals. */
function mfFactionFromTeam(team){
if(typeof playerFaction!=='undefined'){
if(team===0) return playerFaction;
}
if(typeof AI!=='undefined'&&AI&&AI.fac){
if(team===1) return AI.fac;
}
if(typeof factions!=='undefined'&&Array.isArray(factions)){
const f=factions[team|0];
if(f&&f.id) return f.id;
}
if(team===2) return 'brood';
if(team===3) return 'horde';
return 'nova';
}
/* Utility: derive a unit/building faction key from its type/name. */
function mfFactionFromType(name, explicit){
if(explicit) return explicit;
const s=String(name||'').toLowerCase();
if(/legion|iron|siege|thermite|cast/.test(s)) return 'legion';
if(/syndicate|nano|corrupt|acid/.test(s)) return 'syndicate';
if(/brood|bile|spore|ichor|toxic/.test(s)) return 'brood';
if(/horde|infest|swarm|maggot/.test(s)) return 'horde';
return 'nova';
}
window.mfEnergyProfile=mfEnergyProfile;
window.mfEnergyColor=mfEnergyColor;
window.mfEnergyBeamStyle=mfEnergyBeamStyle;
window.mfEnergyArtilleryStyle=mfEnergyArtilleryStyle;
window.mfEnergyImpactStyle=mfEnergyImpactStyle;
window.mfFactionFromTeam=mfFactionFromTeam;
window.mfFactionFromType=mfFactionFromType;
window.MF_ENERGY_PROFILES=MF_ENERGY_PROFILES;
})();