const data = { "WADR": { "name": "WADR", "nameLong": "Kampfdrohne", "hull": 120, "armor": 0, "shield": 0, "speed": 200, "agility": 200, "weaponList": {"GTGN": 1} }, "LFGT": { "name": "LFGT", "nameLong": "Leichter Jäger", "hull": 1200, "armor": 0, "shield": 0, "speed": 250, "agility": 250, "weaponList": {"LACA": 2} }, "HFGT": { "name": "HFGT", "nameLong": "Schwerer Jäger", "hull": 2400, "armor": 0, "shield": 0, "speed": 120, "agility": 110, "weaponList": {"HLCA": 2} }, "SFGT": { "name": "SFGT", "nameLong": "Tarnkappenjäger", "hull": 1400, "armor": 0, "shield": 0, "speed": 124, "agility": 75, "stealth": 100, "weaponList": {"XLAC": 1} }, "CORV": { "name": "CORV", "nameLong": "Korvette", "hull": 7000, "armor": 7, "shield": 14, "speed": 230, "agility": 85, "weaponList": {"MSLN": 30, "LACA": 2} }, "MSFR": { "name": "MSFR", "nameLong": "Raketenfregatte", "hull": 16000, "armor": 20, "shield": 55, "speed": 130, "agility": 50, "weaponList": {"MSLN": 40, "HLCA": 5} }, "DSTR": { "name": "DSTR", "nameLong": "Zerstörer", "hull": 32000, "armor": 80, "shield": 2, "speed": 100, "agility": 50, "weaponList": {"MSLN": 20, "PLCA": 5} }, "ACRS": { "name": "ACRS", "nameLong": "Panzerkreuzer", "hull": 120000, "armor": 800, "shield": 400, "speed": 70, "agility": 23, "weaponList": {"MSLN": 20, "HLCA": 5, "IOCA": 5} }, "DNGT": { "name": "DNGT", "nameLong": "Schlachtschiff", "hull": 240000, "armor": 100, "shield": 100, "speed": 70, "agility": 15, "weaponList": {"HLCA": 10, "IOCA": 10, "PLCA": 10, "PRCA": 1} }, "GTGN": { "name": "GTGN", "shots": 1000, "range": 20, "attackGround": 0, "attackShip": 3, "effectArmor": 1, "effectShield": 0, "accuracy": 20, "prio": "AIDC,RSDR,RHDR,RKDR,LLSA,RIDR,HLSA,LLTU,PFGT,MSRM,SWMD,MSTU,HFGT,SFGT,ALCR,IBTR,RCYC,PRDR,PRCY,EXDR,SEDR,LFGT,RAFL,GTRN,LBTR,ARCY,LPRD,CCOL,RFLS,RTRN,MIVE,RRFV,STRN,SPST,RFVE,LEVE,PMIV,ASUD,PTRN,SBTR,LRCO,IXCW,EXCW,HFLS,GRCO,SWCO,ARCO,FCOL,SMSW,ATRN,ACRM,SWAD,WADR,AFLS,PLDC,STRT,SCOL,HTRN,FROR,HGBC,STNK,ASCS,CNSV,PTNK,SSCD,ATNK,ALTM,HTNK,ASED,ASCD,SUDR,SCDR,FLDP,PCOR,DISA,SHDU,SSDR,SPND,SPDR,GCTS,PLFG,GDFM,GBOM,GDBH,PBOM,PTSA,PTRM,SWPD,PTTU,RBCR,SWBS,GFGT,GDST,AMSA,SWTD,APTU,PLRM,PLSA,PLTU,FHML,GLRD,SWBD,RSPD,HLRM,HLTU,HMDU,DTST,BTST,SWSD,ABAT,SITU,SISA,FBCR,IORM,ASPD,DNGT,LAMN,MAMN,SAMN,IOSA,IOTU,DSTR,FLTU,FPTT,ABOM,RTTN,MSFR,APSA,RDFR,SWFG,AFGT,LFMN,MFMN,SFMN,SMDU,MSSA,ICOL,LMDU,FIOT,CORV,RLBO,LCMN,MCMN,SCMN,MMDU,SBOM,LNMN,ARDF,ARMS,HBOM,SWBO,ACRS,ALBO,LBOM,SWIS,ITRT,ICAR,ATRT,ACAR,GCOL,IFLS,SWFS,FCAR,RSCD,ASPM,PFLS,BFLS,AMIV,HTRT,WFLS,IACS,SCAR,LMSW,LTRT,ITRN,QFLS,LTRN,SFLS,PLFL,ICSV,LACS,LTNK,AACI,ITNK,ACIP" }, "LACA": { "name": "LACA", "shots": 10, "range": 100, "attackGround": 0, "attackShip": 150, "effectArmor": 0.3, "effectShield": 0.01, "accuracy": 75, "prio": "AIDC,ACRM,RSDR,RHDR,RKDR,GCTS,GDFM,PTSA,GBOM,PLSA,RBCR,SWBS,HLSA,GFGT,SISA,IOSA,ABAT,PLRM,DNGT,PLTU,RIDR,FBCR,PFGT,HLRM,DSTR,HLTU,SMDU,MSFR,PLFG,BTST,MSSA,LLSA,PBOM,AFGT,HFGT,SWFG,ABOM,CORV,SBOM,RDFR,FLTU,MSRM,SFGT,SWMD,MSTU,LLTU,IORM,IOTU,RLBO,LCMN,MCMN,SCMN,SITU,HBOM,LFGT,IBTR,ALCR,SWBO,RCYC,PRCY,RAFL,LBOM,PRDR,ARCY,EXDR,SEDR,GTRN,LBTR,LFMN,MFMN,SFMN,LPRD,GCOL,CCOL,RFLS,ATRT,LNMN,RTRN,ACAR,SWFS,MIVE,STRN,RRFV,FCAR,PTRN,PMIV,LEVE,RFVE,ASUD,SBTR,HFLS,PFLS,LRCO,GRCO,EXCW,IXCW,SWCO,ARCO,FCOL,SWAD,WADR,IACS,SCAR,BFLS,WFLS,HTRT,SMSW,ATRN,LMSW,SPST,AFLS,PLDC,STRT,SCOL,QFLS,LTRN,FROR,AMIV,HTRN,STNK,SFLS,HGBC,PTNK,ICSV,CNSV,ASCS,LTRT,LACS,SSCD,ATNK,HTNK,ASED,ASCD,SUDR,SCDR,ALTM,FLDP,LTNK,SSDR,SPDR,PCOR,DISA,SHDU,SPND,RSPD,ASPD,SWSD,GDBH,PTRM,SWPD,PTTU,GDST,AMSA,SWTD,APTU,FHML,GLRD,SWBD,HMDU,DTST,LAMN,MAMN,SAMN,FPTT,RTTN,APSA,ICOL,LMDU,FIOT,MMDU,ARDF,ARMS,ACRS,ALBO,SWIS,ITRT,ICAR,IFLS,RSCD,ASPM,ITRN,PLFL,AACI,ITNK,ACIP" }, "HLCA": { "name": "HLCA", "shots": 9, "range": 150, "attackGround": 0, "attackShip": 600, "effectArmor": 0.2, "effectShield": 0.01, "accuracy": 50, "prio": "AIDC,ACRM,PCOR,GCTS,GDFM,RSDR,PTSA,GDBH,GBOM,RHDR,GDST,RKDR,PLSA,RBCR,SWBS,PLFG,HLSA,GFGT,SISA,BTST,PBOM,ABAT,AMSA,IOSA,DNGT,DTST,SWTD,FBCR,SMDU,DSTR,PFGT,APSA,MSFR,ABOM,PLRM,PLTU,AFGT,MSSA,RIDR,LFMN,MFMN,SFMN,HFGT,LLSA,SWFG,HLRM,CORV,RLBO,SBOM,RDFR,HLTU,ICOL,PTRM,SWPD,PTTU,SFGT,FHML,FLTU,IORM,SITU,HBOM,IOTU,ACRS,SWBO,LCMN,MCMN,SCMN,MSRM,ALBO,SWMD,MSTU,LLTU,IBTR,ALCR,LFGT,RCYC,LBOM,PRCY,RAFL,ARCY,GTRN,LBTR,ACAR,GCOL,SWIS,LMDU,CCOL,RFLS,ATRT,ITRT,FCAR,SWFS,ICAR,FIOT,RTRN,LPRD,PRDR,EXDR,SEDR,MIVE,STRN,RRFV,ASPM,BFLS,IFLS,PTRN,LEVE,RFVE,PMIV,SBTR,HFLS,LRCO,AMIV,PFLS,IACS,GRCO,EXCW,IXCW,WFLS,SCAR,LMSW,SWCO,ARCO,FCOL,LNMN,SMSW,HTRT,ATRN,AFLS,LTRT,PLDC,STRT,LTRN,QFLS,ASUD,SWAD,WADR,SCOL,FROR,ITRN,HTRN,STNK,SFLS,ICSV,RSCD,HGBC,CNSV,ASCS,PTNK,SPST,LACS,ATNK,HTNK,ALTM,LTNK,FLDP,PLFL,SSCD,ITNK,ASED,ASCD,SUDR,SCDR,SSDR,SPDR,DISA,SHDU,SPND,RSPD,ASPD,SWSD,APTU,GLRD,SWBD,HMDU,LAMN,MAMN,SAMN,FPTT,RTTN,MMDU,ARDF,ARMS,AACI,ACIP" }, "XLAC": { "name": "XLAC", "shots": 1, "range": 320, "attackGround": 0, "attackShip": 1500, "effectArmor": 0.3, "effectShield": 0.1, "accuracy": 10, "prio": "AIDC,ACRM,PCOR,GCTS,GDFM,PTSA,GDBH,GDST,PLSA,GBOM,RSDR,RBCR,SWBS,HLSA,SISA,DTST,BTST,ABAT,IOSA,RHDR,DNGT,PLFG,SMDU,GFGT,RKDR,APSA,AMSA,PBOM,SWTD,FBCR,DSTR,MSFR,ABOM,PFGT,MSSA,LLSA,AFGT,LFMN,MFMN,SFMN,RLBO,SBOM,HFGT,CORV,SWFG,RDFR,PLRM,SFGT,PLTU,HLRM,ACRS,HLTU,RIDR,IBTR,ARMS,ALCR,HBOM,ALBO,SWBO,RCYC,GTRN,LBTR,RAFL,PRCY,LCMN,MCMN,SCMN,ACAR,GCOL,MSRM,FLTU,LBOM,SWMD,MSTU,LLTU,LFGT,ARCY,CCOL,FCAR,RFLS,ASPM,MIVE,SWFS,RRFV,RTRN,STRN,ATRT,PRDR,LPRD,RFVE,LEVE,BFLS,PMIV,EXDR,SEDR,IORM,IOTU,IACS,SBTR,LRCO,AMIV,IXCW,EXCW,PTRN,HFLS,LMSW,SCAR,GRCO,WFLS,SMSW,ATRN,PFLS,SWCO,ARCO,FCOL,HTRT,LTRT,LTRN,AFLS,QFLS,PLDC,STRT,SCOL,HTRN,ICSV,HGBC,FROR,ASCS,STNK,LNMN,CNSV,SFLS,LACS,SWAD,WADR,PTNK,RSCD,ASUD,ALTM,ATNK,HTNK,LTNK,FLDP,SPST,PLFL,SSCD,ASED,ASCD,SUDR,SCDR,SSDR,SPDR,DISA,SHDU,SPND,RSPD,ASPD,SWSD,PTRM,SWPD,PTTU,APTU,FHML,GLRD,SWBD,HMDU,SITU,LAMN,MAMN,SAMN,FPTT,RTTN,ICOL,LMDU,FIOT,MMDU,ARDF,SWIS,ITRT,ICAR,IFLS,ITRN,AACI,ITNK,ACIP" }, "MSLN": { "name": "MSLN", "shots": 50, "range": 100, "attackGround": 0, "attackShip": 40, "effectArmor": 1, "effectShield": 0, "accuracy": 200, "prio": "AIDC,ACRM,RSDR,RHDR,RKDR,RIDR,PLSA,HLSA,GFGT,PFGT,LLSA,MSSA,HFGT,SWFG,MSFR,AFGT,FBCR,SFGT,CORV,LCMN,MCMN,SCMN,LFGT,LNMN,IBTR,RCYC,ALCR,PRCY,PRDR,RAFL,EXDR,SEDR,ARCY,GTRN,LBTR,ASUD,LPRD,RFLS,CCOL,SPST,RTRN,ATRT,SWAD,WADR,STRN,MIVE,PTRN,RRFV,PMIV,LEVE,HFLS,RFVE,SBTR,GRCO,LRCO,SWCO,ARCO,FCOL,EXCW,IXCW,PLDC,SMSW,ATRN,AFLS,STRT,SCOL,SSCD,FROR,HTRT,HTRN,STNK,PTNK,ASED,ASCD,SUDR,SCDR,CNSV,HGBC,ASCS,ATNK,HTNK,ALTM,FLDP,SSDR,SPDR,PCOR,SPND,DISA,SHDU,RSPD,ASPD,SWSD,GCTS,PLFG,GDFM,GBOM,GDBH,PBOM,PTSA,PTRM,SWPD,PTTU,RBCR,SWBS,GDST,AMSA,SWTD,APTU,PLRM,PLTU,FHML,GLRD,SWBD,HLRM,HLTU,HMDU,DTST,BTST,ABAT,SITU,SISA,IORM,DNGT,LAMN,MAMN,SAMN,IOSA,IOTU,DSTR,FLTU,FPTT,ABOM,RTTN,APSA,RDFR,MSRM,LFMN,MFMN,SFMN,SMDU,SWMD,MSTU,LLTU,ICOL,LMDU,FIOT,RLBO,MMDU,SBOM,ARDF,ARMS,HBOM,SWBO,ACRS,ALBO,LBOM,SWIS,ITRT,ICAR,ACAR,GCOL,IFLS,SWFS,FCAR,RSCD,ASPM,PFLS,BFLS,AMIV,WFLS,IACS,SCAR,LMSW,LTRT,ITRN,QFLS,LTRN,SFLS,PLFL,ICSV,LACS,LTNK,AACI,ITNK,ACIP" }, "IOCA": { "name": "IOCA", "shots": 50, "range": 200, "attackGround": 0, "attackShip": 150, "effectArmor": 0, "effectShield": 1, "accuracy": 70, "prio": "AIDC,ACRM,DISA,SHDU,RSDR,RHDR,RKDR,PLSA,PTSA,RBCR,SWBS,HLSA,SISA,IOSA,HLRM,PLTU,HLTU,RIDR,PLRM,PFGT,DSTR,FBCR,APTU,SMDU,MSSA,LLSA,FHML,ABAT,SWBD,FLTU,MSFR,SITU,AFGT,HFGT,SWFG,IOTU,IORM,SBOM,MSRM,CORV,ABOM,SWMD,MSTU,LLTU,RDFR,SFGT,DNGT,FIOT,LCMN,MCMN,SCMN,LFGT,IBTR,ALCR,RCYC,PRCY,RAFL,PRDR,ARCY,EXDR,SEDR,GTRN,LBTR,LMDU,LBOM,LPRD,CCOL,RFLS,GCOL,LNMN,ASPM,RTRN,MIVE,STRN,RRFV,PTRN,PMIV,LEVE,RFVE,SBTR,ASUD,HFLS,LRCO,SWFS,FCAR,PFLS,GRCO,EXCW,IXCW,SWCO,ARCO,FCOL,SWAD,WADR,SCAR,SMSW,ATRN,AFLS,HTRT,SPST,PLDC,STRT,SCOL,WFLS,FROR,LTRN,ATRT,HTRN,QFLS,STNK,LMSW,ICSV,HGBC,PTNK,CNSV,SFLS,ASCS,SSCD,LACS,ATNK,HTNK,ASED,ASCD,SUDR,SCDR,ALTM,ACIP,FLDP,AACI,LTNK,SSDR,SPDR,PCOR,SPND,RSPD,ASPD,SWSD,GCTS,PLFG,GDFM,GBOM,GDBH,PBOM,PTRM,SWPD,PTTU,GFGT,GDST,AMSA,SWTD,GLRD,HMDU,DTST,BTST,LAMN,MAMN,SAMN,FPTT,RTTN,APSA,LFMN,MFMN,SFMN,ICOL,RLBO,MMDU,ARDF,ARMS,HBOM,SWBO,ACRS,ALBO,SWIS,ITRT,ICAR,ACAR,IFLS,RSCD,BFLS,AMIV,IACS,LTRT,ITRN,PLFL,ITNK" }, "PLCA": { "name": "PLCA", "shots": 20, "range": 400, "attackGround": 0, "attackShip": 500, "effectArmor": 0.4, "effectShield": 0.2, "accuracy": 40, "prio": "AIDC,ACRM,GCTS,GDFM,RSDR,PTSA,PCOR,RHDR,GBOM,RKDR,PLSA,RBCR,SWBS,PTRM,HLSA,SWPD,PTTU,PLRM,PLTU,GFGT,SISA,GDST,PLFG,ABAT,IOSA,HLRM,FHML,BTST,DNGT,HLTU,APTU,PBOM,FBCR,SMDU,DSTR,PFGT,SITU,MSFR,SWBD,IORM,FLTU,IOTU,ABOM,MSSA,LLSA,AFGT,RIDR,MSRM,HFGT,SWMD,MSTU,SWFG,LLTU,CORV,SBOM,RDFR,RLBO,LMDU,FIOT,SFGT,LFMN,MFMN,SFMN,MMDU,LCMN,MCMN,SCMN,HBOM,SWBO,IBTR,ALCR,RCYC,LFGT,PRCY,LBOM,RAFL,GTRN,ARCY,LBTR,ACRS,GCOL,ACAR,CCOL,RFLS,LPRD,PRDR,EXDR,SEDR,ATRT,ALBO,SWFS,FCAR,RTRN,MIVE,STRN,RRFV,LEVE,RFVE,PMIV,PTRN,SBTR,BFLS,LRCO,HFLS,PFLS,EXCW,IXCW,GRCO,IACS,SCAR,AMIV,SWCO,ARCO,FCOL,WFLS,LNMN,LMSW,SMSW,ATRN,HTRT,ASPM,AFLS,PLDC,STRT,ASUD,LTRN,SWAD,WADR,QFLS,LTRT,SCOL,FROR,HTRN,STNK,ICSV,HGBC,SFLS,CNSV,ASCS,PTNK,SPST,LACS,ATNK,HTNK,ALTM,LTNK,FLDP,SSCD,ASED,ASCD,SUDR,SCDR,PLFL,SSDR,SPDR,DISA,SHDU,SPND,RSPD,ASPD,SWSD,GDBH,AMSA,SWTD,GLRD,HMDU,DTST,LAMN,MAMN,SAMN,FPTT,RTTN,APSA,ICOL,ARDF,ARMS,SWIS,ITRT,ICAR,IFLS,RSCD,ITRN,AACI,ITNK,ACIP" }, "PRCA": { "name": "PRCA", "shots": 2, "range": 500, "attackGround": 0, "attackShip": 40000, "effectArmor": 0, "effectShield": 1, "accuracy": 30, "prio": "AIDC,ACRM,DISA,SHDU,PCOR,GDBH,GDST,GDFM,RBCR,SWBS,GLRD,GBOM,PLFG,DTST,BTST,PTSA,PTRM,SWPD,PTTU,ABAT,AMSA,PBOM,DNGT,SWTD,GCTS,HMDU,FBCR,SMDU,DSTR,LAMN,MAMN,SAMN,FPTT,GFGT,ABOM,APTU,MSFR,FHML,SWBD,LMDU,MMDU,APSA,ARMS,RLBO,PLRM,PLSA,PLTU,RSDR,RDFR,SBOM,ARDF,PFGT,LFMN,MFMN,SFMN,ACRS,RHDR,CORV,ICOL,ALBO,SITU,SISA,RKDR,SWBO,HBOM,AFGT,IBTR,HFGT,SWFG,FIOT,IORM,IOSA,IOTU,FLTU,HLRM,HLSA,HLTU,RAFL,GTRN,LBTR,ACAR,GCOL,SFGT,LBOM,FCAR,RFLS,SWFS,RTRN,ATRT,MIVE,ASPM,RRFV,BFLS,CCOL,ARCY,LEVE,MSRM,SWMD,MSSA,MSTU,RFVE,LLSA,LLTU,SWIS,SBTR,ALCR,IACS,RIDR,AMIV,RCYC,ITRT,IXCW,LFGT,LRCO,ICAR,HFLS,LMSW,PRCY,WFLS,PMIV,EXCW,SCAR,ATRN,IFLS,SMSW,HTRT,LCMN,MCMN,SCMN,PTRN,LTRT,STRN,GRCO,LTRN,AFLS,SWCO,ARCO,FCOL,QFLS,HTRN,ICSV,HGBC,ASCS,STRT,SFLS,SCOL,PLDC,LACS,PFLS,CNSV,FROR,ITRN,LPRD,PRDR,EXDR,SEDR,ATNK,STNK,HTNK,ALTM,PTNK,ACIP,LTNK,FLDP,PLFL,AACI,RSCD,LNMN,SWAD,WADR,ASUD,ITNK,SPST,SSCD,ASED,ASCD,SUDR,SCDR,SSDR,SPDR,SPND,RSPD,ASPD,SWSD,RTTN" }, } let shipData = {}; fetch('./Ships.json').then(response => { shipData = response.json(); }); let weaponData = {}; fetch('./Weapons.json').then(response => { weaponData = response.json(); }); let defenceData = {}; fetch('./Defence.json').then(response => { defenceData = response.json(); }); let mineData = {}; fetch('./Mines.json').then(response => { mineData = response.json(); }); const techStrings = ["Military", "Computer", "Shield", "Material", "Missile", "Laser", "Ion", "Plasma", "Proton", "Navigation", "Cyborg"]; const techStringsLong = ["Militärtechnik", "Coumputertechnik", "Schildtechnik", "Materialtechnik", "Raketentechnik", "Lasertechnik", "Ionentechnik", "Plasmatechnik", "Protonentechnik", "Navigationstechnik", "Cyborgtechnik"]; const shipList = ["WADR", "LFGT", "HFGT", "SFGT", "CORV", "MSFR", "DSTR", "ACRS", "DNGT"]; const defenceList = ["MSTU", "LLTU"]; const mineList = ["LNMN", "SCMN"]; let prioSheet = { "GTGN": "SFGT,HFGT,LFGT,WADR,DNGT,DSTR,MSFR,ACRS,CORV", "MSLN": "SFGT,HFGT,LFGT,MSFR,CORV,WADR,DNGT,DSTR,ACRS", "LACA": "SFGT,DNGT,HFGT,MSFR,DSTR,LFGT,CORV,WADR,ACRS", "XLAC": "DNGT,SFGT,ACRS,DSTR,MSFR,HFGT,CORV,LFGT,WADR", "HLCA": "DNGT,SFGT,HFGT,DSTR,MSFR,ACRS,LFGT,CORV,WADR", "IOCA": "SFGT,HFGT,DSTR,DNGT,MSFR,LFGT,CORV,WADR,ACRS", "PLCA": "DNGT,SFGT,HFGT,MSFR,DSTR,LFGT,CORV,ACRS,WADR", "PRCA": "DNGT,ACRS,DSTR,MSFR,SFGT,HFGT,CORV,LFGT,WADR" } const currentDate = new Date(); let timeField = document.getElementById("MessageTime"); timeField.innerHTML = currentDate.getDay() + "." + currentDate.getMonth() + "." + currentDate.getFullYear() + " " + addZero(currentDate.getHours()) + ":" + addZero(currentDate.getMinutes()) + ":" + addZero(currentDate.getSeconds()); let combatSimDiv = document.getElementById("combatSimDiv"); function addZero(num) { if (num < 10) { return "0" + num; } return num; } for (let i = 1; i <= 2; i++) { let kamikazeCheck = document.getElementById("kamikazeCheck" + i); kamikazeCheck.addEventListener("input", (event) => { let sneakCheck = document.getElementById("sneakCheck" + i); if (sneakCheck.checked) { sneakCheck.checked = false; } runEverything(); }) let sneakCheck = document.getElementById("sneakCheck" + i); sneakCheck.addEventListener("input", (event) => { let kamikazeCheck = document.getElementById("kamikazeCheck" + i); if (kamikazeCheck.checked) { kamikazeCheck.checked = false; } runEverything(); }) } let fleetIDs1 = []; let fleetIDs2 = []; let fleetAddButton1 = document.getElementById("fleetAddButton1"); fleetAddButton1.onclick = function () { addFleet(fleetIDs1, 1); techLogic(fleetIDs1); shipLogic(fleetIDs1); } let fleetAddButton2 = document.getElementById("fleetAddButton2"); fleetAddButton2.onclick = function () { addFleet(fleetIDs2, 2); techLogic(fleetIDs2); shipLogic(fleetIDs2); } addFleet(fleetIDs1, 1); addFleet(fleetIDs2, 2); function addFleet(fleetIDs, num) { let fleetID = Math.floor(Math.random() * 1000000) + 1; fleetIDs.push(fleetID); let fleetHolderDiv = document.getElementById("fleetHolderDiv" + num); fleetHolderDiv.setAttribute("style", "margin-top: 10px"); let fleetHolder = document.createElement("div"); fleetHolder.id = "fleetHolder" + fleetID; fleetHolder.setAttribute("style", "display: block"); let fleetHideShowButton = document.createElement("button"); fleetHideShowButton.className = "SystemGfxButton Green Bold light120"; fleetHideShowButton.setAttribute("style", "padding-bottom: 3px; margin-top: 10px"); fleetHideShowButton.innerHTML = "Ausblenden"; fleetHideShowButton.onclick = function () { if (fleetHolder.style.display === "block") { fleetHolder.style.display = "none"; fleetHideShowButton.innerHTML = "Einblenden"; } else { fleetHolder.style.display = "block"; fleetHideShowButton.innerHTML = "Ausblenden"; } } fleetHolderDiv.appendChild(fleetHideShowButton); let modsDiv = document.createElement("div"); modsDiv.setAttribute("style", "text-align: center; margin-top: 10px"); const speedDiv = document.createElement('div'); speedDiv.setAttribute("style", "position: relative; margin-left: 41px"); const speedText1 = document.createTextNode('Vorsichtig'); const modSpeedAgility = document.createElement('input'); modSpeedAgility.id = "inputModSpeedAgility" + fleetID; modSpeedAgility.type = 'range'; modSpeedAgility.min = '-100'; modSpeedAgility.max = '100'; modSpeedAgility.step = '25'; modSpeedAgility.value = '0'; modSpeedAgility.style.width = '200px'; const speedText2 = document.createTextNode('Voranstürmend'); speedDiv.appendChild(speedText1); speedDiv.appendChild(modSpeedAgility); speedDiv.appendChild(speedText2); const rangeDiv = document.createElement('div'); rangeDiv.setAttribute("style", "position: relative, left: 41px; display: block"); const rangeText1 = document.createTextNode('Hohe Reichweite'); const modRangeDamage = document.createElement('input'); modRangeDamage.id = "inputModRangeDamage" + fleetID; modRangeDamage.type = 'range'; modRangeDamage.min = '-100'; modRangeDamage.max = '100'; modRangeDamage.step = '25'; modRangeDamage.value = '0'; modRangeDamage.style.width = '200px'; const rangeText2 = document.createTextNode('Hoher Schaden'); rangeDiv.appendChild(rangeText1); rangeDiv.appendChild(modRangeDamage); rangeDiv.appendChild(rangeText2); modsDiv.appendChild(speedDiv); modsDiv.appendChild(rangeDiv); fleetHolder.appendChild(modsDiv); modSpeedAgility.addEventListener("input", (event) => { runEverything(); }) modRangeDamage.addEventListener("input", (event) => { runEverything(); }) let techsDiv = document.createElement("div"); let techsDivLeft = document.createElement("div"); techsDivLeft.setAttribute("style", "display: inline-block; vertical-align: top"); techsDivLeft.id = "techsDivLeft" + fleetID; let techsDivRight = document.createElement("div"); techsDivRight.setAttribute("style", "display: inline-block; vertical-align: top"); techsDivRight.id = "techsDivRight" + fleetID; for (let i = 0; i < techStrings.length; i++) { const techDiv = document.createElement("div"); techDiv.setAttribute("style", "position: relative; display: block; margin: 10px 0px 0px 0px"); const techSlider = document.createElement("input"); techSlider.id = "inputTechSlider" + techStrings[i] + fleetID; techSlider.name = techStringsLong[i]; techSlider.type = "range"; techSlider.min = "1"; techSlider.max = "31"; techSlider.value = "31"; if (techStrings[i] === "Cyborg") { techSlider.value = "1"; } techSlider.style.width = "75px"; const techNumber = document.createElement("input"); techNumber.id = "inputTechField" + techStrings[i] + fleetID; techNumber.type = "number"; techNumber.setAttribute("style", "width: 35px; position: relative; top: -3px") techNumber.value = "31"; techNumber.min = "1"; techNumber.max = "31"; const techName = document.createTextNode(" " + techStringsLong[i]); techSlider.addEventListener("input", (event) => { techNumber.value = techSlider.value runEverything(); }) techNumber.addEventListener("input", (event) => { techSlider.value = techNumber.value runEverything(); }) techDiv.appendChild(techSlider); techDiv.appendChild(techNumber); techDiv.appendChild(techName); if (i < Math.ceil(techStrings.length / 2)) { techsDivLeft.appendChild(techDiv); } else { techsDivRight.appendChild(techDiv); } } techsDiv.appendChild(techsDivLeft); techsDiv.appendChild(techsDivRight); fleetHolder.appendChild(techsDiv); let shipsDiv = document.createElement("div"); let shipsDivLeft = document.createElement("div"); shipsDivLeft.setAttribute("style", "display: inline-block; margin-top: 10px; vertical-align: top"); let shipsDivMiddle = document.createElement("div"); shipsDivMiddle.setAttribute("style", "display: inline-block; margin-top: 10px; vertical-align: top"); let shipsDivRight = document.createElement("div"); shipsDivRight.setAttribute("style", "display: inline-block; margin-top: 10px; vertical-align: top"); for (let i = 0; i < shipList.length; i++) { let shipDiv = document.createElement("div"); shipDiv.setAttribute("style", "margin-top:10px"); let shipInput = document.createElement("input"); shipInput.setAttribute("style", "width:100px; display:inline-block"); shipInput.id = "inputShip" + shipList[i] + fleetID; shipInput.addEventListener("input", (event) => { runEverything(); }) const shipName = document.createTextNode(" " + data[shipList[i]].name); shipDiv.appendChild(shipInput); shipDiv.appendChild(shipName); shipsDivLeft.appendChild(shipDiv); } for (let i = 0; i < defenceList.length; i++) { let shipDiv = document.createElement("div"); shipDiv.setAttribute("style", "margin-top:10px"); let shipInput = document.createElement("input"); shipInput.setAttribute("style", "width:100px; display:inline-block"); shipInput.id = "inputShip" + defenceList[i] + fleetID; shipInput.addEventListener("input", (event) => { runEverything(); }) // const shipName = document.createTextNode(" " + data[defenceList[i]].name); shipDiv.appendChild(shipInput); // shipDiv.appendChild(shipName); shipsDivMiddle.appendChild(shipDiv); } for (let i = 0; i < mineList.length; i++) { let shipDiv = document.createElement("div"); shipDiv.setAttribute("style", "margin-top:10px"); let shipInput = document.createElement("input"); shipInput.setAttribute("style", "width:100px; display:inline-block"); shipInput.id = "inputShip" + mineList[i] + fleetID; shipInput.addEventListener("input", (event) => { runEverything(); }) // const shipName = document.createTextNode(" " + data[mineList[i]].name); shipDiv.appendChild(shipInput); // shipDiv.appendChild(shipName); shipsDivRight.appendChild(shipDiv); } shipsDiv.appendChild(shipsDivLeft); shipsDiv.appendChild(shipsDivMiddle); shipsDiv.appendChild(shipsDivRight); fleetHolder.appendChild(shipsDiv); fleetHolderDiv.appendChild(fleetHolder); } function techLogic(fleetIDs) { for (let i = 0; i < fleetIDs.length; i++) { for (let j = 0; j < techStrings.length; j++) { let inputTechSlider = document.getElementById("inputTechSlider" + techStrings[j] + fleetIDs[i]); let inputTechField = document.getElementById("inputTechField" + techStrings[j] + fleetIDs[i]); inputTechSlider.addEventListener("input", (event) => { inputTechField.value = inputTechSlider.value runEverything(); }) inputTechField.addEventListener("input", (event) => { inputTechSlider.value = inputTechField.value runEverything(); }) } } } function shipLogic(fleetIDs) { for (let i = 0; i < fleetIDs.length; i++) { for (let j = 0; j < shipList.length; j++) { let inputShipNumberField = document.getElementById("inputShip" + shipList[j] + fleetIDs[i]); inputShipNumberField.addEventListener("input", (event) => { runEverything(); }) } let speedAgility = document.getElementById("inputModSpeedAgility" + fleetIDs[i]); speedAgility.addEventListener("input", (event) => { runEverything(); }) let rangeDamage = document.getElementById("inputModRangeDamage" + fleetIDs[i]); rangeDamage.addEventListener("input", (event) => { runEverything(); }) } } function runEverything() { let player1 = {}; let player2 = {}; createPlayerValues(player1); createPlayerValues(player2); for (let i = 0; i < fleetIDs1.length; i++) { loadShips(player1, fleetIDs1[i], 1); } for (let i = 0; i < fleetIDs2.length; i++) { loadShips(player2, fleetIDs2[i], 2); } simulateCombat(player1, player2); } let shipAmountChanged = false; let shipAmountFirstRound = true; runEverything(); // let buttonRunSimulation = document.getElementById("buttonRunSimulation"); // buttonRunSimulation.addEventListener("click", function () { // runEverything(); // }); function createPlayerValues(player) { player.ships = []; } function loadShips(player, fleetID, num) { for (let i = 0; i < shipList.length; i++) { let inputShipNumberField = document.getElementById("inputShip" + shipList[i] + fleetID); let inputShipNumber = parseInt(inputShipNumberField.value); if (inputShipNumber > 0) { let ship = {...data[inputShipNumberField.id.substring(9, 13)]}; ship.amount = inputShipNumber; ship.amountInitial = inputShipNumber; ship.weapons = []; ship.position = 0; ship.direction = 1; if (num === 1) { ship.position = 1000; ship.direction = -1; } ship.shotsNeededNum = 0; ship.inRange = false; ship.mu = 0; ship.rho = 0; ship.damagedThisRound = false; if (!ship.hasOwnProperty("stealth")) { ship.stealth = 1000; } let weapons = ship.weaponList; for (const weaponI in weapons) { let weapon = {...data[weaponI]}; weapon.amount = weapons[weaponI]; if (document.getElementById("sneakCheck" + num).checked) { weapon.attackShip *= (10 + ((weapon.attackShip - 1) / (31 - 1)) * (30 - 10)) / 100; weapon.attackGround *= (10 + ((weapon.attackGround - 1) / (31 - 1)) * (30 - 10)) / 100; } if (document.getElementById("kamikazeCheck" + num).checked) { weapon.attackShip *= 1.5; weapon.attackGround *= 1.5; } ship.weapons.push(weapon); } applyTechs(ship, fleetID); loadMods(ship, fleetID); player.ships.push(ship); } } } function applyTechs(ship, fleetID) { let military = parseInt(document.getElementById("inputTechSliderMilitary" + fleetID).value); military = (military - 1) / 30 + 1; let computer = parseInt(document.getElementById("inputTechSliderComputer" + fleetID).value); computer = (computer - 1) / 30 + 1; let shield = parseInt(document.getElementById("inputTechSliderShield" + fleetID).value); shield = (shield - 1) / 30 + 1; let material = parseInt(document.getElementById("inputTechSliderMaterial" + fleetID).value); material = (material - 1) / 30 + 1; let missile = parseInt(document.getElementById("inputTechSliderMissile" + fleetID).value); missile = (missile - 1) / 30 + 1; // (x - 0.75) / 30 + 1 Leichter Werfer ??? // let laser = parseInt(document.getElementById("inputTechSliderLaser" + fleetID).value); let laser2 = (laser - 4) / 30 + 1; // (x - 3.4) / 30 + 1 ??? laser = (laser - 1) / 30 + 1; // x / 30 + 1 LFGT ??? // (x-0.1)/30 + 1 SFGT ??? let ion = parseInt(document.getElementById("inputTechSliderIon" + fleetID).value); ion = (ion - 1) / 30 + 1; // (x - 1) / 30 + 1 let plasma = parseInt(document.getElementById("inputTechSliderPlasma" + fleetID).value); plasma = (plasma - 1) / 30 + 1; let proton = parseInt(document.getElementById("inputTechSliderProton" + fleetID).value); proton = (proton - 1) / 30 + 1; let cyborg = parseInt(document.getElementById("inputTechSliderCyborg" + fleetID).value); cyborg = (cyborg - 1) / 30 + 1; ship.shield *= shield; ship.armor *= material; ship.agility *= cyborg; for (let w = 0; w < ship.weapons.length; w++) { ship.weapons[w].range *= military; ship.weapons[w].accuracy *= computer; ship.weapons[w].accuracy *= cyborg; if (ship.weapons[w].name === "MSLN") { ship.weapons[w].attackShip *= missile; ship.weapons[w].attackGround *= missile; } if (ship.weapons[w].name === "LACA" || ship.weapons[w].name === "XLAC") { ship.weapons[w].attackShip *= laser; ship.weapons[w].attackGround *= laser; } if (ship.weapons[w].name === "HLCA") { ship.weapons[w].attackShip *= laser2; ship.weapons[w].attackGround *= laser2; } if (ship.weapons[w].name === "IOCA") { ship.weapons[w].attackShip *= ion; ship.weapons[w].attackGround *= ion; } if (ship.weapons[w].name === "PLCA") { ship.weapons[w].attackShip *= plasma; ship.weapons[w].attackGround *= plasma; } if (ship.weapons[w].name === "PRCA") { ship.weapons[w].attackShip *= proton; ship.weapons[w].attackGround *= proton; } } } function loadMods(ship, fleetID) { let speedAgilityValue = parseInt(document.getElementById("inputModSpeedAgility" + fleetID).value) / 100; let rangeDamageValue = parseInt(document.getElementById("inputModRangeDamage" + fleetID).value) / 100; ship.speed *= Math.pow(1.3, speedAgilityValue); if (speedAgilityValue > 0) { for (let w = 0; w < ship.weapons.length; w++) { ship.weapons[w].accuracy *= Math.pow(0.5, speedAgilityValue); } } if (speedAgilityValue <= 0) { ship.agility *= Math.pow(2, speedAgilityValue); } for (let w = 0; w < ship.weapons.length; w++) { ship.weapons[w].attackShip *= Math.pow((3.2 - rangeDamageValue * 1.2), rangeDamageValue); ship.weapons[w].attackGround *= Math.pow((3.2 - rangeDamageValue * 1.2), rangeDamageValue); ship.weapons[w].range *= Math.pow((rangeDamageValue * 0.5 + 2.2), rangeDamageValue * -1); } } function simulateCombat(player1, player2) { console.log(player1.ships); console.log(player2.ships); shipAmountChanged = false; combatSimDiv.innerHTML = ""; shipAmountFirstRound = true; // 26 Kampfrunden for (let i = 0; i < 26; i++) { console.log("----------------- Kampfrunde " + (i + 1) + " ----------------"); // 4 Subrunden je Kampf for (let j = 0; j < 4; j++) { console.log("------------------ Subrunde " + (j + 1) + " -----------------"); combatCalculations(player1, player2, j, "Angreifer"); combatCalculations(player2, player1, j, "Verteidiger"); // console.log(" ---") shipCalculations(player2); shipCalculations(player1); } // Kampfrunden ohne Veränderung zusammenfassen if (shipAmountChanged || shipAmountFirstRound) { shipAmountChanged = false; const combatSimRoundText = document.createElement("p"); combatSimRoundText.innerHTML = "Kampfrunde " + (i + 1) + " :"; combatSimDiv.appendChild(combatSimRoundText); const combatSimTable = document.createElement("table"); combatSimTable.className = "MessageTable"; combatSimTable.setAttribute("cellpadding", "0"); combatSimTable.setAttribute("cellspacing", "0"); combatSimTable.setAttribute("border", "0"); combatSimTable.setAttribute("width", "590"); const combatSimTableOuterRow = document.createElement("tr"); const combatSimTableOuterCell1 = document.createElement("td"); combatSimTableOuterCell1.className = "MessageBodyText"; combatSimTableOuterCell1.setAttribute("width", "290"); combatSimTableOuterCell1.setAttribute("valign", "top"); const combatSimParagraph1 = document.createElement("p"); const combatSimUnderline1 = document.createElement("u"); combatSimUnderline1.textContent = "Angreifer : "; combatSimParagraph1.appendChild(combatSimUnderline1); combatSimTableOuterCell1.appendChild(combatSimParagraph1); const combatSimInnerTable1 = document.createElement("table"); combatSimInnerTable1.setAttribute("cellpadding", "0"); combatSimInnerTable1.setAttribute("cellspacing", "0"); combatSimInnerTable1.setAttribute("border", "0"); combatSimInnerTable1.setAttribute("width", "290"); combatSimInnerTable1.className = "MessageTable"; const combatSimTableOuterCell2 = document.createElement("td"); combatSimTableOuterCell2.className = "MessageBodyText"; combatSimTableOuterCell2.setAttribute("width", "290"); combatSimTableOuterCell2.setAttribute("valign", "top"); const combatSimParagraph2 = document.createElement("p"); const combatSimUnderline2 = document.createElement("u"); combatSimUnderline2.textContent = "Verteidiger : "; combatSimParagraph2.appendChild(combatSimUnderline2); combatSimTableOuterCell2.appendChild(combatSimParagraph2); const combatSimInnerTable2 = document.createElement("table"); combatSimInnerTable2.setAttribute("cellpadding", "0"); combatSimInnerTable2.setAttribute("cellspacing", "0"); combatSimInnerTable2.setAttribute("border", "0"); combatSimInnerTable2.setAttribute("width", "290"); combatSimInnerTable2.className = "MessageTable"; combatSimDiv.appendChild(combatSimTable); combatSimTable.appendChild(combatSimTableOuterRow); combatSimTableOuterRow.appendChild(combatSimTableOuterCell1); combatSimTableOuterRow.appendChild(combatSimTableOuterCell2); addHTMLLine(player1, combatSimTableOuterCell1); addHTMLLine(player2, combatSimTableOuterCell2); } shipAmountFirstRound = false; } // Kampfrunden ohne zerstörte Schiffe zusammenfassen for (let i = 0; i < combatSimDiv.children.length - 2; i += 2) { if (getRoundNumberFromString(combatSimDiv.children[i + 2].innerHTML) - getRoundNumberFromString(combatSimDiv.children[i].innerHTML) > 1) { combatSimDiv.children[i].innerHTML = "Kampfrunden " + getRoundNumberFromString(combatSimDiv.children[i].innerHTML) + " bis " + (getRoundNumberFromString(combatSimDiv.children[i + 2].innerHTML) - 1) + " :"; } else { combatSimDiv.children[i].innerHTML = "Kampfrunde " + getRoundNumberFromString(combatSimDiv.children[i].innerHTML) + " :"; } } if (getRoundNumberFromString(combatSimDiv.children[combatSimDiv.children.length - 2].innerHTML) < 26) { combatSimDiv.children[combatSimDiv.children.length - 2].innerHTML = "Kampfrunden " + getRoundNumberFromString(combatSimDiv.children[combatSimDiv.children.length - 2].innerHTML) + " bis 26 :"; } } function getRoundNumberFromString(str) { return parseInt(str.split(" ")[str.split(" ").length - 2]); } function addHTMLLine(player, combatSimTableOuterCell) { for (let s = 0; s < player.ships.length; s++) { const combatSimRow = document.createElement("tr"); const combatSimCell1 = document.createElement("td"); combatSimCell1.className = "MessageBodyText"; combatSimCell1.setAttribute("width", "40"); combatSimCell1.textContent = player.ships[s].name; const combatSimCell2 = document.createElement("td"); combatSimCell2.className = "MessageBodyText"; combatSimCell2.setAttribute("width", "200"); const combatSimSpan = document.createElement("span"); combatSimSpan.className = "MessageReportLink"; combatSimSpan.setAttribute("title", "Staffel Flaggschiff"); combatSimSpan.textContent = player.ships[s].nameLong; combatSimCell2.appendChild(combatSimSpan); const combatSimCell3 = document.createElement("td"); combatSimCell3.setAttribute("width", "40"); combatSimCell3.setAttribute("align", "right"); combatSimCell3.textContent = player.ships[s].amount; if (player.ships[s].amount === 0) { combatSimCell3.className = "MessageBodyTextDead"; } else { combatSimCell3.className = "MessageBodyText"; } if (player.ships[s].damagedThisRound) { combatSimCell3.className = "MessageBodyTextWarn"; player.ships[s].damagedThisRound = false; } combatSimRow.appendChild(combatSimCell1); combatSimRow.appendChild(combatSimCell2); combatSimRow.appendChild(combatSimCell3); combatSimTableOuterCell.appendChild(combatSimRow); } } function combatCalculations(player1, player2, j, role) { // Schiffe feuern // Loop über alle verschiedenen Schiffstypen von Spieler 1 for (let s1 = 0; s1 < player1.ships.length; s1++) { // Loop über Waffen vom Schiff von Spieler 1 for (let w = 0; w < player1.ships[s1].weapons.length; w++) { let shotsAvailable = player1.ships[s1].amount * player1.ships[s1].weapons[w].amount * player1.ships[s1].weapons[w].shots; shotsAvailable = Math.floor((shotsAvailable + (2 * j + 1) / 2) / 4) // Check welche Schiffe von Spieler 2 in Reichweite sind player1.ships[s1].weapons[w].shipsInRange = []; for (let s2 = 0; s2 < player2.ships.length; s2++) { let rangeCheck = false; let stealthCheck = false; if ((player2.ships[s2].position - player1.ships[s1].position) * player1.ships[s1].direction <= player2.ships[s2].stealth) { stealthCheck = true; } if ((player2.ships[s2].position - player1.ships[s1].position) * player1.ships[s1].direction <= player1.ships[s1].weapons[w].range) { rangeCheck = true; } if (stealthCheck && rangeCheck) { player1.ships[s1].weapons[w].shipsInRange.push(player2.ships[s2]); } } // Schüsse aufteilen auf die Gegnerischen Schiffe // Schiffe von Spieler 2 nach der Prioritätsliste sortieren player1.ships[s1].weapons[w].shipsInRange.sort((a, b) => { return prioSheet[player1.ships[s1].weapons[w].name].split(",").indexOf(a.name) - prioSheet[player1.ships[s1].weapons[w].name].split(",").indexOf(b.name) }); // Schüsse berechnen, die auf jeden Schiffstyp von Spieler 2 maximal abgebenen können bevor er komplett zerstört ist. // Splitshots Box for (let r = 0; r < player1.ships[s1].weapons[w].shipsInRange.length; r++) { let effectArmor = player1.ships[s1].weapons[w].shipsInRange[r].armor * (player1.ships[s1].weapons[w].effectArmor); let effectShield = player1.ships[s1].weapons[w].shipsInRange[r].shield * (player1.ships[s1].weapons[w].effectShield); let effectTotal = player1.ships[s1].weapons[w].attackShip - effectArmor - effectShield; let damage = 4 * effectTotal * player1.ships[s1].weapons[w].shipsInRange[r].hull / (4 * player1.ships[s1].weapons[w].shipsInRange[r].hull + effectTotal); if (damage < 0) { damage = 0; } let accuracy = player1.ships[s1].weapons[w].accuracy / (player1.ships[s1].weapons[w].accuracy + player1.ships[s1].weapons[w].shipsInRange[r].agility + 10); let shotsNeeded = Math.round((player1.ships[s1].weapons[w].shipsInRange[r].hull / damage) / accuracy); if (isNaN(shotsNeeded) || !isFinite(shotsNeeded)) { shotsNeeded = 10000000; } player1.ships[s1].weapons[w].shipsInRange[r].shotsNeededNum = shotsNeeded * player1.ships[s1].weapons[w].shipsInRange[r].amount; // // Daten aus dem FlowSheet // const flowSheetData = { // "SFGT": {"GTGN": 2452, "MSLN": 51, "LACA": 21, "XLAC": 12, "HLCA": 7, "IOCA": 22, "PLCA": 10, "PRCA": 2}, // "HFGT": {"GTGN": 5602, "MSLN": 97, "LACA": 43, "XLAC": 25, "HLCA": 15, "IOCA": 45, "PLCA": 21, "PRCA": 2}, // "LFGT": {"GTGN": 5604, "MSLN": 70, "LACA": 37, "XLAC": 29, "HLCA": 14, "IOCA": 39, "PLCA": 20, "PRCA": 3}, // "WADR": {"GTGN": 5092, "MSLN": 45, "LACA": 37, "XLAC": 84, "HLCA": 24, "IOCA": 39, "PLCA": 32, "PRCA": 22}, // "DNGT": {"GTGN": 10000000, "MSLN": 10000000, "LACA": 2690, "XLAC": 577, "HLCA": 623, "IOCA": 6515, "PLCA": 887, "PRCA": 12}, // "DSTR": {"GTGN": 10000000, "MSLN": 10000000, "LACA": 458, "XLAC": 154, "HLCA": 122, "IOCA": 403, "PLCA": 172, "PRCA": 4}, // "MSFR": {"GTGN": 10000000, "MSLN": 1041, "LACA": 202, "XLAC": 77, "HLCA": 60, "IOCA": 314, "PLCA": 84, "PRCA": 2}, // "ACRS": {"GTGN": 10000000, "MSLN": 10000000, "LACA": 10000000, "XLAC": 425, "HLCA": 458, "IOCA": 10000000, "PLCA": 2191, "PRCA": 7}, // "CORV": {"GTGN": 10000000, "MSLN": 314, "LACA": 108, "XLAC": 52, "HLCA": 35, "IOCA": 122, "PLCA": 49, "PRCA": 2} // } // let shotsNeededNum = flowSheetData[player1.ships[s1].weapons[w].shipsInRange[r].name][player1.ships[s1].weapons[w].name]; // player1.ships[s1].weapons[w].shipsInRange[r].shotsNeededNum = shotsNeededNum * player1.ships[s1].weapons[w].shipsInRange[r].amount; } let shotsNeeded = 0; for (let r = 0; r < player1.ships[s1].weapons[w].shipsInRange.length; r++) { if (shotsNeeded < shotsAvailable) { shotsNeeded = shotsNeeded + player1.ships[s1].weapons[w].shipsInRange[r].shotsNeededNum; } } let shotsUpscale = 1; if (Math.min(shotsNeeded, shotsAvailable) !== 0) { shotsUpscale = shotsAvailable / Math.min(shotsNeeded, shotsAvailable); } for (let r = 0; r < player1.ships[s1].weapons[w].shipsInRange.length; r++) { player1.ships[s1].weapons[w].shipsInRange[r].shotsNum = Math.floor(Math.min(player1.ships[s1].weapons[w].shipsInRange[r].shotsNeededNum * shotsUpscale, shotsAvailable)); shotsAvailable = shotsAvailable - Math.min(player1.ships[s1].weapons[w].shipsInRange[r].shotsNeededNum * shotsUpscale, shotsAvailable); } for (let r = 0; r < player1.ships[s1].weapons[w].shipsInRange.length; r++) { // Anzahl der Treffer let hitProbability = player1.ships[s1].weapons[w].accuracy / (player1.ships[s1].weapons[w].accuracy + player1.ships[s1].weapons[w].shipsInRange[r].agility + 10); // console.log("HitProbability " + player1.ships[s1].name + " (" + player1.ships[s1].weapons[w].name + ") -> " + player1.ships[s1].weapons[w].shipsInRange[r].name + ": " + hitProbability); let hitMul = Math.round(player1.ships[s1].weapons[w].shipsInRange[r].shotsNum * hitProbability); let hitMulProb = Math.sqrt(hitMul * (1 - hitProbability)); const random = 0.5; let numHits = invNormDist(random, hitMul, hitMulProb); if (Math.round(numHits) - numHits < 0.0001) { // manchmal wenn 1 rauskommen sollte kommt 0.99999999999 raus, das wird dann fälschlicherwiese abgerundet numHits += 0.0001; } numHits = Math.floor(numHits); if (numHits < 0) { numHits = 0; } // Treffer-Effekt let armorEff = player1.ships[s1].weapons[w].effectArmor * player1.ships[s1].weapons[w].shipsInRange[r].armor; let shieldEff = player1.ships[s1].weapons[w].effectShield * player1.ships[s1].weapons[w].shipsInRange[r].shield; let effect = (player1.ships[s1].weapons[w].attackShip - armorEff - shieldEff); effect = 4 * effect * player1.ships[s1].weapons[w].shipsInRange[r].hull / (4 * player1.ships[s1].weapons[w].shipsInRange[r].hull + effect); if (effect < 0) { effect = 0; } // Schaden berechnen let shipAmountInv = 1 / player1.ships[s1].weapons[w].shipsInRange[r].amount let mu = effect * numHits * (shipAmountInv); let rho = effect * effect * numHits * shipAmountInv * (1 - shipAmountInv); if (player1.ships[s1].weapons[w].shipsInRange[r].amount > 0) { player1.ships[s1].weapons[w].shipsInRange[r].mu += mu; player1.ships[s1].weapons[w].shipsInRange[r].rho += rho; } // console.log(player1.ships[s1].name + " " + player1.ships[s1].weapons[w].name + " " + player1.ships[s1].weapons[w].shipsInRange[r].name + " " + player1.ships[s1].weapons[w].shipsInRange[r].shotsNum + " " + numHits + " " + effect) console.log(role + ": " + player1.ships[s1].name + " -> " + player1.ships[s1].weapons[w].shipsInRange[r].name + " -> " + player1.ships[s1].weapons[w].shipsInRange[r].shotsNum + " Schüsse -> " + numHits + " Treffer"); } } } } function shipCalculations(player) { // Verbleibende Schiffe berechnen // Loop über alle Schiffe von Spieler 2 for (let s = 0; s < player.ships.length; s++) { let remainingShips = normalcdf(player.ships[s].hull, player.ships[s].mu - 0.5, Math.sqrt(player.ships[s].rho)); remainingShips = Math.floor(remainingShips * player.ships[s].amountInitial + 0.5); if (player.ships[s].amount !== remainingShips) { shipAmountChanged = true; player.ships[s].damagedThisRound = true; } player.ships[s].amount = remainingShips; } // Schiffe bewegen for (let s = 0; s < player.ships.length; s++) { player.ships[s].position += (player.ships[s].direction * player.ships[s].speed) / 4; // console.log(player.ships[s].name + " " + player.ships[s].amountInitial + " " + player.ships[s].amount + " " + player.ships[s].position + " " + player.ships[s].direction + " " + Math.round(player.ships[s].mu * 100000) / 100000 + " " + Math.round(player.ships[s].rho * 100000) / 100000) } } function erfcinv(p) { let j = 0; let x, err, t, pp; if (p >= 2) return -100; if (p <= 0) return 100; pp = (p < 1) ? p : 2 - p; t = Math.sqrt(-2 * Math.log(pp / 2)); x = -0.70711 * ((2.30753 + t * 0.27061) / (1 + t * (0.99229 + t * 0.04481)) - t); for (; j < 2; j++) { err = erfc(x) - pp; x += err / (1.12837916709551257 * Math.exp(-x * x) - x * err); } return (p < 1) ? x : -x; } function erfc(x) { return 1 - erf(x); } function erf(x) { let cof = [-1.3026537197817094, 6.4196979235649026e-1, 1.9476473204185836e-2, -9.561514786808631e-3, -9.46595344482036e-4, 3.66839497852761e-4, 4.2523324806907e-5, -2.0278578112534e-5, -1.624290004647e-6, 1.303655835580e-6, 1.5626441722e-8, -8.5238095915e-8, 6.529054439e-9, 5.059343495e-9, -9.91364156e-10, -2.27365122e-10, 9.6467911e-11, 2.394038e-12, -6.886027e-12, 8.94487e-13, 3.13092e-13, -1.12708e-13, 3.81e-16, 7.106e-15, -1.523e-15, -9.4e-17, 1.21e-16, -2.8e-17 ]; let j = cof.length - 1; let isneg = false; let d = 0; let dd = 0; let t, ty, tmp, res; if (x < 0) { x = -x; isneg = true; } t = 2 / (2 + x); ty = 4 * t - 2; for (; j > 0; j--) { tmp = d; d = ty * d - dd + cof[j]; dd = tmp; } res = t * Math.exp(-x * x + 0.5 * (cof[0] + ty * d) - dd); return isneg ? res - 1 : 1 - res; } function invNormDist(p, mean, std) { return -1.41421356237309505 * std * erfcinv(2 * p) + mean; } function normalcdf(to, mean, sigma) { let z = (to - mean) / Math.sqrt(2 * sigma * sigma); let t = 1 / (1 + 0.3275911 * Math.abs(z)); let a1 = 0.254829592; let a2 = -0.284496736; let a3 = 1.421413741; let a4 = -1.453152027; let a5 = 1.061405429; let erf = 1 - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * Math.exp(-z * z); let sign = 1; if (z < 0) { sign = -1; } return (1 / 2) * (1 + sign * erf); }