Page 1 of 1

Custom Unit Problem

Posted: Wed Nov 12, 2008 10:50 pm
by Blade
Alright, I've got two problems/questions.

The first: I've made a new unit, sort've a "heavy" jettrooper, and named in "imp_inf_impjettrooper." I made it a .req and added it to the side's .req file, and then added it to the ReadDataFile and SetupTeams portions of my .lua (I also made it a custom weapon, which I named imp_inf_weap_heavy_rifle. I don't know if it needs a .req or not, this could be my problem)

Anyway, I munged and didn't get any errors or anything, but the unit doesn't show in the units' list.

TT4c_con.lua
Hidden/Spoiler:
[code]-- load the gametype script
ScriptCB_DoFile("ObjectiveConquest")
ScriptCB_DoFile("setup_teams")

-- REP Attacking (attacker is always #1)
REP = 1;
IMP = 2;
-- These variables do not change
ATT = REP;
DEF = IMP;


function ScriptPostLoad()


--This defines the CPs. These need to happen first
cp1 = CommandPost:New{name = "cp1"}
cp2 = CommandPost:New{name = "cp2"}
cp3 = CommandPost:New{name = "cp3"}



--This sets up the actual objective. This needs to happen after cp's are defined
conquest = ObjectiveConquest:New{teamATT = ATT, teamDEF = DEF,
textATT = "game.modes.con",
textDEF = "game.modes.con2",
multiplayerRules = true}

--This adds the CPs to the objective. This needs to happen after the objective is set up
conquest:AddCommandPost(cp1)
conquest:AddCommandPost(cp2)
conquest:AddCommandPost(cp3)

conquest:Start()

EnableSPHeroRules()

end


---------------------------------------------------------------------------
-- FUNCTION: ScriptInit
-- PURPOSE: This function is only run once
-- INPUT:
-- OUTPUT:
-- NOTES: The name, 'ScriptInit' is a chosen convention, and each
-- mission script must contain a version of this function, as
-- it is called from C to start the mission.
---------------------------------------------------------------------------
function ScriptInit()

ReadDataFile("ingame.lvl")


SetMaxFlyHeight(30)
SetMaxPlayerFlyHeight (30)

SetMemoryPoolSize ("ClothData",20)
SetMemoryPoolSize ("Combo",50) -- should be ~ 2x number of jedi classes
SetMemoryPoolSize ("Combo::State",650) -- should be ~12x #Combo
SetMemoryPoolSize ("Combo::Transition",650) -- should be a bit bigger than #Combo::State
SetMemoryPoolSize ("Combo::Condition",650) -- should be a bit bigger than #Combo::State
SetMemoryPoolSize ("Combo::Attack",550) -- should be ~8-12x #Combo
SetMemoryPoolSize ("Combo::DamageSample",6000) -- should be ~8-12x #Combo::Attack
SetMemoryPoolSize ("Combo::Deflect",100) -- should be ~1x #combo

ReadDataFile("sound\\yav.lvl;yav1cw")

ReadDataFile("SIDE\\\\cis.lvl",
"cis_inf_marine")

ReadDataFile("dc:SIDE\\rep.lvl",
"rep_inf_ep2_rifleman",
"rep_inf_ep2_rocketeer",
"rep_inf_ep2_engineer",
"rep_inf_ep2_sniper",
"rep_inf_ep2_rocketeer_chaingun",
"rep_inf_ep2_jettrooper",
"rep_hover_fightertank",
"rep_hero_obiwan",
"rep_hover_barcspeeder")

ReadDataFile("dc:SIDE\\imp.lvl",
"imp_inf_rifleman",
"imp_inf_rocketeer",
"imp_inf_engineer",
"imp_inf_sniper",
"imp_inf_officer",
"imp_inf_impjettrooper",
"imp_hero_darthvader")


ReadDataFile("SIDE\\tur.lvl",
"tur_bldg_laser",
"tur_bldg_tower")

SetupTeams{
rep = {
team = REP,
units = 32,
reinforcements = 150,
soldier = { "rep_inf_ep2_rifleman",9, 25},
assault = { "rep_inf_ep2_rocketeer",1, 4},
engineer = { "rep_inf_ep2_engineer",1, 4},
sniper = { "rep_inf_ep2_sniper",1, 4},
officer = {"rep_inf_ep2_rocketeer_chaingun",1, 4},
special = { "rep_inf_ep2_jettrooper",1, 4},

},
imp = {
team = IMP,
units = 32,
reinforcements = 150,
soldier = { "imp_inf_rifleman",9, 25},
assault = { "imp_inf_rocketeer",1,4},
engineer = { "imp_inf_engineer",1,4},
sniper = { "imp_inf_sniper",1,4},
officer = { "imp_inf_officer",1,4},
special = { "imp_inf_impjettrooper",1,4},
},
}

SetTeamName (3, "droids")
AddUnitClass (3, "cis_inf_marine", 10,15)
SetUnitCount (3, 15)
AddAIGoal(3, "Deathmatch", 100)
SetTeamAsEnemy(ATT,3)
SetTeamAsEnemy(3,ATT)
SetTeamAsEnemy(DEF,3)
SetTeamAsEnemy(3,DEF)

SetHeroClass(IMP, "imp_hero_darthvader")
SetHeroClass(REP, "rep_hero_obiwan")


-- Level Stats
-- ClearWalkers()
AddWalkerType(0, 4) -- special -> droidekas
AddWalkerType(1, 0) -- 1x2 (1 pair of legs)
AddWalkerType(2, 0) -- 2x2 (2 pairs of legs)
AddWalkerType(3, 0) -- 3x2 (3 pairs of legs)
local weaponCnt = 1024
SetMemoryPoolSize("Aimer", 75)
SetMemoryPoolSize("AmmoCounter", weaponCnt)
SetMemoryPoolSize("BaseHint", 1024)
SetMemoryPoolSize("EnergyBar", weaponCnt)
SetMemoryPoolSize("EntityCloth", 32)
SetMemoryPoolSize("EntityFlyer", 32)
SetMemoryPoolSize("EntityHover", 32)
SetMemoryPoolSize("EntityLight", 200)
SetMemoryPoolSize("EntitySoundStream", 4)
SetMemoryPoolSize("EntitySoundStatic", 32)
SetMemoryPoolSize("MountedTurret", 32)
SetMemoryPoolSize("SoldierAnimation", 420)
SetMemoryPoolSize("Navigator", 128)
SetMemoryPoolSize("Obstacle", 1024)
SetMemoryPoolSize("PathNode", 1024)
SetMemoryPoolSize("SoundSpaceRegion", 64)
SetMemoryPoolSize("TreeGridStack", 1024)
SetMemoryPoolSize("UnitAgent", 128)
SetMemoryPoolSize("UnitController", 128)
SetMemoryPoolSize("Weapon", weaponCnt)

SetSpawnDelay(10.0, 0.25)
--ReadDataFile("dc:TT4\\TT4.lvl", "TT4_conquest")
ReadDataFile("dc:TT4\\TT4.lvl", "TT4_conquest")
SetDenseEnvironment("false")




-- Sound

SetSoundEffect("ScopeDisplayZoomIn", "binocularzoomin")
SetSoundEffect("ScopeDisplayZoomOut", "binocularzoomout")

voiceSlow = OpenAudioStream("sound\\global.lvl", "rep_unit_vo_slow")
AudioStreamAppendSegments("sound\\global.lvl", "cis_unit_vo_slow", voiceSlow)
AudioStreamAppendSegments("sound\\global.lvl", "global_vo_slow", voiceSlow)

voiceQuick = OpenAudioStream("sound\\global.lvl", "rep_unit_vo_quick")
AudioStreamAppendSegments("sound\\global.lvl", "cis_unit_vo_quick", voiceQuick)

OpenAudioStream("sound\\global.lvl", "cw_music")
-- OpenAudioStream("sound\\global.lvl", "global_vo_quick")
-- OpenAudioStream("sound\\global.lvl", "global_vo_slow")
OpenAudioStream("sound\\yav.lvl", "yav1")
OpenAudioStream("sound\\yav.lvl", "yav1")
OpenAudioStream("sound\\yav.lvl", "yav1_emt")

SetBleedingVoiceOver(REP, REP, "rep_off_com_report_us_overwhelmed", 1)
SetBleedingVoiceOver(REP, CIS, "rep_off_com_report_enemy_losing", 1)
SetBleedingVoiceOver(CIS, REP, "cis_off_com_report_enemy_losing", 1)
SetBleedingVoiceOver(CIS, CIS, "cis_off_com_report_us_overwhelmed", 1)

SetOutOfBoundsVoiceOver(2, "cisleaving")
SetOutOfBoundsVoiceOver(1, "repleaving")

SetAmbientMusic(REP, 1.0, "rep_yav_amb_start", 0,1)
SetAmbientMusic(REP, 0.8, "rep_yav_amb_middle", 1,1)
SetAmbientMusic(REP, 0.2, "rep_yav_amb_end", 2,1)
SetAmbientMusic(CIS, 1.0, "cis_yav_amb_start", 0,1)
SetAmbientMusic(CIS, 0.8, "cis_yav_amb_middle", 1,1)
SetAmbientMusic(CIS, 0.2, "cis_yav_amb_end", 2,1)

SetVictoryMusic(REP, "rep_yav_amb_victory")
SetDefeatMusic (REP, "rep_yav_amb_defeat")
SetVictoryMusic(CIS, "cis_yav_amb_victory")
SetDefeatMusic (CIS, "cis_yav_amb_defeat")

SetSoundEffect("ScopeDisplayZoomIn", "binocularzoomin")
SetSoundEffect("ScopeDisplayZoomOut", "binocularzoomout")
--SetSoundEffect("BirdScatter", "birdsFlySeq1")
--SetSoundEffect("WeaponUnableSelect", "com_weap_inf_weaponchange_null")
--SetSoundEffect("WeaponModeUnableSelect", "com_weap_inf_modechange_null")
SetSoundEffect("SpawnDisplayUnitChange", "shell_select_unit")
SetSoundEffect("SpawnDisplayUnitAccept", "shell_menu_enter")
SetSoundEffect("SpawnDisplaySpawnPointChange", "shell_select_change")
SetSoundEffect("SpawnDisplaySpawnPointAccept", "shell_menu_enter")
SetSoundEffect("SpawnDisplayBack", "shell_menu_exit")


--OpeningSateliteShot
AddCameraShot(0.908386, -0.209095, -0.352873, -0.081226, -45.922508, -19.114113, 77.022636);

AddCameraShot(-0.481173, 0.024248, -0.875181, -0.044103, 14.767292, -30.602322, -144.506851);
AddCameraShot(0.999914, -0.012495, -0.004416, -0.000055, 1.143253, -33.602314, -76.884430);
AddCameraShot(0.839161, 0.012048, -0.543698, 0.007806, 19.152437, -49.802273, 24.337317);
AddCameraShot(0.467324, 0.006709, -0.883972, 0.012691, 11.825212, -49.802273, -7.000720);
AddCameraShot(0.861797, 0.001786, -0.507253, 0.001051, -11.986043, -59.702248, 23.263165);
AddCameraShot(0.628546, -0.042609, -0.774831, -0.052525, 20.429928, -48.302277, 9.771714);
AddCameraShot(0.765213, -0.051873, 0.640215, 0.043400, 57.692474, -48.302277, 16.540724);
AddCameraShot(0.264032, -0.015285, -0.962782, -0.055734, -16.681797, -42.902290, 129.553268);
AddCameraShot(-0.382320, 0.022132, -0.922222, -0.053386, 20.670977, -42.902290, 135.513001);
end

[/code]
Unit .req
Hidden/Spoiler:
[code]ucft
{
REQN
{
"class"
"imp_inf_impjettrooper"
}
}
[/code]
imp.req
Hidden/Spoiler:
[code]ucft
{
REQN
{
"lvl"
"imp_droid_probe"
"imp_hero_darthvader"
"imp_hero_emperor"
"imp_hover_fightertank"
"imp_hover_speederbike"
"imp_inf_dark_trooper"
"imp_inf_dark_trooper_hunt"
"imp_inf_engineer"
"imp_inf_impjettrooper"
"imp_inf_engineer_snow"
"imp_inf_marine"
"imp_inf_officer"
"imp_inf_officer_hunt"
"imp_inf_officer_snow"
"imp_inf_officer_gray"
"imp_inf_pilot"
"imp_inf_pilot_atat"
"imp_inf_pilot_atst"
"imp_inf_pilot_tie"
"imp_inf_rifleman"
"imp_inf_rifleman_desert"
"imp_inf_rifleman_snow"
"imp_inf_rocketeer"
"imp_inf_rocketeer_snow"
"imp_inf_sniper"
"imp_inf_sniper_snow"
"imp_veh_remote_terminal"

}
}
[/code]
impshell.req (I didn't know if I was supposed to edit anything in here, but I did.
Hidden/Spoiler:
[code]ucft
{
REQN
{
"model"

"imp_inf_stormtrooper"
"imp_weap_inf_rifle"

"imp_inf_pilot"
"imp_weap_inf_pistol"

"imp_inf_shocktrooper"
"imp_weap_inf_launcher"

"imp_inf_scout"
"imp_weap_inf_sniperrifle"

"imp_inf_gunner"

"imp_inf_atatcommander"

"imp_inf_impjettrooper"
}
}
[/code]
If you want anything else, simply ask.

Re: Custom Unit Problem

Posted: Wed Nov 12, 2008 10:57 pm
by obiboba3po
you dont need impshell.req, delete it as its completley useless and takes up space in addon folder. everything you posted is fine, you mentioned you made a req for it, im assuming you made the odf. you have it as the same name as the req and have taken care of parent classes right? (itd be helpful if you posted the unit .odf) also, no weapons do not need .reqs. (its not a weapon problem until you see him holding an invisible gun followed by a crash lol)

Re: Custom Unit Problem

Posted: Wed Nov 12, 2008 11:07 pm
by Blade
Here's the unit .odf

imp_inf_impjettrooper.odf
Hidden/Spoiler:
[code]ClassParent = "rep_inf_default"

[Properties]
GeometryName = "imp_inf_impjettrooper"
GeometryLowRes = "rep_inf_ep3jettrooper_low1"
FirstPerson = "REP\reptroop;rep_1st_trooper"

MaxHealth = 500.0

// ControlSpeed = "<stance> <thrustfactor> <strafefactor> <turnfactor>"
// For grounded states (stand, crouch, prone, sprint) and jet state,
// in which the thrust/strafe stick controls the player's velocity,
// these values are multipliers on the max speed and acceleration.
// For flying states (jump, roll, tumble), in which the thrust/strafe stick
// applies an acceleration, these values only multiply the acceleration.
ControlSpeed = "stand 0.70 0.70 1.00"
ControlSpeed = "crouch 0.50 0.40 1.00"
ControlSpeed = "prone 0.30 0.20 0.50"
ControlSpeed = "sprint 1.20 0.50 0.35"
ControlSpeed = "jet 0.30 0.30 1.00"
ControlSpeed = "jump 0.03 0.03 0.35"
ControlSpeed = "roll 0.04 0.02 0.35"
ControlSpeed = "tumble 0.00 0.00 0.10"


PointsToUnlock = 0

UnitType = "trooper"

AISizeType = "HOVER"

ControlSpeed = "jet 1.50 1.25 1.25"

JetJump = "5.0" //7 //The initial jump-push given when enabling the jet
JetPush = "4.0" //The constant push given while the jet is enabled (20 is gravity)
JetAcceleration = "15.0" //Acceleration while hovering.
JetEffect = "rep_sfx_jetpack"
JetType = "hover"
JetFuelRechargeRate = "0.12" //Additional fuel per second (fuel is 0 to 1)
JetFuelCost = "0.10" //Cost per second when hovering (only used for jet-hovers)(fuel is 0 to 1)
JetFuelInitialCost = "0.9" //initial cost when jet jumping(fuel is 0 to 1)
JetFuelMinBorder = "0.30" //minimum fuel to perform a jet jump(fuel is 0 to 1)

CAMERASECTION = "STAND"

EyePointOffset = "0.0 1.8 0.0"
TrackCenter = "0.0 1.8 0.0
TrackOffset = "0.0 0.0 3.5"
TiltValue = "7.5"

//These probably need to be set
//CAMERASECTION = "STANDZOOM"
//EyePointOffset = "0.0 1.8 0.0"
//TrackCenter = "0.0 1.8 0.0
//TrackOffset = "0.4 0.05 2.8"
//TiltValue = "3.5"

CAMERASECTION = "CROUCH"

EyePointOffset = "0.0 1.3 0.0"
TrackCenter = "0.0 1.3 0.0
TrackOffset = "0.0 0.15 3.5"
TiltValue = "7.5"

//These probably need to be set
//CAMERASECTION = "CROUCHZOOM"
//EyePointOffset = "0.0 1.3 0.0"
//TrackCenter = "0.0 1.3 0.0
//TrackOffset = "0.4 0.2 2.8"
//TiltValue = "3.5"


WEAPONSECTION = 1
WeaponName = "imp_weap_inf_heavy_rifle"
WeaponAmmo = 4

WEAPONSECTION = 2
WeaponName = "rep_weap_inf_commando_pistol"
WeaponAmmo = 0

WEAPONSECTION = 3
WeaponName = "rep_weap_inf_thermaldetonator"
WeaponAmmo = 4
WeaponChannel = 1

WEAPONSECTION = 4
WeaponName = "rep_weap_award_pistol"
WeaponAmmo = 6

CollisionScale = "0.0 0.0 0.0"

EngineSound = "rep_inf_Jetpack_engine_parameterized"
TurnOnSound = "rep_weap_jetpack_turnon"
TurnOffSound = "rep_weap_jetpack_turnoff"
TurnOffTime = 0.0


VOUnitType = 121
[/code]
I hadn't thought of this at first, but could it be causing a problem that I'm using a unit from another side as the class parent? (Mind, I have the file in my sides folder, just not in myside/odf). Because I based the .odf off of the regular Republic Jet Trooper.

Re: Custom Unit Problem

Posted: Wed Nov 12, 2008 11:08 pm
by obiboba3po
Blade wrote:Here's the unit .odf
Hidden/Spoiler:
[code]ClassParent = "rep_inf_default"

[Properties]
GeometryName = "imp_inf_impjettrooper"
GeometryLowRes = "rep_inf_ep3jettrooper_low1"
FirstPerson = "REP\reptroop;rep_1st_trooper"

MaxHealth = 500.0

// ControlSpeed = "<stance> <thrustfactor> <strafefactor> <turnfactor>"
// For grounded states (stand, crouch, prone, sprint) and jet state,
// in which the thrust/strafe stick controls the player's velocity,
// these values are multipliers on the max speed and acceleration.
// For flying states (jump, roll, tumble), in which the thrust/strafe stick
// applies an acceleration, these values only multiply the acceleration.
ControlSpeed = "stand 0.70 0.70 1.00"
ControlSpeed = "crouch 0.50 0.40 1.00"
ControlSpeed = "prone 0.30 0.20 0.50"
ControlSpeed = "sprint 1.20 0.50 0.35"
ControlSpeed = "jet 0.30 0.30 1.00"
ControlSpeed = "jump 0.03 0.03 0.35"
ControlSpeed = "roll 0.04 0.02 0.35"
ControlSpeed = "tumble 0.00 0.00 0.10"


PointsToUnlock = 0

UnitType = "trooper"

AISizeType = "HOVER"

ControlSpeed = "jet 1.50 1.25 1.25"

JetJump = "5.0" //7 //The initial jump-push given when enabling the jet
JetPush = "4.0" //The constant push given while the jet is enabled (20 is gravity)
JetAcceleration = "15.0" //Acceleration while hovering.
JetEffect = "rep_sfx_jetpack"
JetType = "hover"
JetFuelRechargeRate = "0.12" //Additional fuel per second (fuel is 0 to 1)
JetFuelCost = "0.10" //Cost per second when hovering (only used for jet-hovers)(fuel is 0 to 1)
JetFuelInitialCost = "0.9" //initial cost when jet jumping(fuel is 0 to 1)
JetFuelMinBorder = "0.30" //minimum fuel to perform a jet jump(fuel is 0 to 1)

CAMERASECTION = "STAND"

EyePointOffset = "0.0 1.8 0.0"
TrackCenter = "0.0 1.8 0.0
TrackOffset = "0.0 0.0 3.5"
TiltValue = "7.5"

//These probably need to be set
//CAMERASECTION = "STANDZOOM"
//EyePointOffset = "0.0 1.8 0.0"
//TrackCenter = "0.0 1.8 0.0
//TrackOffset = "0.4 0.05 2.8"
//TiltValue = "3.5"

CAMERASECTION = "CROUCH"

EyePointOffset = "0.0 1.3 0.0"
TrackCenter = "0.0 1.3 0.0
TrackOffset = "0.0 0.15 3.5"
TiltValue = "7.5"

//These probably need to be set
//CAMERASECTION = "CROUCHZOOM"
//EyePointOffset = "0.0 1.3 0.0"
//TrackCenter = "0.0 1.3 0.0
//TrackOffset = "0.4 0.2 2.8"
//TiltValue = "3.5"


WEAPONSECTION = 1
WeaponName = "imp_weap_inf_heavy_rifle"
WeaponAmmo = 4

WEAPONSECTION = 2
WeaponName = "rep_weap_inf_commando_pistol"
WeaponAmmo = 0

WEAPONSECTION = 3
WeaponName = "rep_weap_inf_thermaldetonator"
WeaponAmmo = 4
WeaponChannel = 1

WEAPONSECTION = 4
WeaponName = "rep_weap_award_pistol"
WeaponAmmo = 6

CollisionScale = "0.0 0.0 0.0"

EngineSound = "rep_inf_Jetpack_engine_parameterized"
TurnOnSound = "rep_weap_jetpack_turnon"
TurnOffSound = "rep_weap_jetpack_turnoff"
TurnOffTime = 0.0


VOUnitType = 121
[/code]
I hadn't thought of this at first, but could it be causing a problem that I'm using a unit from another side as the class parent? (Mind, I have the file in my sides folder, just not in myside/odf). Because I based the .odf off of the regular Republic Jet Trooper.
yea i think that can cause some issues. oh i just remembered, after you copy the rep_inf_default and whatnot, do a clean of everything i noticed a munge error thats a lot of times solved by a clean.

Re: Custom Unit Problem

Posted: Wed Nov 12, 2008 11:09 pm
by Blade
I'll clean it, but remember that I didn't get any munge errors. I'll still try it, though.

Re: Custom Unit Problem

Posted: Wed Nov 12, 2008 11:15 pm
by obiboba3po
Blade wrote:I'll clean it, but remember that I didn't get any munge errors. I'll still try it, though.
sry that was a different topic lol >.< cleaning will prbly still be helpful in this case though.

Re: Custom Unit Problem

Posted: Wed Nov 12, 2008 11:33 pm
by Blade
Hm. After I cleaned and munged again, I still didn't get any errors relating to my unit. I did however, get two Severity: 3 errors.
Hidden/Spoiler:
[code]Message Severity: 3
.\Source\Weapon.cpp(1719)
Weapon "imp_weap_inf_heavy_rifle" missing ordnance 0.000000 "imp_weap_inf_heavy_rifle_ord"

Message Severity: 3
.\Source\LuaHelper.cpp(312)
CallProc failed: bad argument #2 to `SetBleedingVoiceOver' (number expected, got nil)
stack traceback:
[/code]
I've checked... over and over again, and I have imp_weap_inf_heavy_rifle_ord.odf in my side's odf folder. The other error, I know nothing about.

Re: Custom Unit Problem

Posted: Thu Nov 13, 2008 12:50 am
by AQT
Try changing

Code: Select all

ClassParent         = "rep_inf_default"
to

Code: Select all

ClassParent         = "imp_inf_default"
in your unit's .odf file.

Re: Custom Unit Problem

Posted: Thu Nov 13, 2008 12:26 pm
by Blade
I did that, and still no dice. I did noticed one error that I hadn't before (because it's only sev 2)

Code: Select all

Message Severity: 2
.\Source\Team.cpp(625)
Team missing class "imp_inf_impjettrooper" (check the side's .req file)
However, I'm rather sure that I have the .req folder there.

ImageImage

Re: Custom Unit Problem

Posted: Thu Nov 13, 2008 3:32 pm
by DarthD.U.C.K.
there has to be a problem in the units req or the side req or the lua or the units odf (im shure you wrote his name wrong sonmewhere)

Re: Custom Unit Problem

Posted: Thu Nov 13, 2008 4:35 pm
by Blade
Yeah, I'd thought of that, but I can't find anywhere that it's spelled differently from the others.

Re: Custom Unit Problem

Posted: Thu Nov 13, 2008 4:44 pm
by DarthD.U.C.K.
try to make a custom side with all the files the jettrooper needs in it and munge it in a new map

Re: Custom Unit Problem

Posted: Thu Nov 13, 2008 4:46 pm
by Blade
I'll try just about anything at the moment :P. *crosses fingers*