/* * UOX3 Skills */ #include "uox3.h" #include "debug.h" int goldsmithing; #define DBGFILE "skills.cpp" void tailoring(int s) { int i, packnum, amt, serial; packnum=packitem(currchar[s]); serial=calcserial(buffer[s][7],buffer[s][8],buffer[s][9],buffer[s][10]); i=findbyserial(&itemsp[serial%256], serial, 0); if (i!=-1) { if (((items[i].id1==0x0f)&&((items[i].id2>=0x95)&&(items[i].id2<=0x9c)))||((items[i].id1==0x17)&&((items[i].id2>=0x5d)&&(items[i].id2<=0x64))) || ((items[i].id1==0x10)&&(items[i].id2==0x78))) { if (items[i].contserial!=items[packnum].serial) { sysmessage(s,"You can't use material outside your backpack"); } else { itemmake[s].has=amt=getamount(currchar[s], items[i].id1, items[i].id2); if(amt<1) { sysmessage(s,"You don't have enough material to make anything."); return; } itemmake[s].materialid1=items[i].id1; itemmake[s].materialid2=items[i].id2; if (items[i].id1==0x10 && items[i].id2==0x78) makemenu(s,40,TAILORING); else makemenu(s,30,TAILORING); } return; } } sysmessage(s,"You cannot use that material for tailoring."); } void fletching(int s) { int i, packnum,serial; packnum=packitem(currchar[s]); serial=calcserial(buffer[s][7],buffer[s][8],buffer[s][9],buffer[s][10]); i=findbyserial(&itemsp[serial%256], serial, 0); if (i!=-1) { if (((itemmake[s].materialid2>=0xD4 && itemmake[s].materialid2<=0xD6) && (items[i].id1==0x1B && (items[i].id2>=0xD1 && items[i].id2<=0xD3))) || ((itemmake[s].materialid2>=0xD1 && itemmake[s].materialid2<=0xD3) && (items[i].id1==0x1B && (items[i].id2>=0xD4 && items[i].id2<=0xD6)))) { if (items[i].contserial!=items[packnum].serial) { sysmessage(s,"You can't use items outside your backpack."); } else { itemmake[s].materialid1b=items[i].id1; itemmake[s].materialid2b=items[i].id2; itemmake[s].has=getamount(currchar[s], itemmake[s].materialid1, itemmake[s].materialid2); itemmake[s].has2=getamount(currchar[s], itemmake[s].materialid1b, itemmake[s].materialid2b); makemenu(s,60,BOWCRAFT); } return; } } sysmessage(s,"You cannot use that for fletching."); } void bowcraft(int s) { int i, packnum, amt,serial; packnum=packitem(currchar[s]); serial=calcserial(buffer[s][7],buffer[s][8],buffer[s][9],buffer[s][10]); i=findbyserial(&itemsp[serial%256], serial, 0); if (i!=-1) { if((items[i].id1==0x1B) && ((items[i].id2==0xDD) || items[i].id2==0xE0)) { if (items[i].contserial!=items[packnum].serial) { sysmessage(s,"You can't carve logs outside your backpack"); return; } else { itemmake[s].has=amt=getamount(currchar[s], items[i].id1, items[i].id2); if(amt<2) { sysmessage(s,"You don't have enough material to make anything."); } else { itemmake[s].materialid1=items[i].id1; itemmake[s].materialid2=items[i].id2; makemenu(s,65,BOWCRAFT); } return; } } } } void carpentry(int s) { int i, packnum, amt,serial; packnum=packitem(currchar[s]); serial=calcserial(buffer[s][7],buffer[s][8],buffer[s][9],buffer[s][10]); i=findbyserial(&itemsp[serial%256], serial, 0); if (i!=-1) { if(items[i].id1==0x1B && items[i].id2==0xDD) { if (items[i].contserial!=items[packnum].serial) { sysmessage(s,"You can't use lumber outside your backpack"); } else { itemmake[s].has=amt=getamount(currchar[s], 0x1B, 0xDD); if(amt<9) { sysmessage(s,"You don't have enough logs to make anything."); return; } makemenu(s,20,CARPENTRY); } return; } } sysmessage(s,"You cannot use that material for carpentry."); } void smith(int s) { int i, packnum,serial; packnum=packitem(currchar[s]); serial=calcserial(buffer[s][7],buffer[s][8],buffer[s][9],buffer[s][10]); i=findbyserial(&itemsp[serial%256], serial, 0); if (i!=-1) { if(items[i].id1==0x1B && (items[i].id2==0xEF||items[i].id2==0xF2)) { if (items[i].contserial!=items[packnum].serial) { sysmessage(s,"You can't smith ore outside your backpack"); } else anviltarget(s,i); return; } } serial=calcserial(buffer[s][7],buffer[s][8],buffer[s][9],buffer[s][10]); i=findbyserial(&itemsp[serial%256], serial, 0); if (i!=-1) { if((items[i].id1==0x1B && items[i].id2==0xEC)) { if (items[i].contserial!=items[packnum].serial) { sysmessage(s,"You can't smith Gold ingots outside your backpack"); } else anviltargetgold(s,i); return; } } sysmessage(s,"You cannot use that material for blacksmithing."); } void anviltarget(int s,int m) { unsigned int i; int amt; for (i=0;i=0x3b)&&(buffer[s][0x12]<=0x4f))|| ((buffer[s][0x12]>=0x51)&&(buffer[s][0x12]<=0x53))||(buffer[s][0x12]==0x6a)))&&(!((buffer[s][0x11]==0x02)&& (((buffer[s][0x12]>=0x5c)&&(buffer[s][0x12]<=0x76))||((buffer[s][0x12]>=0x7d)&&(buffer[s][0x12]<=0x80)))))) floor=1; // check if mountain else if (((buffer[s][0x10]>=1)&&(buffer[s][0x10]<=50))&&(buffer[s][0x11]==0)&&(buffer[s][0x12]==0)) mountain=1; // can be adjusted 1 to 53 (1=ground - 53=top of mountain) this isn't really true but the higher the number the higher up the mountain you are 'usually'. // all else thrown out px=((buffer[s][0x0b]*256)+(buffer[s][0x0c]%256)); py=((buffer[s][0x0d]*256)+(buffer[s][0x0e]%256)); // amount=world_resource_check(px,py,4,1); working... but not finished cx=abs(chars[currchar[s]].x-px); cy=abs(chars[currchar[s]].y-py); if(!((cx<=5)&&(cy<=5))) { sysmessage(s,"You are to far away to reach that"); return; } /*else if(amount<=0) //working... but not finished { sysmessage(s,"There are no ore deposits in the area."); return; }*/ if (((!(floor))&&(!(mountain)))|| ((server_data.minecheck==1)&&(!(floor)))|| ((server_data.minecheck==2)&&(!((chars[currchar[s]].region==1)||(chars[currchar[s]].region==2))))) { sysmessage(s,"You can't dig there!"); return; } if (chars[currchar[s]].onhorse) action(s,0x1A); else action(s,0x0b); soundeffect(s,0x01,0x25); if(!checkskill(currchar[s],MINING, 0, 1000)) { sysmessage(s,"You sifted thru the dirt and rocks, but found nothing useable."); return; } if ((buffer[s][1]==1)&&(buffer[s][2]==0)&& (buffer[s][3]==1)&&(buffer[s][4]==0)) { if (asdf<=5) { asdf=rand()%20; switch(asdf) { case 1: if(checkskill(currchar[s],MINING,850,1000)) { SpawnRandomItem(s,1,"necro.scp","ITEMLIST","999"); sysmessage(s,"You place a gem in your pack."); } break; case 6: SpawnItem(s,1,"Silver Ore",1,0x19,0xb8, 0x03, 0x8A,1,1); sysmessage(s,"You place some silver ore in your pack."); break; case 10: SpawnItem(s,1,"Gold Ore",1,0x19,0xb8, 0x09, 0x6D,1,1); sysmessage(s,"You place some gold ore in your pack."); break; case 14: SpawnItem(s,1,"Mythril Ore",1,0x19,0xb8, 0x01, 0x91,1,1); sysmessage(s,"You place some mythril ore in your pack."); break; case 18: SpawnItem(s,1,"Adamantium Ore",1,0x19,0xb8, 0x03, 0x86,1,1); sysmessage(s,"You place some adamantium ore in your pack."); break; default: SpawnItem(s,1,"Copper Ore",1,0x19,0xb8, 0x00, 0xf3,1,1); sysmessage(s,"You place some copper ore in your pack."); break; } } else { asdf=rand()%20; if (asdf==10) { SpawnItem(s,5,"Iron Ore",1,0x19,0xba, 0, 0,1,1); sysmessage(s,"You place some iron ore in your pack."); } else { SpawnItem(s,1,"Iron Ore",1,0x19,0xb7, 0, 0,1,1); sysmessage(s,"You place some iron ore in your pack."); } } } } void gravedig(int s) // added by Genesis 11-4-98 { int nAmount, nFame, nItemID, nCharID; char iID=0; nCharID=currchar[s]; Karma(nCharID,-1,-2000); // Karma loss no lower than the -2 pier if(chars[currchar[s]].onhorse) action(s,0x1A); else action(s,0x0b); soundeffect(s,0x01,0x25); if(!checkskill(currchar[s],MINING, 0, 800)) { sysmessage(s,"You sifted through the dirt and found nothing."); return; } nFame = chars[nCharID].fame; if(chars[nCharID].onhorse) action(s,0x1A); else action(s,0x0b); soundeffect(s,0x01,0x25); int nRandnum=rand()%13; switch(nRandnum) { case 2: SpawnRandomMonster(s,"necro.scp","UNDEADLIST","1000"); // Low level Undead - Random sysmessage(s,"You have disturbed the rest of a vile undead creature."); break; case 4: nItemID=SpawnRandomItem(s,1,"necro.scp","ITEMLIST","1001"); // Armor and shields - Random if((nItemID>=7026)&&(nItemID<=7035)) sysmessage(s,"You unearthed an old shield and placed it in your pack"); else sysmessage(s,"You have found an old piece armor and placed it in your pack."); break; case 5: //Random treasure between gems and gold nRandnum=rand()%2; if(nRandnum) { // randomly create a gem and place in backpack SpawnRandomItem(s,1,"necro.scp","ITEMLIST","999"); sysmessage(s,"You place a gem in your pack."); } else { // Create between 1 and 15 goldpieces and place directly in backpack nAmount=1+(rand()%15); addgold(nCharID,nAmount); goldsfx(s,nAmount); if (nAmount==1) sprintf(temp,"You unearthed %i gold coin.", nAmount); else sprintf(temp,"You unearthed %i gold coins.", nAmount); sysmessage(s,temp); } break; case 6: if(nFame<500) SpawnRandomMonster(s,"necro.scp","UNDEADLIST","1000"); // Low level Undead - Random else SpawnRandomMonster(s,"necro.scp","UNDEADLIST","1001"); // Med level Undead - Random sysmessage(s,"You have disturbed the rest of a vile undead creature."); break; case 8: SpawnRandomItem(s,1,"necro.scp","ITEMLIST","1000"); sysmessage(s,"You unearthed a old weapon and placed it in your pack."); break; case 10: if(nFame<1000) SpawnRandomMonster(s,"necro.scp","UNDEADLIST","1001"); // Med level Undead - Random else SpawnRandomMonster(s,"necro.scp","UNDEADLIST","1002"); // High level Undead - Random sysmessage(s,"You have disturbed the rest of a vile undead creature."); break; case 12: if(nFame>1000) SpawnRandomMonster(s,"necro.scp","UNDEADLIST","1002"); // High level Undead - Random else SpawnRandomMonster(s,"necro.scp","UNDEADLIST","1001"); // Med level Undead - Random sysmessage(s,"You have disturbed the rest of a vile undead creature."); break; default: nRandnum=rand()%2; switch(nRandnum) { case 1: nRandnum=rand()%12; switch(nRandnum) { case 0: iID=0x11; break; case 1: iID=0x12; break; case 2: iID=0x13; break; case 3: iID=0x14; break; case 4: iID=0x15; break; case 5: iID=0x16; break; case 6: iID=0x17; break; case 7: iID=0x18; break; case 8: iID=0x19; break; case 9: iID=0x1A; break; case 10: iID=0x1B; break; case 11: iID=0x1C; break; } SpawnItem(s,1,NULL,0,0x1b,iID,0x00,0x00,1,1); sysmessage(s,"You have unearthed some old bones and placed them in your pack."); break; default: // found an empty grave sysmessage(s,"This grave seems to be empty."); } } } void smeltore(int s) { int i,numore=1,serial; int smelting=0; serial=calcserial(buffer[s][7],buffer[s][8],buffer[s][9],buffer[s][10]); i=findbyserial(&itemsp[serial%256], serial, 0); if (i!=-1) { if((items[i].id1==0x0F && items[i].id2==0xB1)||(items[i].id1==0x19 && ((items[i].id2==0x7A)||(items[i].id2==0xA9)||(items[i].id2==0x7e)|| (items[i].id2==0x82)||(items[i].id2==0x86)||(items[i].id2==0x8a)|| (items[i].id2==0x8e)||(items[i].id2==0x92)||(items[i].id2==0x96)|| (items[i].id2==0x9a)||(items[i].id2==0xa6)||(items[i].id2==0xa2)|| (items[i].id2==0x9e)))) { if(iteminrange(s,i,3)) { if (!checkskill(currchar[s],MINING, 0, 1000)) { if (items[chars[currchar[s]].smeltitem].amount==1) { sysmessage(s,"Your hand slips and the last of your materials are destroyed."); deleitem(chars[currchar[s]].smeltitem); } else { sysmessage(s,"Your hand slips and some of your materials are destroyed."); items[chars[currchar[s]].smeltitem].amount=items[chars[currchar[s]].smeltitem].amount/2; } return; } sysmessage(s,"You have smelted your ore."); if ((items[chars[currchar[s]].smeltitem].color1)==0x00 && (items[chars[currchar[s]].smeltitem].color2==0x00)) { numore=items[chars[currchar[s]].smeltitem].amount*2; SpawnItem(s,numore,"Iron Ingot",1,0x1b,0xf2, 0, 0,1,1); sysmessage(s,"You place some Iron Ingots in your pack."); } else if ((items[chars[currchar[s]].smeltitem].color1)==0x09 && (items[chars[currchar[s]].smeltitem].color2==0x6d)) { numore=items[chars[currchar[s]].smeltitem].amount; SpawnItem(s,numore,"Gold Ingot",1,0x1b,0xec, 0, 0,1,1); sysmessage(s,"You place some Gold Ingots in your pack."); } else if ((items[chars[currchar[s]].smeltitem].color1)==0x00 && (items[chars[currchar[s]].smeltitem].color2==0xf3)) { numore=items[chars[currchar[s]].smeltitem].amount; SpawnItem(s,numore,"Copper Ingot",1,0x1b,0xe6, 0, 0,1,1); sysmessage(s,"You place some Copper Ingots in your pack."); } else if ((items[chars[currchar[s]].smeltitem].color1)==0x03 && (items[chars[currchar[s]].smeltitem].color2==0x8a)) { numore=items[chars[currchar[s]].smeltitem].amount; SpawnItem(s,numore,"Silver Ingot",1,0x1b,0xf8, 0, 0,1,1); sysmessage(s,"You place some Silver Ingots in your pack."); } else if ((items[chars[currchar[s]].smeltitem].color1)==0x03 && (items[chars[currchar[s]].smeltitem].color2==0x86)) { if ((items[chars[currchar[s]].smeltitem].amount)<2) { sysmessage(s,"You do not have enough adamantium ore to smelt."); return; } numore=(items[chars[currchar[s]].smeltitem].amount)/2; SpawnItem(s,numore,"Adamantium Ingot",1,0x1b,0xf8, 0x03, 0x86,1,1); sysmessage(s,"You place some Adamantium Ingots in your pack."); } else { if ((items[chars[currchar[s]].smeltitem].amount)<4) { sysmessage(s,"You do not have enough Mythril ore to smelt."); return; } numore=(items[chars[currchar[s]].smeltitem].amount)/4; SpawnItem(s,numore,"Mythril Ingot",1,0x1b,0xf8, 0x01, 0x91,1,1); sysmessage(s,"You place some Mythril Ingots in your pack."); } deleitem(chars[currchar[s]].smeltitem); smelting=1; } } } chars[currchar[s]].smeltitem=-1; if(!smelting) sysmessage(s,"You cant smelt here."); // chars[currchar[s]].weight=calcweight(currchar[s]); // statwindow(s,currchar[s]); } void wheel(int s, int mat) { unsigned int m; int i,serial; int tailme=0; serial=calcserial(buffer[s][7],buffer[s][8],buffer[s][9],buffer[s][10]); i=findbyserial(&itemsp[serial%256], serial, 0); if (i!=-1) { if((items[i].id1==0x10 && items[i].id2==0xA4)|| (items[i].id1==0x10 && ((items[i].id2>=0xA5)||(items[i].id2<=0xA6)))) { if(iteminrange(s,i,3)) { if (!checkskill(currchar[s],TAILORING, 0, 1000)) { sysmessage(s,"You failed to spin your material."); return; } sysmessage(s,"You have successfully spun your material."); if (mat==YARN) { sprintf(items[chars[currchar[s]].tailitem].name,"#"); items[chars[currchar[s]].tailitem].id1=0x0E; items[chars[currchar[s]].tailitem].id2=0x1D; items[chars[currchar[s]].tailitem].amount=items[chars[currchar[s]].tailitem].amount*4; } else if (mat==THREAD) { sprintf(items[chars[currchar[s]].tailitem].name,"#"); items[chars[currchar[s]].tailitem].id1=0x0F; items[chars[currchar[s]].tailitem].id2=0xA0; items[chars[currchar[s]].tailitem].amount=items[chars[currchar[s]].tailitem].amount*4; } for (m=0;m=0x60)||(items[i].id2<=0x61)))) { if(iteminrange(s,i,3)) { if (!checkskill(currchar[s],TAILORING, 0, 1000)) { sysmessage(s,"You failed to make cloth."); return; } sysmessage(s,"You have made your cloth."); sprintf(items[chars[currchar[s]].tailitem].name,"#"); items[chars[currchar[s]].tailitem].id1=0x17; items[chars[currchar[s]].tailitem].id2=0x5D; items[chars[currchar[s]].tailitem].priv=items[chars[currchar[s]].tailitem].priv|0x01; items[chars[currchar[s]].tailitem].amount=items[chars[currchar[s]].tailitem].amount*2; for (m=0;m=0xE3 && items[i].id2<=0xE9)|| (items[i].id1==0x0F && items[i].id2==0xAC)|| (items[i].id1==0x0F && items[i].id2==0xB1))|| (items[i].id1==0x19 && (items[i].id2>=0x7A && items[i].id2<=0xB6))|| (items[i].id1==0x04 && (items[i].id2>=0x61 && items[i].id2<=0x80))|| (items[i].id1==0x0E && (items[i].id2>=0x31 && items[i].id2<=0x33))|| (items[i].id1==0x19 && items[i].id2==0xBB)|| (items[i].id1==0x1F && items[i].id2==0x2B)||(items[i].id1==0x09 && (items[i].id2>=0x2B && items[i].id2<=0x34)||(items[i].id2>=0x37 && items[i].id2<=0x42)||(items[i].id2>=0x45 && items[i].id2<=0x50)|| (items[i].id2>=0x53 && items[i].id2<=0x5E)||(items[i].id2>=0x61 && items[i].id2<=0x6C))) { if(iteminrange(s,i,3)) { if (!checkskill(currchar[s],COOKING, 0, 1000)) { sysmessage(s,"You failed to cook the meat and drop some into the ashes."); items[chars[currchar[s]].tailitem].amount -= 1+(rand() % (items[chars[currchar[s]].tailitem].amount)); if (items[chars[currchar[s]].tailitem].amount <=0) deleitem(chars[currchar[s]].tailitem); else {for (m=0;m