Exemple #1
0
void freakdoor(int in,int cn)
{
	int me,you,in2;

	if (!cn) return;
	
	// avoid endless recursion
	if (it[in].drdata[9]) return;

	me=it[in].drdata[8];
	if (it[in].drdata[14]) me=0;	// one-way freaks
	
	if (me) {
		you=*(unsigned int*)(it[in].drdata+10);
	
		if (!you) {
			for (in2=1; in2<MAXITEM; in2++) {
				if (!it[in2].flags) continue;
				if (it[in2].driver!=IDR_FREAKDOOR) continue;
				if (in2==in) continue;
				if (it[in2].drdata[15]) continue;	// no-target freak
				if (it[in2].drdata[8]==me) break;
			}
			if (in2==MAXITEM) {
				elog("PANIC: freakdoor %d at %d,%d: partner not found",me,it[in].x,it[in].y);
				return;
			}
			you=*(unsigned int*)(it[in].drdata+10)=in2;
		}
	} else you=in;

	//log_char(cn,LOG_SYSTEM,0,"Door %d (%d/%d)",me,in,you);

	if (it[in].x!=ch[cn].x || it[in].y!=ch[cn].y) {
		item_driver(IDR_DOOR,in,cn);
		// open the other door if it is closed and our door was opened
		if (you!=in && it[in].drdata[0] && !it[you].drdata[0]) item_driver(IDR_DOOR,you,cn);
	} else if (in!=you) {
		int dx,dy,px,py;

		// open the other door if it is still closed
		if (!it[you].drdata[0]) item_driver(IDR_DOOR,you,cn);

		if (player_driver_get_move(cn,&px,&py)) {
			dx=px-ch[cn].x;
			dy=py-ch[cn].y;
		} else dx=dy=0;

		it[you].drdata[9]=1;	// set flag: no 2nd jump
		teleport_char_driver(cn,it[you].x,it[you].y);
		it[you].drdata[9]=0;

		if (dx || dy) {
			player_driver_fake_move(cn,ch[cn].x+dx,ch[cn].y+dy);
		}
	}
}
Exemple #2
0
void backtofire(int in,int cn)
{
	if (!cn) return;
	if (!it[in].carried) return;	// can only use if item is carried
	
	if (teleport_char_driver(cn,it[in].drdata[0],it[in].drdata[1])) {
		if (ch[cn].flags&CF_PLAYER) dlog(cn,in,"dropped because it was used");
		remove_item_char(in);
		destroy_item(in);
		log_char(cn,LOG_SYSTEM,0,"The scroll vanished.");
	}
}
void keyholder_door(int in,int cn)
{
	int x,y,n,in2,flag,co,nr;
	char buf[80];

	if (!cn) return;

	nr=it[in].drdata[0];

	for (n=0; n<9; n++) {
		flag=0;
		for (x=2+(n%3)*8; x<9+(n%3)*8; x++) {
			for (y=231+(n/3)*8; y<238+(n/3)*8; y++) {
				if ((in2=map[x+y*MAXMAP].it) && (it[in2].flags&IF_TAKE)) { flag=1; break; }
				if (map[x+y*MAXMAP].ch) { flag=1; break; }
			}
		}
		if (!flag) break;
	}	
	if (flag) {
		log_char(cn,LOG_SYSTEM,0,"You hear fighting noises from behind the door. It won't open while the fight lasts.");
		return;
	}
        if (!(in2=ch[cn].citem) || it[in2].driver!=IDR_ENHANCE || it[in2].drdata[0]!=2 || *(unsigned int*)(it[in2].drdata+1)!=2000) {
		log_char(cn,LOG_SYSTEM,0,"You'll need to use 2000 gold units as a key to open the door.");
		return;
	}
	if (!teleport_char_driver(cn,2+(n%3)*8+1,231+(n/3)*8+3)) {
		log_char(cn,LOG_SYSTEM,0,"You hear fighting noises from behind the door. It won't open while the fight lasts.");
		return;
	}
	destroy_item(in2);
	ch[cn].citem=0;
	ch[cn].flags|=CF_ITEMS;

	sprintf(buf,"keyholder_golem%d",nr);
	co=create_char(buf,0);
	if (co) {
		update_char(co);
		ch[co].hp=ch[co].value[0][V_HP]*POWERSCALE;
		ch[co].endurance=ch[co].value[0][V_ENDURANCE]*POWERSCALE;
		ch[co].mana=ch[co].value[0][V_MANA]*POWERSCALE;
		ch[co].dir=DX_LEFTUP;
		ch[co].tmpx=2+(n%3)*8+5;
		ch[co].tmpy=231+(n/3)*8+3;

		drop_char(co,2+(n%3)*8+5,231+(n/3)*8+3,1);
	}
}
Exemple #4
0
void warpteleport_driver(int in,int cn)
{
    int in2,target,n,flag=0;

    if (!cn) return;

    if (!it[in].drdata[0]) {
        switch(it[in].drdata[1]) {
        case 1:
            flag=teleport_char_driver(cn,242,252);
            break;
        case 2:
            flag=teleport_char_driver(cn,247,66);
            break;
        case 3:
            flag=teleport_char_driver(cn,251,16);
            break;
        case 4:
            flag=teleport_char_driver(cn,152,7);
            break;
        case 5:
            flag=teleport_char_driver(cn,183,250);
            break;

        default:
            log_char(cn,LOG_SYSTEM,0,"You found BUG #31as5.");
        }
        if (!flag) log_char(cn,LOG_SYSTEM,0,"Target is busy, please try again soon.");
        return;
    }

    if (!(in2=ch[cn].citem) || it[in2].ID!=IID_AREA25_TELEKEY) {
        log_char(cn,LOG_SYSTEM,0,"Nothing happened.");
        return;
    }

    target=(it[in].drdata[0]-1)*5+(it[in2].drdata[0]-1);

    //log_char(cn,LOG_SYSTEM,0,"target=%d",target);
    if (teleport_char_driver(cn,tl[target].x,tl[target].y)) {
        ch[cn].citem=0;
        ch[cn].flags|=CF_ITEMS;
        destroy_item(in2);
        flag++;

        for (n=0; n<INVENTORYSIZE; n++) {
            if ((in2=ch[cn].item[n]) && it[in2].ID==IID_AREA25_TELEKEY) {
                remove_item_char(in2);
                destroy_item(in2);
                flag++;
            }
        }
        if (flag) log_char(cn,LOG_SYSTEM,0,"Your sphere%s vanished.",flag>0 ? "s" : "");
    }
}
Exemple #5
0
int warpkeydoor_driver(int in,int cn)
{
    int in2,dx,dy;

    if (!cn) return 1;

    dx=it[in].x-ch[cn].x;
    dy=it[in].y-ch[cn].y;
    if (!dx && !dy) {
        log_char(cn,LOG_SYSTEM,0,"Bug #329i, sorry.");
        return 2;
    }

    in2=has_item(cn,IID_AREA25_DOORKEY);

    if (!in2) {
        log_char(cn,LOG_SYSTEM,0,"The door is locked and you do not have the right key.");
        return 2;
    }

    if (teleport_char_driver(cn,it[in].x+dx,it[in].y+dy)) {
        log_char(cn,LOG_SYSTEM,0,"A %s vanished.",it[in2].name);
        remove_item_char(in2);
        destroy_item(in2);
        switch(ch[cn].dir) {
        case DX_RIGHT:
            ch[cn].dir=DX_LEFT;
            break;
        case DX_LEFT:
            ch[cn].dir=DX_RIGHT;
            break;
        case DX_UP:
            ch[cn].dir=DX_DOWN;
            break;
        case DX_DOWN:
            ch[cn].dir=DX_UP;
            break;
        }
        return 1;
    } else {
        log_char(cn,LOG_SYSTEM,0,"Oops. Please try again.");
        return 2;
    }
}
Exemple #6
0
void warpfighter_died(int cn,int co)
{
    struct warpfighter_data *dat;

    dat=set_data(cn,DRD_WARPFIGHTER,sizeof(struct warpfighter_data));
    if (!dat) return;	// oops...

    if (dat->co!=co) {
        xlog("1");
        return;
    }
    if (!ch[co].flags || ch[co].serial!=dat->cser || ch[co].x<dat->xs || ch[co].y<dat->ys || ch[co].x>dat->xe || ch[co].y>dat->ye) {
        xlog("2");
        return;
    }

    teleport_char_driver(co,dat->tx,dat->ty);
    //xlog("3 %d %d",dat->tx,dat->ty);
}
Exemple #7
0
void edemontube_driver(int in,int cn)
{
	int nr,in2,x,y,n,co,next,light,sprite;

	nr=it[in].drdata[0];

	if (cn) {	// character using it
		teleport_char_driver(cn,*(unsigned short*)(it[in].drdata+2),*(unsigned short*)(it[in].drdata+4));
	} else {	// timer call
		if (sect[nr] && sect[nr]<249) {
			light=200;
			sprite=14138;
		} else {
			light=0;
			sprite=14137;
		}
	
		if (it[in].sprite!=sprite) {
			it[in].sprite=sprite;
			set_sector(it[in].x,it[in].y);
		}
	
		if (it[in].mod_value[0]!=light) {
			remove_item_light(in);
			it[in].mod_value[0]=light;
			add_item_light(in);
		}



		if (!(*(unsigned short*)(it[in].drdata+2))) {
			for (in2=1; in2<MAXITEM; in2++) {
				if (it[in2].driver==IDR_EDEMONLOADER && it[in2].drdata[0]==nr) {
					
					// find teleport target (up or down of item)
					x=it[in2].x; y=it[in2].y;					
					if (!(map[x+y*MAXMAP+MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK))) y++;
					else if (!(map[x+y*MAXMAP-MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK))) y--;

					// remember target
					*(unsigned short*)(it[in].drdata+2)=x;
					*(unsigned short*)(it[in].drdata+4)=y;

					//xlog("%s (%d) found %s (%d) at %d,%d",it[in].name,in,it[in2].name,in2,it[in2].x,it[in2].y);
				}
			}
		}
		if (sect[nr]>250) {
			for (n=0; n<25;  n++) {
				for (co=getfirst_char_sector(it[in].x+offx[n],it[in].y+offy[n]); co; co=next) {
					
					next=ch[co].sec_next;

					if (!(ch[co].flags&CF_PLAYER)) continue;

					if (abs(ch[co].x-it[in].x)>10 || abs(ch[co].y-it[in].y)>10) continue;

					if (char_see_item(co,in)) {
						teleport_char_driver(co,*(unsigned short*)(it[in].drdata+2),*(unsigned short*)(it[in].drdata+4));
						log_char(co,LOG_SYSTEM,0,"The strange tube teleported you.");
					}
				}
			}
		}
		call_item(it[in].driver,in,0,ticker+TICKS);
	}
}
void minedoor(int in,int cn)
{
	int in2,nr,ret;

        // gather information about door system
	if (!door_init) {
		for (in2=1; in2<MAXITEM; in2++) {
			if (!it[in2].flags) continue;
			if (it[in2].driver!=IDR_MINEDOOR) continue;

			nr=it[in2].drdata[0];
			//xlog("found something at %d,%d",it[in2].x,it[in2].y);

			if (!it[in2].drdata[1]) {	// source door
				if (it[in2].drdata[3]) {	// usable source door
					if (sdoor[nr]) xlog("confused: two source doors");
                                        sdoor[nr]=in2;
					//xlog("source %d is at %d,%d",it[in2].drdata[0],it[in2].x,it[in2].y);
				}
			} else {	// target door
				if (tdoor[nr]) xlog("confused: two target doors");
				tdoor[nr]=in2;
				//xlog("target %d is at %d,%d",it[in2].drdata[0],it[in2].x,it[in2].y);
			}
		}
		door_init=1;
	}

	nr=it[in].drdata[0];
	
	if (!cn) {	// timer call
		call_item(it[in].driver,in,0,ticker+TICKS*30);

		if (it[in].drdata[3]) return;	// we're already open, dont do anything

		// dont change it when the surrounding walls have been dug away
		if (!(map[it[in].x+it[in].y*MAXMAP+1].flags&(MF_SIGHTBLOCK|MF_TSIGHTBLOCK)) ||
		    !(map[it[in].x+it[in].y*MAXMAP-1].flags&(MF_SIGHTBLOCK|MF_TSIGHTBLOCK)) ||
		    !(map[it[in].x+it[in].y*MAXMAP+MAXMAP].flags&(MF_SIGHTBLOCK|MF_TSIGHTBLOCK)) ||
		    !(map[it[in].x+it[in].y*MAXMAP-MAXMAP].flags&(MF_SIGHTBLOCK|MF_TSIGHTBLOCK)) ||
		    !(map[it[in].x+it[in].y*MAXMAP+1+MAXMAP].flags&(MF_SIGHTBLOCK|MF_TSIGHTBLOCK)) ||
		    !(map[it[in].x+it[in].y*MAXMAP+1-MAXMAP].flags&(MF_SIGHTBLOCK|MF_TSIGHTBLOCK)) ||
		    !(map[it[in].x+it[in].y*MAXMAP-1+MAXMAP].flags&(MF_SIGHTBLOCK|MF_TSIGHTBLOCK)) ||
		    !(map[it[in].x+it[in].y*MAXMAP-1-MAXMAP].flags&(MF_SIGHTBLOCK|MF_TSIGHTBLOCK))) {
			//xlog("dug out 1");
                        return;
		}
                if ((in2=sdoor[nr])) {	// there is a source door already, close it
			if (!(map[it[in2].x+it[in2].y*MAXMAP+1].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) ||
			    !(map[it[in2].x+it[in2].y*MAXMAP-1].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) ||
			    !(map[it[in2].x+it[in2].y*MAXMAP+MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) ||
			    !(map[it[in2].x+it[in2].y*MAXMAP-MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) ||
			    !(map[it[in2].x+it[in2].y*MAXMAP+1+MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) ||
			    !(map[it[in2].x+it[in2].y*MAXMAP+1-MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) ||
			    !(map[it[in2].x+it[in2].y*MAXMAP-1+MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) ||
			    !(map[it[in2].x+it[in2].y*MAXMAP-1-MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK))) {
				//xlog("dug out 2");
				return;
			}
			if (RANDOM(20)) return;	// some randomness

			it[in2].sprite=15000;
			it[in2].flags&=~IF_USE;
			it[in2].drdata[3]=0;
			set_sector(it[in2].x,it[in2].y);
			//xlog("closed source door %d at %d,%d",nr,it[in2].x,it[in2].y);
		}

		switch(it[in].drdata[2]) {
			case DX_UP:
			case DX_DOWN:	it[in].sprite=20124; break;
			case DX_RIGHT:
			case DX_LEFT:	it[in].sprite=20122; break;
		}
		it[in].flags|=IF_USE;
		it[in].drdata[3]=1;
		set_sector(it[in].x,it[in].y);
		sdoor[nr]=in;
		//xlog("opened source door %d at %d,%d",nr,it[in].x,it[in].y);

		return;
	}
	
	// find target
	if (it[in].drdata[1]) in2=sdoor[nr];
	else in2=tdoor[nr];

	// teleport character to target
	ret=0;
	switch(it[in2].drdata[2]) {
		case DX_UP:	ret=teleport_char_driver(cn,it[in2].x,it[in2].y-1); break;
		case DX_DOWN:	ret=teleport_char_driver(cn,it[in2].x,it[in2].y+1); break;
		case DX_RIGHT:	ret=teleport_char_driver(cn,it[in2].x-1,it[in2].y); break;
		case DX_LEFT:	ret=teleport_char_driver(cn,it[in2].x+1,it[in2].y); break;
	}
	if (!ret) {
		log_char(cn,LOG_SYSTEM,0,"The mine has collapsed behind this door. Some friendly spirit grabs you and teleports you somewhere else.");
		if (areaID!=31) teleport_char_driver(cn,230,240);
		else teleport_char_driver(cn,211,231);
	}
}
Exemple #9
0
int warptrialdoor_driver(int in,int cn)
{
    int xs,ys,xe,ye,x,y,m,in2,dx,dy,dir,co;
    struct warpfighter_data *dat;
    struct warped_ppd *ppd;

    ppd=set_data(cn,DRD_WARP_PPD,sizeof(struct warped_ppd));
    if (!ppd) return 2;	// oops...
    if (!ppd->base) ppd->base=40;

    if (!it[in].drdata[2]) {
        xs=xe=ys=ye=in2=0;

        for (x=it[in].x+1,y=it[in].y; x<it[in].x+15; x++) {
            if (map[x+y*MAXMAP].it && it[map[x+y*MAXMAP].it].driver==IDR_WARPTRIALDOOR) {
                in2=map[x+y*MAXMAP].it;
                xs=it[in].x;
                xe=it[in2].x;

                for (x=it[in].x+1,y=it[in].y; y<it[in].y+15; y++) {
                    if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) {
                        ye=y;
                        break;
                    }
                }
                for (x=it[in].x+1,y=it[in].y; y>it[in].y-15; y--) {
                    if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) {
                        ys=y;
                        break;
                    }
                }
                break;
            }
            if (map[x+y*MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) break;
        }

        if (!in2) {
            for (x=it[in].x-1,y=it[in].y; x>it[in].x-15; x--) {
                if (map[x+y*MAXMAP].it && it[map[x+y*MAXMAP].it].driver==IDR_WARPTRIALDOOR) {
                    in2=map[x+y*MAXMAP].it;
                    xe=it[in].x;
                    xs=it[in2].x;

                    for (x=it[in].x-1,y=it[in].y; y<it[in].y+15; y++) {
                        if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) {
                            ye=y;
                            break;
                        }
                    }
                    for (x=it[in].x-1,y=it[in].y; y>it[in].y-15; y--) {
                        if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) {
                            ys=y;
                            break;
                        }
                    }
                    break;
                }
                if (map[x+y*MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) break;
            }
        }

        if (!in2) {
            for (x=it[in].x,y=it[in].y+1; y<it[in].y+15; y++) {
                if (map[x+y*MAXMAP].it && it[map[x+y*MAXMAP].it].driver==IDR_WARPTRIALDOOR) {
                    in2=map[x+y*MAXMAP].it;
                    ys=it[in].y;
                    ye=it[in2].y;

                    for (x=it[in].x,y=it[in].y+1; x<it[in].x+15; x++) {
                        if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) {
                            xe=x;
                            break;
                        }
                    }
                    for (x=it[in].x,y=it[in].y+1; x>it[in].x-15; x--) {
                        if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) {
                            xs=x;
                            break;
                        }
                    }
                    break;
                }
                if (map[x+y*MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) break;
            }
        }

        if (!in2) {
            for (x=it[in].x,y=it[in].y-1; y>it[in].y-15; y--) {
                if (map[x+y*MAXMAP].it && it[map[x+y*MAXMAP].it].driver==IDR_WARPTRIALDOOR) {
                    in2=map[x+y*MAXMAP].it;
                    ye=it[in].y;
                    ys=it[in2].y;

                    for (x=it[in].x,y=it[in].y-1; x<it[in].x+15; x++) {
                        if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) {
                            xe=x;
                            break;
                        }
                    }
                    for (x=it[in].x,y=it[in].y-1; x>it[in].x-15; x--) {
                        if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) {
                            xs=x;
                            break;
                        }
                    }
                    break;
                }
                if (map[x+y*MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) break;
            }
        }

        //xlog("xs=%d, ys=%d, xe=%d, ye=%d, in=%d, in2=%d",xs,ys,xe,ye,in,in2);

        it[in].drdata[2]=xs;
        it[in].drdata[3]=ys;
        it[in].drdata[4]=xe;
        it[in].drdata[5]=ye;
        *(unsigned short*)(it[in].drdata+6)=in2;
    }

    if (!cn) return 2;

    xs=it[in].drdata[2];
    ys=it[in].drdata[3];
    xe=it[in].drdata[4];
    ye=it[in].drdata[5];
    in2=*(unsigned short*)(it[in].drdata+6);

    if (ch[cn].x>=xs && ch[cn].x<=xe && ch[cn].y>=ys && ch[cn].y<=ye) {
        log_char(cn,LOG_SYSTEM,0,"You cannot open the door from this side.");
        return 2;
    }

    for (y=ys+1; y<ye; y++) {
        for (x=xs+1,m=x+y*MAXMAP; x<xe; x++,m++) {
            if ((co=map[m].ch) && ch[co].driver!=CDR_SIMPLEBADDY) {
                log_char(cn,LOG_SYSTEM,0,"You hear fighting noises and the door won't open.");
                return 2;
            }
        }
    }
    co=create_char("warped_fighter",0);
    if (!co) {
        log_char(cn,LOG_SYSTEM,0,"Bug #319i, sorry.");
        return 2;
    }
    if (!drop_char(co,(xs+xe)/2,(ys+ye)/2,0)) {
        log_char(cn,LOG_SYSTEM,0,"Bug #319j, sorry.");
        destroy_char(co);
        return 2;
    }
    ch[co].tmpx=ch[co].x;
    ch[co].tmpy=ch[co].y;

    warped_raise(co,ppd->base);

    update_char(co);

    ch[co].hp=ch[co].value[0][V_HP]*POWERSCALE;
    ch[co].endurance=ch[co].value[0][V_ENDURANCE]*POWERSCALE;
    ch[co].mana=ch[co].value[0][V_MANA]*POWERSCALE;
    ch[co].lifeshield=ch[co].value[0][V_MAGICSHIELD]*POWERSCALE;

    ch[co].dir=DX_RIGHTDOWN;

    dat=set_data(co,DRD_WARPFIGHTER,sizeof(struct warpfighter_data));
    if (!dat) {
        log_char(cn,LOG_SYSTEM,0,"Bug #319k, sorry.");
        remove_char(co);
        destroy_char(co);
        return 2;
    }
    dir=offset2dx(it[in].x,it[in].y,it[in2].x,it[in2].y);
    if (!dir) {
        log_char(cn,LOG_SYSTEM,0,"Bug #319l, sorry.");
        remove_char(co);
        destroy_char(co);
        return 2;
    }
    dx2offset(dir,&dx,&dy,NULL);

    dat->co=cn;
    dat->cser=ch[cn].serial;
    dat->tx=it[in2].x+dx;
    dat->ty=it[in2].y+dy;
    dat->xs=xs;
    dat->xe=xe;
    dat->ys=ys;
    dat->ye=ye;

    teleport_char_driver(cn,it[in].x+dx,it[in].y+dy);

    return 1;
}
Exemple #10
0
void lab5_item(int in, int cn)
{
        struct lab5_player_data *pd;
        char *drdata,dx,dy;
        int in2;

        drdata=it[in].drdata;

        if (!numchestboxes) count_chestboxes();

        if (!cn) {

                // fireface
                if (drdata[0]==2) {
                        if (it[in].sprite==11135) { dx=1; dy=0; }
                        else if (it[in].sprite==11136) { dx=0; dy=-1; }
                        else if (it[in].sprite==11137) { dx=-1; dy=0; }
                        else /*if (it[in].sprite==11138)*/ { dx=0; dy=1; }
                        create_fireball(0,it[in].x+dx,it[in].y+dy,it[in].x+dx+dx,it[in].y+dy+dy,50);

                        if (drdata[1]==0) {
                                drdata[1]=1;
                                call_item(it[in].driver,in,0,ticker+(((it[in].x+it[in].y)%17)+1)*TICKS);
                        }
                        else call_item(it[in].driver,in,0,ticker+5*TICKS);
                }

                // lightface
                if (drdata[0]==13) {
                        if (it[in].sprite==11135) { dx=1; dy=0; }
                        else if (it[in].sprite==11136) { dx=0; dy=-1; }
                        else if (it[in].sprite==11137) { dx=-1; dy=0; }
                        else /*if (it[in].sprite==11138)*/ { dx=0; dy=1; }
                        create_ball(0,it[in].x+dx,it[in].y+dy,it[in].x+dx+dx,it[in].y+dy+dy,40);

                        if (drdata[1]==0) {
                                drdata[1]=1;
                                call_item(it[in].driver,in,0,ticker+(((it[in].x+it[in].y)%10)+1)*TICKS);
                        }
                        else if (drdata[2]==4) {
                                call_item(it[in].driver,in,0,ticker+9*TICKS);
                                drdata[2]=0;
                        }
                        else {
                                call_item(it[in].driver,in,0,ticker+7*TICKS/4);
                                drdata[2]++;
                        }
                }

                // chestbox
                if (drdata[0]==3) {
                        if (!drdata[3]) return;
                        drdata[3]=0;
                        it[in].sprite--;
                        set_sector(it[in].x,it[in].y);
                }

                // nameplate
                if (drdata[0]==5) {
                        namecoordx[(int)drdata[1]]=it[in].x;
                        namecoordy[(int)drdata[1]]=it[in].y;
                }

                // entrance
                if (drdata[0]==7) {
                        it[in].sprite=0;
                        set_sector(it[in].x,it[in].y);
                }

                // backdoor
                if (drdata[0]==8) {
                        static int bcnt=0;
                        daemondoorx[bcnt]=it[in].x;
                        daemondoory[bcnt]=it[in].y;
                        bcnt++;
                }

                // gun
                if (drdata[0]==9) {
                        if (!drdata[1]) return;
                        drdata[1]--;
                        it[in].sprite--;
                        set_sector(it[in].x,it[in].y);
                        if (drdata[1]) call_item(it[in].driver,in,0,ticker+GUNRELOAD);
                }

                // pike
                if (drdata[0]==10) {
                        if (!drdata[1]) return;
                        drdata[1]=0;
                        it[in].sprite--;
                        set_sector(it[in].x,it[in].y);
                }

        }
        else {

                // obelisk
                if (drdata[0]==1) {
                        ch[cn].hp=ch[cn].value[0][V_HP]*POWERSCALE;
                        ch[cn].mana=ch[cn].value[0][V_MANA]*POWERSCALE;
                        ch[cn].endurance=ch[cn].value[0][V_ENDURANCE]*POWERSCALE;
                        ch[cn].lifeshield=get_lifeshield_max(cn)*POWERSCALE;
                        sound_area(ch[cn].x,ch[cn].y,41);
                }

                // chestbox
                if (drdata[0]==3) {

                        char *str;

                        if (drdata[3]) return;
                        if (ch[cn].citem) return;

                        // check if it was already opened
                        if (check_chestbox(cn,in)) { log_char(cn,LOG_SYSTEM,0,"Thou canst not open the chest again."); return; }

                        // open box (and call close timer)
                        drdata[3]=1;
                        it[in].sprite++;
                        set_sector(it[in].x,it[in].y);
                        call_item(it[in].driver,in,0,ticker+2*TICKS);

                        // which item
                        switch(drdata[1]) {
                                case 1: str="lab5_combopotion"; break;
                                case 2: str="lab5_staff"; break;
                                case 3: str="lab5_dagger"; break;
                                case 4: str="lab5_sword"; break;
                                case 5: str="lab5_twohanded"; break;
                                case 6: str="lab5_manapotion"; break;
                                case 7: str="lab5_manslayer"; break;
                                default: str="oops"; break;
                        }

                        // create and give potion to player
                        in2=create_item(str);
                        log_char(cn,LOG_SYSTEM,0,"You received a %s.",it[in2].name);

                        if (!in2) { xlog("failed to create '%s' item in %s %d",str,__FILE__,__LINE__); return; }

                        ch[cn].citem=in2;
                        ch[cn].flags|=CF_ITEMS;
                        it[in2].carried=cn;
                }

                // combopotion
                if (drdata[0]==4) {
                        ch[cn].hp=ch[cn].value[0][V_HP]*POWERSCALE;
                        ch[cn].mana=ch[cn].value[0][V_MANA]*POWERSCALE;
                        ch[cn].endurance=ch[cn].value[0][V_ENDURANCE]*POWERSCALE;
                        if (ch[cn].value[1][V_MAGICSHIELD]) ch[cn].lifeshield=get_lifeshield_max(cn)*POWERSCALE;
                        log_area(ch[cn].x,ch[cn].y,LOG_INFO,cn,10,"%s drinks a potion.",ch[cn].name);
                        remove_item(in);
                        free_item(in);
                }

                // manapotion
                if (drdata[0]==12) {
                        // ch[cn].hp=ch[cn].value[0][V_HP]*POWERSCALE;
                        ch[cn].mana=ch[cn].value[0][V_MANA]*POWERSCALE;
                        // ch[cn].endurance=ch[cn].value[0][V_ENDURANCE]*POWERSCALE;
                        if (ch[cn].value[1][V_MAGICSHIELD]) ch[cn].lifeshield=get_lifeshield_max(cn)*POWERSCALE;
                        log_area(ch[cn].x,ch[cn].y,LOG_INFO,cn,10,"%s drinks a potion.",ch[cn].name);
                        remove_item(in);
                        free_item(in);
                }

                // nameplate
                if (drdata[0]==5) {

                        // get pd
                        pd=set_data(cn,DRD_LAB5_PLAYER,sizeof(struct lab5_player_data));
                        if (!pd) return;

                        if (pd->ritualstate==0) {
                                sound_area(ch[cn].x,ch[cn].y,41);
                                pd->ritualdaemon=drdata[1];
                                pd->ritualstate=1;
                                log_char(cn,LOG_SYSTEM,0,"Thou canst read the symbols now. They form the words:");
                                log_char(cn,LOG_SYSTEM,0,"°c3The Ritual of %s started.°c0",daemonname[pd->ritualdaemon]);
                        }
                        else ritual_hurt(cn,pd,it[in].x,it[in].y);

                }

                // realnameplate
                if (drdata[0]==6) {

                        // get pd
                        pd=set_data(cn,DRD_LAB5_PLAYER,sizeof(struct lab5_player_data));
                        if (!pd) return;

                        if (pd->ritualstate==0) { log_char(cn,LOG_SYSTEM,0,"Nothing happens."); return; }

                        if (pd->ritualstate==1 && pd->ritualdaemon==drdata[1]) {
                                sound_area(ch[cn].x,ch[cn].y,41);
                                pd->ritualstate=2;
                                log_char(cn,LOG_SYSTEM,0,"Thou canst read the symbols now. They form the words:");
                                log_char(cn,LOG_SYSTEM,0,"°c3The ritual of %s is the Ritual of %s.°c0",daemonname[pd->ritualdaemon],daemonreal[pd->ritualdaemon]);
                        }
                        else ritual_hurt(cn,pd,it[in].x,it[in].y);

                }

                // entrance
                if (drdata[0]==7) {

                        static int hurttrans[4]={2,3,0,1};

                        // get pd
                        pd=set_data(cn,DRD_LAB5_PLAYER,sizeof(struct lab5_player_data));
                        if (!pd) return;

                        if (pd->ritualstate==0) return;

                        if (pd->ritualstate==2 && pd->ritualdaemon==drdata[1]){
                                sound_area(ch[cn].x,ch[cn].y,41);
                                pd->ritualdaemon=drdata[1];
                                pd->ritualstate=3;
                                log_char(cn,LOG_SYSTEM,0,"Mathor tells you: \"The ritual continues. Well done so far, %s.\"",ch[cn].name);
                                // log_char(cn,LOG_SYSTEM,0,"°c3The Ritual of %s continues.°c0",daemonname[pd->ritualdaemon]);
                        }
                        else {
				if (drdata[1]==2) log_char(cn,LOG_SYSTEM,0,"Mathor tells you: \"Sorry. But a strange power forced me.\"");
                                ritual_hurt(cn,pd,namecoordx[hurttrans[(int)drdata[1]]],namecoordy[hurttrans[(int)drdata[1]]]);
                        }

                }

                // backdoor
                if (drdata[0]==8) {
                        // watch the syntax!
                        if (!teleport_char_driver(cn,namecoordx[2],namecoordy[1]))
                                if (!teleport_char_driver(cn,namecoordx[0],namecoordy[0]))
                                if (!teleport_char_driver(cn,namecoordx[1],namecoordy[1]))
                                if (!teleport_char_driver(cn,namecoordx[2],namecoordy[2]))
                                teleport_char_driver(cn,namecoordx[3],namecoordy[3]);
                }

                // gun
                if (drdata[0]==9) {
                        if (drdata[1]) { log_char(cn,LOG_SYSTEM,0,"Thou canst not push the lever."); return; }
                        drdata[1]=7;
                        it[in].sprite+=7;
                        set_sector(it[in].x,it[in].y);
                        call_item(it[in].driver,in,0,ticker+GUNRELOAD);

                        create_fireball(cn,it[in].x+2,it[in].y,it[in].x+60,it[in].y,100);
                }

                // pike
                if (drdata[0]==10) {
                        hurt(cn,5*POWERSCALE,0,1,0,0);
                        if (drdata[1]) return;
                        drdata[1]++;
                        it[in].sprite++;
                        set_sector(it[in].x,it[in].y);
                        call_item(it[in].driver,in,0,ticker+5*TICKS);
                }

                // no potion door
                if (drdata[0]==11) {
                        if (ch[cn].x<it[in].x && has_potion(cn) ) {
                                log_char(cn,LOG_SYSTEM,0,"°c3Thou canst not enter carrying a mana, healing or combo potion!°c0");
                                return;
                        }

                        if (ch[cn].x<it[in].x) teleport_char_driver(cn,it[in].x-9,it[in].y-7);
                        else teleport_char_driver(cn,it[in].x+9,it[in].y+7);
                }
        }

}
Exemple #11
0
int ritual_start(int cn, int daemon)
{
        int i,x=0,y,sx,sy,ex,ey,break2,mn,doorx,doory,co; // x=0 to avoid compiler warning!
        static int statue1[4]={11165,11123,11157,11161};
        static int statue2[4]={11167,11125,11159,11163};

        // check for free room
        for (i=0; i<MAXDOOR; i++) {

                sx=daemondoorx[i]+0;
                sy=daemondoory[i]-6;
                ex=daemondoorx[i]+14;
                ey=daemondoory[i]+6;

                for (break2=0,y=sy; !break2 && y<=ey; y++) {
                        for (x=sx; x<=ex; x++) {
                                if ((co=map[x+y*MAXMAP].ch) && (ch[co].flags&CF_PLAYER)) { break2=1; break; }
                        }
                }

                if (y==ey+1 && x==ex+1) break;
        }

        if (i==MAXDOOR) return 0;

        // cleanup
        for (y=sy; y<=ey; y++) {
                for (x=sx; x<=ex; x++) {
                        mn=x+y*MAXMAP;
                        if ((co=map[mn].ch) && !(ch[co].flags&CF_PLAYER)) remove_destroy_char(co);
                }
        }

        // create new room
        doorx=daemondoorx[i];
        doory=daemondoory[i];

        map[(doorx+2)+(doory-2)*MAXMAP].fsprite=statue1[daemon]; set_sector(doorx+2,doory-2); // set sector ?
        map[(doorx+2)+(doory+2)*MAXMAP].fsprite=statue1[daemon]; set_sector(doorx+2,doory+2);
        map[(doorx+12)+(doory-2)*MAXMAP].fsprite=statue2[daemon]; set_sector(doorx+12,doory-2);
        map[(doorx+12)+(doory+2)*MAXMAP].fsprite=statue2[daemon]; set_sector(doorx+12,doory+2);

        if (daemon==1) {
                ritual_create_char("lab5_one_servant",doorx+10,doory-2,DX_LEFT,7);
                ritual_create_char("lab5_one_servant",doorx+10,doory+2,DX_LEFT,7);
                ritual_create_char("lab5_one_master",doorx+12,doory+0,DX_LEFT,8);
        }
        else if (daemon==2) {
                ritual_create_char("lab5_two_servant",doorx+10,doory-2,DX_LEFT,7);
                ritual_create_char("lab5_two_servant",doorx+10,doory+2,DX_LEFT,7);
                ritual_create_char("lab5_two_master",doorx+12,doory+0,DX_LEFT,8);
        }
        else if (daemon==3) {
                ritual_create_char("lab5_three_servant_mage",doorx+6,doory-4,DX_DOWN,7);
                ritual_create_char("lab5_three_servant_mage",doorx+6,doory+4,DX_UP,7);
                ritual_create_char("lab5_three_servant",doorx+12,doory+1,DX_LEFT,8);
                ritual_create_char("lab5_three_master",doorx+12,doory-1,DX_LEFT,8);
        }

        // insert character
        if (teleport_char_driver(cn,doorx+1,doory)) return 1;
        return 0;
}
void teufel_death(int cn,int cc)
{
	struct teufel_pk_data *dat;
	int n;
	int kill_n=-1,dam=0,killer=-1;

	dat=set_data(cn,DRD_TEUFELPK,sizeof(struct teufel_pk_data));
	if (!dat) return;	// oops...


	for (n=0; n<MAXTEUFEL; n++) {
		if (dat->cc[n]) {
			xlog("killed by %s, damage %.2f",dat->name[n],dat->dam[n]/1000.0f);
			if (dat->dam[n]>dam) {
				dam=dat->dam[n];
				kill_n=n;
				killer=dat->cc[n];
			}
		}
	}

	if (kill_n==-1 || killer==-1) {
		elog("no one got the kill?");
	} else {
	
		db_new_pvp();
	
		for (n=0; n<MAXTEUFEL; n++) {
			if (dat->cc[n]) {
                                if (n==kill_n) {
					db_add_pvp(dat->name[n],ch[cn].name,"kill",dat->dam[n]);
					secure_log(dat->cc[n],cn,"a kill");
				} else if (dat->cc[n]==cc) {
					db_add_pvp(dat->name[n],ch[cn].name,"final",dat->dam[n]);
					secure_log(dat->cc[n],cn,"a final blow");
				} else {
					db_add_pvp(dat->name[n],ch[cn].name,"assist",dat->dam[n]);
					secure_log(dat->cc[n],cn,"an assist");
				}
			}
		}
		winner_gets_item(killer,cn);
	}
	
	del_data(cn,DRD_TEUFELPK);

	if (ch[cn].x>=120 && ch[cn].x<=254 && ch[cn].y>=139 && ch[cn].y<=228) {
		if (teleport_char_driver(cn,225,249)) ;
		else if (teleport_char_driver(cn,221,248)) ;
		else if (teleport_char_driver(cn,227,245)) ;
		else if (teleport_char_driver(cn,219,241)) ;
		else teleport_char_driver(cn,216,237);
	} else { // error fallback
		if (teleport_char_driver(cn,250,250)) ;
		else if (teleport_char_driver(cn,247,250)) ;
		else if (teleport_char_driver(cn,250,247)) ;
		else if (teleport_char_driver(cn,247,247)) ;
		else teleport_char_driver(cn,245,247);
	}

	ch[cn].hp=10*POWERSCALE;
}