📄 fw.js
字号:
/*
fw1:作战方的一个实例
sys:存放地图资源信息(矿、气)
race:存放的对战双方的对象数组,red/blue
cRace:当前操作者
udf:存放一些资源、建筑、单位等标准信息数组供调用时使用
block:
mine 矿
ves 气
build:
0_hq 基地
0_supply 房子
0_refinery 采气厂
0_barrack 兵工厂
0_academy 升级用的
0_gun_tower 无图
0_missile 无图
unit:
0_scv 工程兵的普通、采矿、采气3种状态5个方向的图片
0_marine
0_tank
0_valture
0_wraith
*/
var fw1=new fw(),sys=new Array(),udf=new Array(),race=new Array(),cRace="red"
fw_ini()
function fw_ini(){
sys.minePos=""
sys.vesPos=""
race["red"]=createClass("mine:5000;ves:0;man:4;supply:8;hq:")
race["blue"]=createClass("mine:50;ves:0;man:4;supply:8;hq:")
udf["mine"]=createClass("type:block;size:1,1;movepos:-1,-16;selpos:-4,16,48,30")
udf["ves"]=createClass("type:block;size:3,2;movepos:2,3;selpos:-6,0,124,60")
udf["0_hq"]=createClass("type:build;wh:127,101;size:3,3;movepos:0,-14;selpos:-8,22,140,80;hppos:5,86,130;btime:3;madelist:0_scv")
udf["0_supply"]=createClass("type:build;wh:87,70;size:2,2;movepos:-2,-9;selpos:-5,18,95,56;hppos:2,62,94;btime:2;mine:100")
udf["0_refinery"]=createClass("type:build;wh:125,95;size:3,2;movepos:-2,-32;selpos:-8,22,140,80;hppos:5,86,130;btime:2;mine:100")
udf["0_barrack"]=createClass("type:build;wh:125,110;size:3,3;movepos:-2,-18;selpos:-8,34,140,80;hppos:5,86,130;btime:3;mine:150;madelist:0_marine")
udf["0_academy"]=createClass("type:build;wh:95,95;size:2,2;movepos:-10,-32;selpos:-2,38,100,60;hppos:2,66,100;btime:3;mine:150")
udf["0_gun_tower"]=createClass("type:build;wh:95,58;size:2,2;movepos:-8,2;selpos:-8,22,140,80")
udf["0_missile"]=createClass("type:build;wh:41,50;size:1,1;movepos:0,-20;selpos:-8,22,140,80")
udf["0_scv"]=createClass("type:unit;kind:ground;mvstyle:shift;speed:4;wh:48;selpos:5,12,36,24;hppos:1,33,35;mine:50")
udf["0_marine"]=createClass("type:unit;kind:ground;mvstyle:walk;speed:2;wh:32;selpos:5,15,20,16;hppos:1,20,24;mine:50")
udf["0_tank"]=createClass("type:unit;kind:ground;speed:1;wh:72;selpos:10,16,50,40")
udf["0_valture"]=createClass("type:unit;kind:ground;speed:1;wh:64;selpos:12,20,36,27")
udf["0_wraith"]=createClass("type:unit;kind:air;speed:1;wh:48;selpos:12,16,27,20")
}
/*
返回一个数组
参数字符: a:1;b:2
返回数组:
[a][1]
[b][2]
如是数字,则转换为数字型
*/
function createClass(k){
var ao=new Array(),ak=k.split(";")
for(var i in ak){
ak[i]=ak[i].split(":")
if(!isNaN(ak[i][1]))
ak[i][1]=parseInt(ak[i][1])
ao[ak[i][0]]=ak[i][1]
}
return ao
}
//控制对象显示或隐藏 ol格式使用;分隔,;之前的显示,;之后的隐藏,然后使用,进行分隔
function showObj(ol){
var a=ol.split(";"),i,j
for(i in a){
a[i]=a[i].split(",")
for(j in a[i]){
if(i==0&&a[i][j]!="")
eval(a[i][j]).style.display=""
if(i==1&&a[i][j]!="")
eval(a[i][j]).style.display="none"
}
}
}
//用来创建操作方实体的类
function fw(){
//uList定义:[0]-block;[1]-mine;[2]-build;[3]-unit
this.uList=new Array("","","","")
//bList定义:[0]-mine;[1]-block and build;[2]-hold unit
this.bList=new Array("","","")
this.cEndPos=0
//用来对新加入的成员进行唯一标识的变量,每增加一个,maxID便加一
this.maxID=0
//被选中的对象,使用逗号进行分隔
this.selUnit=""
this.adp="1,0;1,1;0,1;-1,1;-1,0;-1,-1;0,-1;1,-1;1,0;1,1;0,1;-1,1;-1,0;-1,-1;0,-1;1,-1".split(";")
for(var i=0;i<16;i++){
this.adp[i]=this.adp[i].split(",")
this.adp[i][0]=parseInt(this.adp[i][0])
this.adp[i][1]=parseInt(this.adp[i][1])
}
//地图初始化,k的格式 size,64,64;1,mine,3,1 ....
this.iniMap=function(k){
var l="",lm="",xi,yi,i,j,n
var a=k.split(";"),uu,a_sz,a_mv,a_sl,a_hp,a_wh
//遍历每个元素
for(i in a){
a[i]=a[i].split(",")
if(a[i][0]=="size"){
//地图背景的尺寸
divSize.style.width =a[i][1]*40
divSize.style.height =a[i][2]*30
}
else{
xi=parseInt(a[i][2])
yi=parseInt(a[i][3])
uu=udf[a[i][1]]
a_sl=uu.selpos.split(",")
if(uu.type=="block"||uu.type=="build"){ //资源、建筑
a_sz=uu.size.split(",")
a_mv=uu.movepos.split(",")
//将资源和建筑的覆盖点存到字符列表中
for(j=0;j<a_sz[0];j++){
for(n=0;n<a_sz[1];n++){
if(uu.type=="block")
this.bList[0]+=";"+(xi+j)+","+(yi+n)
if(uu.type=="build")
this.bList[1]+=";"+(xi+j)+","+(yi+n)
//this.paint(new pt(xi+j,yi+n),"black")
}
}
}
if(a[i][1]=="mine")
sys.minePos+=";"+xi+","+yi //把矿资源记录到地图中
if(a[i][1]=="ves")
sys.vesPos+=";"+xi+","+yi //把气资源记录到地图中
//下面分别是3种物件的创建
//l存放大地图的内容,lm存放缩略图的内容
if(uu.type=="block"){
this.uList[1]+=",unit_"+a[i][0]
l+="<span id=unit_"+a[i][0]+" name="+a[i][1]+" uType=block px="+xi+" py="+yi+" pw="+a_sz[0]+" ph="+a_sz[1]+" style='left:"+(xi*40+parseInt(a_mv[0]))+";top:"+(yi*30+parseInt(a_mv[1]))+";z-index:"+yi+"'>"
l+="<v:oval coordsize='21600,21600' strokecolor=#F2F230 style='visibility:hidden;position:absolute;left:"+a_sl[0]+";top:"+a_sl[1]+";width:"+a_sl[2]+";height:"+a_sl[3]+"'><v:fill opacity =0></v:fill></v:oval>"
l+="<img src=block/"+a[i][1]+".gif>"
l+="</span>"
lm+="<hr id=unit_"+a[i][0]+"_mini color=#00E4FC style=left:"+(xi*2)+";top:"+(yi*2)+";width:"+(a_sz[0]*2)+";height:"+(a_sz[1]*2)+">"
}
if(uu.type=="build"){
a_hp=uu.hppos.split(",")
a_wh=uu.wh.split(",")
var s_m=""
//如果是采气场且已经建成则加入冒气场景
if(a[i][5]!=0&&a[i][1]=="0_refinery")
s_m="<img src='block/ves_gas.gif' style=left:55;top:-20>"
this.uList[2]+=",unit_"+a[i][0]
l+="<span id=unit_"+a[i][0]+" name="+a[i][1]+" uType=build bType='' chp="+(a[i][5]==0 ? 0 : "100")+" bn="+(a[i][5]==0 ? 0 : -1)+" mn=-1 sx="+a_sz[0]+" sy="+a_sz[1]+" px="+xi+" py="+yi+" pw="+a_sz[0]+" ph="+a_sz[1]+" aimu='' race='"+a[i][4]+"' style='left:"+(xi*40+parseInt(a_mv[0]))+";top:"+(yi*30+parseInt(a_mv[1]))+";z-index:"+yi+"'>"
l+="<v:oval coordsize='21600,21600' strokecolor=#10FC18 style='visibility:hidden;position:absolute;left:"+a_sl[0]+";top:"+a_sl[1]+";width:"+a_sl[2]+";height:"+a_sl[3]+"'><v:fill opacity =0></v:fill><span class=hpbar style='left:"+a_hp[0]+";top:"+a_hp[1]+";width:"+a_hp[2]+"'><hr size=3 color=#249824 style=width:"+(a[i][5]==0 ? 0 : "100%")+"></span></v:oval>"
l+="<span style=width:"+a_wh[0]+";height:"+a_wh[1]+";overflow:hidden><img src=build/"+a[i][1]+"_"+a[i][4]+".gif style=left:"+(a[i][5]==0 ? -2*a_wh[0] : 0)+"></span>"
l+="<span>"+s_m+"</span>"
l+="</span>"
lm+="<hr id=unit_"+a[i][0]+"_mini color='"+a[i][4]+"' style=left:"+(xi*2)+";top:"+(yi*2)+";width:"+(a_sz[0]*2)+";height:"+(a_sz[1]*2)+">"
//标记大本营位置,工程兵采矿、气时会用到
if(a[i][1]=="0_hq"){
race[a[i][4]].hq=(xi+1)+","+(yi+1)
}
}
if(uu.type=="unit"){
a_hp=uu.hppos.split(",")
this.uList[3]+=",unit_"+a[i][0]
l+="<span id=unit_"+a[i][0]+" name="+a[i][1]+" uType=unit mvstyle='"+uu.mvstyle+"' px="+xi+" py="+yi+" cw="+uu.wh+" race='"+a[i][4]+"' class='unit_"+uu.kind+"' speed='"+uu.speed+"' path='' aimPos='' aimn=0 aimu='' face='' pose=0 tmMove=0 tmDir=0 style='left:"+(xi*40+(40-uu.wh)/2)+";top:"+(yi*30+(30-uu.wh)/2)+";z-index:"+yi+"'>"
l+="<v:oval coordsize='21600,21600' strokecolor=#10FC18 style='visibility:hidden;position:absolute;left:"+a_sl[0]+";top:"+a_sl[1]+";width:"+a_sl[2]+";height:"+a_sl[3]+"'><v:fill opacity =0></v:fill><span class=hpbar style='left:"+a_hp[0]+";top:"+a_hp[1]+";width:"+a_hp[2]+"'><hr size=3 color=#249824 style=width:100%></span></v:oval>"
l+="<span style=width:"+uu.wh+";height:"+uu.wh+";overflow:hidden><img src=unit/"+a[i][1]+"_"+a[i][4]+".gif style=top:"+(-parseInt(5*Math.random())*uu.wh)+"></span>"
l+="<span></span></span>"
lm+="<hr id=unit_"+a[i][0]+"_mini color='"+a[i][4]+"' style=left:"+(xi*2)+";top:"+(yi*2)+";width:2;height:2>"
}
}
}
this.maxID=parseInt(a[i][0])+1
//对存贮的各类信息的格式进行整理
if(sys.minePos.slice(0,1)==";")
sys.minePos=sys.minePos.slice(1)
if(sys.vesPos.slice(0,1)==";")
sys.vesPos=sys.vesPos.slice(1)
if(this.bList[0].slice(0,1)==";")
this.bList[0]=this.bList[0].slice(1)
if(this.bList[1].slice(0,1)==";")
this.bList[1]=this.bList[1].slice(1)
if(this.uList[0].slice(0,1)==",")
this.uList[0]=this.uList[0].slice(1)
if(this.uList[1].slice(0,1)==",")
this.uList[1]=this.uList[1].slice(1)
if(this.uList[2].slice(0,1)==",")
this.uList[2]=this.uList[2].slice(1)
if(this.uList[3].slice(0,1)==",")
this.uList[3]=this.uList[3].slice(1)
//加入实体
divMain.insertAdjacentHTML("beforeend",l)
//小地图
mini_map.insertAdjacentHTML("afterbegin",lm)
}
//返回指定点的build,unit
this.uInPos=function(p){
var u,o,a=(this.uList[1]+","+this.uList[2]).split(",")
for(var i in a){
o=eval(a[i])
if(p.x-o.px<o.pw&&p.x-o.px>=0&&p.y-o.py<o.ph&&p.y-o.py>=0){
u=o
if(u.name!="ves")
break
}
}
return u
}
//选中操作对象
this.selRange=function(sp,ep){
var l="",u,a,i
//先取消选择
if(fw1.selUnit!=""){
a=fw1.selUnit.split(",")
for(i in a){
u=eval(a[i])
u.children(0).style.visibility="hidden"
}
}
//选择框进行选择(不能对建筑物进行选择)
a=this.uList[3].split(",")
for(i=0;i<a.length;i++){
u=eval(a[i])
if(((u.px>=sp.x&&ep.x>=u.px)||(u.px<=sp.x&&ep.x<=u.px))&&((u.py>=sp.y&&ep.y>=u.py)||(u.py<=sp.y&&ep.y<=u.py))){
u.children(0).style.visibility=""
l+=u.id+","
}
}
l=l.slice(0,-1)
//点击选中,都可以进行选择
if(sp.v==ep.v&&l==""){
u=this.uInPos(sp)
if(u!=null){
u.children(0).style.visibility=""
l=u.id
}
}
fw1.selUnit=l
}
this.setUBlock=function(){
var u
this.bList[2]=""
al=this.uList[3].split(",")
for(i in al){
u=eval(al[i])
if(u.path==""&&(","+this.selUnit+",").indexOf(","+u.id+",")==-1)
this.bList[2]+=u.px+","+u.py+";"
}
this.bList[2]=";"+this.bList[2]
}
//鼠标指挥unit的移动(不实际移动,而是改变目的地或指定任务)
this.go=function(ep0){
if(this.selUnit=="")
return
var sp=new pt(),ep=new pt()
var al,a,i,s,rv,epu,epuName,u
this.setUBlock()
this.cEndPos=0
al=fw1.selUnit.split(",")
//遍历所有选中的对象
for(i in al){
u=eval(al[i])
epu=this.uInPos(ep0)
epuName=epu==null ? "" : epu.name
sp.setv(u.px,u.py)
this.bList[2]=fw1.bList[2].replace(";"+sp.v+";",";")
s=""
if(u.className=="airUnit")
s="airUnit"
//采矿
if(u.name=="0_scv"&&epuName=="mine")
s="mining"
//根据情况确定最后的目标地
rv=this.getEndPos(ep0,s)
if(rv[0]=="")
return
if(rv[1]!="")
u.aimu=rv[1]
ep.setv(rv[0])
if(u.className=="airUnit")
u.path=ep.v
else{
//点集重合,无法到达
if(this.inBlock(ep))
return
l=this.getPath(sp,ep)
u.path=l
if(u.name=="0_scv"){
u.children(2).innerHTML=""
u.aimPos=""
u.task=""
//随机确定工程兵的基地投放地点
a="2,0;2,1;1,2;0,2;-1,2;-2,1;-2,0;-2,-1;-1,-2;0,-2;1,-2;2,-1".split(";")
var n=parseInt(12*Math.random())
a[n]=a[n].split(",")
sp.setv(race[u.race].hq)
sp.setv(sp.x+parseInt(a[n][0]),sp.y+parseInt(a[n][1]))
//采矿 aimPos逗号后面的数字是每次采的上限
if(epuName=="mine"){
u.aimPos=u.aimu+",200;"+sp.v+";"+ep.v
u.task="mining"
}
//采气
if(epuName=="0_refinery"){
if(epu.bn==-1){
u.aimPos=epu.id+",100;"+sp.v+";"+ep.v
u.task="gasing"
}
}
}
}
}
}
//建造时的火花闪烁
this.setSpark=function(u){
var s="left:-10;top:0"
if(u.face==0)
s="left:5;top:-10"
if(u.face=="1f")
s="left:-5;top:-10"
if(u.face==1)
s="left:18;top:-10"
if(u.face==2)
s="left:18;top:0"
if(u.face==3)
s="left:18;top:15"
if(u.face=="3f")
s="left:-5;top:15"
if(u.face==4)
s="left:0;top:15"
u.children(2).innerHTML="<img src=unit/0_scv_spark.gif style="+s+">"
}
//某方的unit的行为函数(行走、建造等)
this.move=function(u){
var dp=new pt(),sp=new pt(),ep=new pt()
if(u.path==""){
sp.setv(u.px,u.py)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -