틀:RPG in City 전투
보이기
function RPGinCity(){
const url = new URL(window.location.href);
let siteHostName = url.host;
var usernameStr = mw.user.getName();
var currentpage = mw.config.get("wgPageName");
var pagenode = currentpage.split('/');
console.log("사용자:"+ usernameStr + "/RPG_in_City.json");
if (pagenode[0] !== "RPG_in_City"){
if (currentpage !== "사용자:"+ usernameStr + "/RPG_in_City.json") {
console.log("Current page is "+ currentpage +", not playing RPG in City");
return;
}
}
var fullbasepagename = "";
for (var node = 0 ; node < pagenode.length - 2; node++){
fullbasepagename = fullbasepagename + pagenode[node] + "/";
}
fullbasepagename = fullbasepagename + pagenode[pagenode.length - 2];
// console.log(fullbasepagename);
function RPGinCity_pushFightInfo(targetUri, Mhp, Ehp, Jam, PJam, BanBomb, Etype, Elevel, Turn) {
const params = {'mhp':Mhp, 'ehp':Ehp, 'j':Jam, 'bj':PJam, 'bb':BanBomb, 'etype':Etype, 'elevel':Elevel, 'turn':Turn};
for (const param in params) {
targetUri.searchParams.set(param, params[param]);
}
return targetUri;
}
function RPGinCity_HandleBattle(jsonfile) {
var Battlelink = new URL(window.location.href);
//console.log("building battle phase...");
//console.log(JSON.stringify(jsonfile));
var queryparams = Battlelink.searchParams;
// 이제 필요한 값을 구해 화면에 표시한다.
// 먼저 플레이어 체력부터 아이템 별 수량까지 가져온다...
let mhp = 0, j=0, bj=0, bb=0;
var playerhealth = document.getElementById("RPGinCity-playerhealth");
if (!queryparams.get('mhp')) {
mhp = jsonfile["체력"];
} else {
mhp = parseInt(queryparams.get('mhp')); // mhp는 이전 문서의 값을 받는다.
}
// 20251214 패치: mw.Uri 제거 이슈로 인해 아이템도 전부 수동 로드
if (queryparams.get('j') == undefined || queryparams.get('j') == null) {
j = jsonfile["잼"];
} else {
j = parseInt(queryparams.get('j'));
}
if (queryparams.get('bj') == undefined || queryparams.get('bj') == null) {
bj = jsonfile["배쨈"];
} else {
bj = parseInt(queryparams.get('bj')); // 이전 쿼리 값을 받는다.
}
if (queryparams.get('bb') == undefined || queryparams.get('bb') == null) {
bb = jsonfile["차단폭탄"];
} else {
bb = parseInt(queryparams.get('bb')); // 이전 쿼리리 값을 받는다.
}
// 플레이어 체력 표시시
playerhealth.innerText = mhp;
//적의 레벨
var enemylevel = document.getElementById("RPGinCity-enemylevel");
enemylevel.innerText = queryparams.get('elevel'); // elevel는 항상 undefined이 아니다.
//적의 체력
var enemyhealth = document.getElementById("RPGinCity-enemyhealth");
enemyhealth.innerText = queryparams.get('ehp'); // ep는 항상 undefined이 아니다.
//공격 페이즈
var nextPhaseUri = new URL(`https://${siteHostName}/index.php?title=`+currentpage);
//console.log("nextPhaseUri is "+nextPhaseUri);
var attackPower = Math.round(Math.random() * jsonfile["레벨"]*3) + jsonfile["무기"];
/* 액션 처리 메서드 */
function RiC_Action(actionElemId, uriValue, actionText) {
// console.log('RPG in City 전투: '+uriValue+'로 이동...');
var itemAction = document.getElementById(actionElemId);
var itemActionUri = uriValue;
if (itemAction) {
var itemActionLink = document.createElement("a");
itemActionLink.href = itemActionUri;
itemActionLink.innerText=actionText;
itemAction.appendChild(itemActionLink);
}
}
RiC_Action("RPGinCity-attackEnemy", RPGinCity_pushFightInfo(nextPhaseUri, mhp, (parseInt(queryparams.get('ehp')) - attackPower) >= 0 ? parseInt(queryparams.get('ehp')) - attackPower : 0, j, bj, bb, queryparams.get('etype'), queryparams.get('elevel'), 2), "그냥 공격!");
if (j > 0) RiC_Action("RPGinCity-useJam", RPGinCity_pushFightInfo(nextPhaseUri, jsonfile["체력"], queryparams.get('ehp'), j-1, bj, bb, queryparams.get('etype'), queryparams.get('elevel'), 2), "잼으로 회복!");
if (bj > 0) RiC_Action("RPGinCity-usePJ", RPGinCity_pushFightInfo(nextPhaseUri, mhp, parseInt(queryparams.get('ehp')) > 20 ? parseInt(queryparams.get('ehp')) - 20 : 0, j, bj-1, bb, queryparams.get('etype'), queryparams.get('elevel'), 2), "배쨈 열기!");
if (bb > 0) RiC_Action("RPGinCity-useBanbomb", RPGinCity_pushFightInfo(nextPhaseUri, mhp, parseInt(queryparams.get('ehp'))/2, j, bj, bb-1, queryparams.get('etype'), queryparams.get('elevel'), 2), "차단폭탄!");
//방어 페이즈
RiC_Action("RPGinCity-Block", RPGinCity_pushFightInfo(nextPhaseUri, mhp- Math.round(Math.random() * parseFloat(queryparams.get('elevel')) * 0.75), queryparams.get('ehp'), j, bj, bb, queryparams.get('etype'), queryparams.get('elevel'), 1), "방어");
RiC_Action("RPGinCity-FailRunning", RPGinCity_pushFightInfo(nextPhaseUri, mhp - Math.round(Math.random() * parseInt(queryparams.get('elevel'))), queryparams.get('ehp'), j, bj, bb, queryparams.get('etype'), queryparams.get('elevel'), 1), "도망치자!");
var RunFromEnemy = document.getElementById("RPGinCity-RunFromEnemy");
var MustKill = document.getElementById("mustKill");
if (RunFromEnemy && !MustKill)RunFromEnemy.style.visibility = "visible";
}
function RPGinCity_SaveHandle(saveGameHandle) {
var api = new mw.Api();
var Templink = new URL(window.location.href);
var queryparams = Templink.searchParams;
switch (saveGameHandle.innerText){
case "서브퀘스트완료":
new mw.Api().edit("사용자:"+usernameStr+"/RPG_in_City.json", function (revision) {
var jsondata = JSON.parse(revision.content);
jsondata["추가1"] = 0;
jsondata["경험치"] = jsondata["경험치"] + 100;
jsondata["최근페이지"] = fullbasepagename;
return {text: JSON.stringify(jsondata), summary: "서브퀘스트완료"};
}
).then(function () {
alert( '퀘스트 수행 완료!' );
document.getElementById("RPGinCity-searchphase").style.display = "block";
});
break;
case "서브퀘스트수행":
new mw.Api().edit("사용자:"+usernameStr+"/RPG_in_City.json", function (revision) {
var jsondata = JSON.parse(revision.content);
var questID = document.getElementById("RPGinCity-questID");
if (questID !== undefined && questID !== null){
jsondata["추가1"] = parseInt(questID.innerText);
jsondata["최근페이지"] = fullbasepagename;
}
return {text: JSON.stringify(jsondata), summary: "서브퀘스트수행"};
}
).then(function () {
alert( '수락 완료!' );
document.getElementById("RPGinCity-searchphase").style.display = "block";
});
break;
case "메인퀘스트수행":
new mw.Api().edit("사용자:"+usernameStr+"/RPG_in_City.json", function (revision) {
var jsondata = JSON.parse(revision.content);
var mainQuestPoint = document.getElementById("mainQuestPoint");
if (mainQuestPoint !== undefined && mainQuestPoint !== null) jsondata["최근페이지"] = mainQuestPoint.innerText;
var questID = document.getElementById("questID");
if (questID !== undefined && questID !== null) jsondata["추가2"] = parseInt(questID.innerText);
return {text: JSON.stringify(jsondata), summary: "메인퀘스트수행"};
}
).then(function () {
alert( '완료!' );
document.getElementById("RPGinCity-searchphase").style.display = "block";
});
break;
case "동부요금지불":
new mw.Api().edit("사용자:"+usernameStr+"/RPG_in_City.json", function (revision) {
var jsondata = JSON.parse(revision.content);
jsondata["돈"] -= 500*1;
jsondata["추가2"] = 5*1; // force to parse it a number
jsondata["최근페이지"] = "RPG in City/만남의 광장";
return {text: JSON.stringify(jsondata), summary: "동부요금지불"};
}
).then(function () {
alert( '지불 완료!' );
document.getElementById("RPGinCity-searchphase").style.display = "block";
});
break;
case "전투승리":
new mw.Api().edit("사용자:"+usernameStr+"/RPG_in_City.json", function (revision) {
var jsondata = JSON.parse(revision.content);
jsondata["체력"] = parseInt(queryparams.get('mhp'));
jsondata["경험치"] += queryparams.get('elevel')*4;
jsondata["돈"] += queryparams.get('elevel')*5;
jsondata["최근페이지"] = currentpage.substring(0, currentpage.length-3);
return {text: JSON.stringify(jsondata), summary: "전투승리"};
}
).then(function () {
alert( '승리!' );
document.getElementById("RPGinCity-searchphase").style.display = "block";
});
break;
case "레벨업":
new mw.Api().edit("사용자:"+usernameStr+"/RPG_in_City.json", function (revision) {
var jsondata = JSON.parse(revision.content);
jsondata["레벨"] += (jsondata["경험치"] - jsondata["경험치"] % 128)/128;
jsondata["경험치"] = jsondata["경험치"] % 128;
return {text: JSON.stringify(jsondata), summary: "레벨업"};
}
).then(function () {
alert( '저장 완료!' );
if (currentpage !== "RPG in City/레벨 업")document.getElementById("RPGinCity-searchphase").style.display = "block";
});
break;
case "회복":
new mw.Api().edit("사용자:"+usernameStr+"/RPG_in_City.json", function (revision) {
var jsondata = JSON.parse(revision.content);
jsondata["체력"] = jsondata["레벨"] * 16;
return {text: JSON.stringify(jsondata), summary: "회복"};
}
).then(function () {
alert( '체력이 완전히 회복되었습니다!' );
document.getElementById("RPGinCity-searchphase").style.display = "block";
});
break;
case "결제":
new mw.Api().edit("사용자:"+usernameStr+"/RPG_in_City.json", function (revision) {
var jsondata = JSON.parse(revision.content);
jsondata["잼"] += queryparams.get('j')*1;
jsondata["배쨈"] += queryparams.get('bj')*1;
jsondata["차단폭탄"] += queryparams.get('bb')*1;
jsondata["무기"] += queryparams.get('weapon')*1;
jsondata["돈"] -= 50* queryparams.get('j') + 75*queryparams.get('bj') + 150*queryparams.get('bb') + 1000 * queryparams.get('weapon');
jsondata["최근페이지"] = currentpage.substring(0, currentpage.length-3);
return {text: JSON.stringify(jsondata), summary: "결제"};
}
).then(function () {
alert( '결제 완료!' );
document.getElementById("RPGinCity-searchphase").style.display = "block";
});
break;
case "카통라킹폭탄지급":
new mw.Api().edit("사용자:"+usernameStr+"/RPG_in_City.json", function (revision) {
var jsondata = JSON.parse(revision.content);
jsondata["차단폭탄"] = jsondata["차단폭탄"] + 1;
jsondata["최근페이지"] = fullbasepagename;
return {text: JSON.stringify(jsondata), summary: "폭탄지급"};
}
).then(function () {
alert( '폭탄 지급 완료!' );
});
break;
default:
new mw.Api().edit("사용자:"+usernameStr+"/RPG_in_City.json", function (revision) {
var jsondata = JSON.parse(revision.content);
jsondata["최근페이지"] = fullbasepagename;
return {text: JSON.stringify(jsondata), summary: "폭탄지급"};
}
).then(function () {
alert( '저장 완료!' );
});
break;
}
}
function RPGinCity_HandleStore(jsondata, storeNumber) {
var i = storeNumber;
var Jam = document.getElementsByClassName("RPGinCity-JamAmount")[i];
if (Jam !== undefined && Jam !== null && Jam.innerText === "") Jam.innerText = "0";
var PearJam = document.getElementsByClassName("RPGinCity-PearJamAmount")[i];
if (PearJam !== undefined && PearJam !== null && PearJam.innerText === "") PearJam.innerText = "0";
var BB = document.getElementsByClassName("RPGinCity-BanBombAmount")[i];
if (BB !== undefined && BB !== null && BB.innerText === "") BB.innerText = "0";
var WeaponLevelUp = document.getElementsByClassName("RPGinCity-WeaponLevelUp")[i];
if (WeaponLevelUp !== undefined && WeaponLevelUp !== null && WeaponLevelUp.innerText === "") WeaponLevelUp.innerText = "0";
var BuyButton = document.getElementsByClassName("RPGinCity-BuyButton")[i];
if (BuyButton !== undefined && BuyButton !== null) {
if (50 * parseInt(Jam.innerText) + 75 * parseInt(PearJam.innerText) + 150* parseInt(BB.innerText) + 1000*parseInt(WeaponLevelUp.innerText) > jsondata.돈) {
BuyButton.innerText = "돈이 부족하다. 나가서 돈을 구해오자.";
}
BuyButton.style.visibility = "visible";
}
}
function RPGinCity_Callback_fetchUserInformation(jsonfile) {
// 정보 틀 관련
var playerinfo = document.getElementsByClassName("RPGinCity-Playerinfo");
var LevelUpButton = document.getElementById("RPGinCity-LevelUp");
if ( playerinfo !== undefined && playerinfo !== null && playerinfo.length > 0) {
playerinfo[0].innerText = jsonfile["레벨"];
playerinfo[1].innerText = jsonfile["체력"];
playerinfo[2].innerText = jsonfile["경험치"];
playerinfo[3].innerText = jsonfile["잼"];
playerinfo[4].innerText = jsonfile["배쨈"];
playerinfo[5].innerText = jsonfile["차단폭탄"];
playerinfo[6].innerText = jsonfile["돈"];
playerinfo[7].innerText = jsonfile["무기"];
if (LevelUpButton && jsonfile["경험치"] > 128 && jsonfile["레벨"] + jsonfile["경험치"] /128 <= 50) {
var levelup = document.createElement("a");
levelup.href = `https://${siteHostName}/index.php?title==RPG_in_City/레벨_업&lastgamepage=` + currentpage;
levelup.innerHTML = "레벨업하기";
LevelUpButton.appendChild(levelup);
}
}
// RPG in City/집 쉬기 기능
var RestingInHouse = document.getElementById("RPGinCity-House");
if (RestingInHouse !== undefined && RestingInHouse != null) {
if (jsonfile["체력"] < jsonfile["레벨"] * 16){
document.getElementById("RPGinCity-needRest").innerHTML = "너는 한숨 자고 개운한 마음으로 이곳을 나가려고 한다.\n";
var resting = document.createElement("a");
resting.href = `https://${siteHostName}/index.php?title=`+currentpage+"/회복";
resting.innerHTML = "\n쉬기";
RestingInHouse.appendChild(resting);
} else {
RestingInHouse.innerHTML = "너는 몸 상태가 좋아 여기에 머물지 않기로 결정했다.";
}
RestingInHouse.style.visibility = "visible";
}
// RPG in City 전투 관련 스크립트
var inBattle = document.getElementById("RPGinCity-Fight");
if (inBattle){
RPGinCity_HandleBattle(jsonfile);
} // 전투 틀 처리 완료
// 일반적인 상점(문서 내에 단 한 개 존재) 처리
var storeHandle = document.getElementById("RiCStore");
if (storeHandle){
RPGinCity_HandleStore(jsonfile, 0);
}
//동부2구역구 - 중부구역구 이동 가능 여부 처리
var DowntownRoadOpen = document.getElementById("DowntownRoad");
if (DowntownRoadOpen) {
if (jsonfile["추가2"] < 60) {
DowntownRoadOpen.innerText = "이런!!! 다운타운 로드는 반달로 인해 막혀있다.";
}
DowntownRoadOpen.style.visibility = "visible";
}
//남부 1구역구 메인퀘스트
var south1st = document.getElementById("south1st");
if (south1st) {
var displaypart;
if (jsonfile["추가2"] < 10){
displaypart = document.getElementById("beforeBossfight");
displaypart.style.display = "block";
} else {
displaypart = document.getElementById("afterBossfight");
displaypart.style.display = "block";
}
}
//중부구역구
var toWest = document.getElementById("toWest");
if (toWest) {
if (jsonfile["추가2"] < 25) {
toWest.innerText = "서부 구역구 방향으로 가기 - <중부 구역구가 파괴된 시점에서 서부 구역구를 분리하는 장벽은 강력한 반달러들로 인해 봉쇄 상태를 유지하고 있다>";
}
toWest.style.visibility = "visible";
}
var toCentralOffice = document.getElementById("toCentralOffice");
if (toCentralOffice) {
if (jsonfile["추가2"] < 40) {
toCentralOffice.innerText = "시청으로 들어가기 - < 시청에 들어갈 방법을 찾아야 한다 >";
}
toCentralOffice.style.visibility = "visible";
}
var peacefulCentral = document.getElementById("peacefulCentral");
var dangerousCentral = document.getElementById("dangerousCentral");
if (peacefulCentral !== undefined && peacefulCentral !== null && dangerousCentral !== undefined && dangerousCentral !== null) {
if (jsonfile["추가2"] >= 70) {
peacefulCentral.style.visibility = "visible";
} else {
dangerousCentral.style.visibility = "visible";
}
}
// 중부 구역구 대피소 퀘스트
var rescuePeregirl = document.getElementsByClassName("rescuePeregirl");
if (rescuePeregirl !== undefined && rescuePeregirl !== null && rescuePeregirl.length > 0) {
if (jsonfile["추가2"] < 15) {
rescuePeregirl[1].remove();
rescuePeregirl[0].style.display = "block";
} else if (jsonfile["추가2"] === 20) {
rescuePeregirl[0].remove();
rescuePeregirl[0].style.display = "block";
} else {
rescuePeregirl[0].remove();
rescuePeregirl[0].remove();
rescuePeregirl[0].style.display = "block";
}
}
var meetPeregirl = document.getElementsByClassName("meetPeregirl");
if (meetPeregirl !== undefined && meetPeregirl !== null && meetPeregirl.length > 0) {
if (jsonfile["추가2"] < 20) {
meetPeregirl[0].style.display = "block";
} else {
meetPeregirl[0].remove();
meetPeregirl[0].style.display = "block";
}
}
//남부 1구역구 상점, 문서 구조상 좀 구현이 복잡하여 분리한다.
var south1stStore = document.getElementsByClassName("south1stStore");
if (south1stStore !== undefined && south1stStore !== null && south1stStore.length > 0) {
if (jsonfile["추가2"] < 10) {
south1stStore[0].style.display = "block";
RPGinCity_HandleStore(jsonfile, 0);
} else {
south1stStore[1].style.display = "block";
RPGinCity_HandleStore(jsonfile, 1);
}
}
//시청 안의 산토끼 몰매 맞고 가나요~
var cityOffice = document.getElementsByClassName("cityOffice");
if (cityOffice !== undefined && cityOffice !== null && cityOffice.length > 0) {
if (jsonfile["추가2"] < 70) {
cityOffice[0].style.display = "block";
} else {
cityOffice[1].style.display = "block";
}
}
var cityOfficeInternal = document.getElementsByClassName("cityOfficeInternal");
if (cityOfficeInternal !== undefined && cityOfficeInternal !== null && cityOfficeInternal.length > 0) {
if (jsonfile["추가2"] >= 65) {
cityOfficeInternal[0].style.display = "block";
} else {
cityOfficeInternal[1].style.display = "block";
}
}
var cityOffice3F = document.getElementsByClassName("cityOffice3F");
if (cityOffice3F !== undefined && cityOffice3F !== null && cityOffice3F.length > 0) {
if (jsonfile["추가2"] >= 65) {
cityOffice3F[0].style.display = "block";
} else {
cityOffice3F[1].style.display = "block";
}
}
var mayorRoom = document.getElementsByClassName("mayorRoom");
if (mayorRoom !== undefined && mayorRoom !== null && mayorRoom.length > 0) {
if (jsonfile["추가2"] >= 70) {
mayorRoom[0].style.display = "block";
} else {
mayorRoom[1].style.display = "block";
}
}
// 서브 퀘스트 관련
var subQuestContent = document.getElementById("SubQuestContent");
var parentNode;
if (subQuestContent !== undefined && subQuestContent !== null){
parentNode = subQuestContent.parentElement;
}
if (parentNode !== undefined && parentNode !== null && subQuestContent !== undefined && subQuestContent !== null) {
if (jsonfile["추가1"] !== 0) {
parentNode.removeChild( subQuestContent );
} else {
subQuestContent.style.display = "block";
}
}
var subQuestEnd = document.getElementById("SubQuestEnd");
if (parentNode !== undefined && parentNode !== null &&subQuestEnd !== undefined && subQuestEnd !== null) {
if (jsonfile["추가1"] !== 1) {
parentNode.removeChild( subQuestEnd );
} else {
subQuestEnd.style.display = "block";
}
}
var subQuestNotEnd = document.getElementsByClassName("SubQuestNotEnd");
if (parentNode !== undefined && parentNode !== null && subQuestNotEnd !== undefined && subQuestNotEnd !== null) {
if (jsonfile["추가1"] < 2) {
parentNode.removeChild( subQuestNotEnd[0] );
} else {
subQuestNotEnd[0].style.display = "block";
}
}
// 자동 세이브 처리 - 가장 마지막에 와야 하는 것
var saveGameHandle = document.getElementById("RPGinCity-saveGame");
if (saveGameHandle !== undefined && saveGameHandle !== null) {
console.log("Saving...");
RPGinCity_SaveHandle(saveGameHandle);
}
}
// ----------------------------------------------------Main------------------------------------------------------------
// RPGinCity_Title();
// if (currentpage === "사용자:"+usernameStr+"/RPG_in_City.json"){
// RPGinCity_GoToCheckpoint();
// }
// else if (currentpage.substring(0,11) === "RPG_in_City") { // in game but not in title screen
var api = new mw.Api();
console.log("fetching player info...");
fetch(`https://${siteHostName}/index.php?title=사용자:`+usernameStr+"/RPG_in_City.json"+"&action=raw")
.then(function(response) {
if (!response.ok) {
// make the promise be rejected if we didn't get a 2xx response
throw new Error("Not 2xx response", {cause: response});
}
return response.json();
})
.then(function(response) {
var parsedata = response;
RPGinCity_Callback_fetchUserInformation(parsedata);
}
)
.catch(function(e){
console.log(e);
document.getElementById("RPGinCityLoad").style.display = "none";
});
// }
}
$(RPGinCity);
| ||||
| ||||
|
설명[원본 편집]
주의:이 틀은 평소에 연산 오류를 낼 수 있으며, 파라미터값이 주어질 때만 정상적으로 작동한다는 가정 하에 작동됩니다.
틀:RPG in City 여기로를 사용하여 파라미터를 줄 수 있습니다.