I love designing electronics that perform safety critical missions.
In 2010 I led the team at the RIT Amateur Radio Club (K2GXT) in designing a high altitude balloon that ascended to over 97,000 feet above Rochester, NY.
For nearly the next 5 years I was a Hardware Development Engineer at SpaceX designing, building, and qualifying electronics and assemblies that flew into space on both the Falcon 9 rocket and both Dragon capsules.
In 2018 I joined Reliable Robotics building large autonomous aircraft focusing on the Part 23 aircraft industry.
I worked with my brother on our personal side company FaradayRF that designed and sold digital radio’s for use in the Part 97 amateur radio spectrum. I’ve shelved this work for now to focus my energy on Reliable Robotics.
Brenton Salmi (Left) and Bryce Salmi (Right) - We both worked at SpaceX
Outside of Work
I’m an avid rocker climber and mountaineer with a tendency to bring along a camera.
I am driven more by the journey, the planning process, the learning process, and the wilderness experience than the achievements of climbing. This has guided me in learning skills and the partners I adventure with. Exploring the outdoors safely and within my own personal/partner achievements and new skillsets are primary drivers.
My climbing partner and I nearing the summit of Mt. Shasta via the West Face route.


Scope
{{ latest_landing.scope | markdownify }}
{{ latest_landing.background | markdownify }}
{{ latest_landing.scope | markdownify }}
Registration for the BioHackathon is free. The cost of accommodation includes all meals and refreshments during the meeting when booked at the venue.
Participants are expected to cover their accommodation and travel unless invited by project leads of selected projects (see selected proposals). Staying at the venue is highly preferred, since it maximises networking with all participants and gets the most out of the hacking.
Venue and accommodation detailsIn January, we asked for expression of interest for ELIXIR members to submit project titles so we could plan what potential areas participants were interested in. We now request that full submission are made following “Call for Proposal” directions.
Selected hacking topics will be published here once reviewed by the BioHackathon Organising Committee. We are expecting topics to align well with the current interest of life science communities at large. These may include standardised workflows, containerisation, schemas and identifiers, ontology tooling, metadata validation, and training. We encourage submissions of hacking topics from the public and private sector.
Companies interested in submitting hacking projects to our ‘Biohackathon 2020 Industry Track’ should contact Kathi Lauer (ELIXIR Industry Officer) for more information.
ContactThe call for hacking projects is open from 2nd March and will close on 2th April 2020. The project leader will submit through the EasyChair submission
EasyChair submissionThe programme organising committee will select the project based on the following criteria


Navigating the @ClientNameLong@
When you sign in you see a screen view similar to the one shown below. This view is the Mail view. The view changes when you use another application, such as Address Book or Calendar.
|
Option |
Description |
|---|---|
|
Window header |
The Window header displays: • Search box • User Name under which you are logged in. From the drop-down menu of your user name you can access product help, new features, about, change password, and sign out features. |
|
Application tabs |
The applications that you can access are listed in the tabs on this row, such as Mail or Calendar applications. |
|
Overview pane |
The Overview pane displays: • Folders – including system folders (Inbox, Sent, Draft, • Junk (and Trash) as well as customer folders you created • Searches – search queries that you created and saved for future use • Tags – any tags you have created. Click on a tag to quickly see all messages that are tagged with that tag. • Zimlets – links that may have been created to integrate with third-party applications from within your mailbox. • When you are in the Calendar application, the Overview pane displays your calendar list and Zimlets. |
|
Mini-calendar |
The mini-calendar is optional. You can disable the mini-calendar using the Preferences>Calendar page. |
|
Toolbar |
The toolbar shows actions available for the application you are currently using. |
|
Content pane |
The Content pane area changes depending on what application is in use. In the Inbox view, it displays all messages or conversations in your Inbox. |
|
Reading pane |
Email messages are displayed in the Reading pane if you have this feature enabled. Enable this feature from the View drop-down menu on the mail toolbar. |
|
Search bar |
Search options are displayed in this area. You can also save searches from here. |
Get Help
Passing your mouse cursor over items, such as command buttons, conversations, or mail addresses in message headers, displays a small text box of descriptive information about the item.
Folder Information
If you hover the cursor over a folder, the number messages in the folder and the size of the folder display.


Title of the item
Price: $120.00
Sold By: Username
Post Date: 2018/07/04
Description:
Description of item
CONTACT SELLER


LVMH puts ring on jeweler Tiffany in $16.2-billion union
The deal comes after LVMH spent more than a month wooing Tiffany, the most iconic of US luxury brands known for its wedding rings and diamonds
by Agence France-PresseSubscribe
Email Address
Newsletters
- Glenda Gloria's Take this Tuesday
- Huddle by Miriam Grace Go
- The Newsbreak Agenda by Chay Hofileña
- Sometimes, all you need is video by Lilibeth Frondoso


I think whale bro is an institutional investor. Likely not playing with solely their own money. That trading action was pro level accumulation strategy nonetheless.
grewalsatinder28-Oct-18 08:13 PM
@blackjok3r I think voting power can be one of the reason instead of only reason
Komodo tech is getting solid by every hour. Any mindful investor accumulating this much with such patience, I think must have understanding enough not to dump it in future..... at least not in one go....
I guess it can sure play a role in suppressing kmd price down in case of manipulation.....
Get Neblio price, charts, and other cryptocurrency info
bpkdasbaum29-Oct-18 12:30 AM
daaaaamn they were at 60
Alice29-Oct-18 12:30 AM
Chart looks similar to komodo
bpkdasbaum29-Oct-18 12:31 AM
much less supply
Alice29-Oct-18 12:31 AM
good entry point now from a ta perspective
bpkdasbaum29-Oct-18 12:31 AM
a little bit late with the pummp
Alice29-Oct-18 12:33 AM
neblio has quite some volume on binance
bpkdasbaum29-Oct-18 12:33 AM
breakout was 21st oct
that's when the volume came in
1/4 of KMD market cap and less supply, I guess easier to move than KMD(edited)
Alice29-Oct-18 12:40 AM
If you look at the chart, all these coins will move, when bitcoin wakes up
bpkdasbaum29-Oct-18 12:41 AM
but only in usd, when btc really starts amoving most ppl move into btc
alts tank
Alice29-Oct-18 12:41 AM
But we will get some spikes, like last year
China will wake up soon, 15 min
lets see if we get a move
Bittersweet29-Oct-18 12:44 AM
Lowest volume in over a year two days in a row for BTC
Alice29-Oct-18 12:46 AM
That is actually a good thing for BTC. Setting a base for the next move.
Deleted User29-Oct-18 05:16 AM
Not sure if allows to post this but anyone wanna buy up to $2500 AUD of Komodo at 1.5% under binance price? You know you’ll end up costing yourself 2%+ if you transfer into btcm, pay the Btc difference then send to binance then buy (edited)
Need me a new exhaust for my car
Think my past has proven me worthy enough as a person for those who are around here (sent mobo and cpu to blackjoker, sold wallet.dat to hollow, middlemanned for jl)
I’d rather sell some off now than to pay it as 40% tax to the government LOL
Cryptoon29-Oct-18 07:47 AM
Not in aus otherwise would consider
Hollowman900029-Oct-18 08:53 AM
@Deleted User is a man of his word, can confirm
actionslacks29-Oct-18 08:59 AM
my binance and bittrex are both on hole until I give them muh chickens.
$PRL creator wallet called the transferDirector function 6 hours ago, giving himself admin rights
New «owner» opened ICO sale function on contract
Sent ETH to contract and got PRL tokens at ICO price
Sent them to Kucoin crashed the price and probably ruined the project
rekt
Hollowman900029-Oct-18 08:25 PM
lol
Twitchy mcblinkerin just got a little more twitchy
bpkdasbaum29-Oct-18 08:55 PM
pearl / oyster ^^?
So is this like an exit scam? Or did someone get access to the contact who shouldn't have had access?


"E-mail Favela and Posh Josh."
"Read the last message sent to Next forum."
"Play karaoke for 'Defying Gravity'"
"Hi Baymax! My name is Tricia."
Teach Baymax to recognize your name and receive personalized assistance.
"What's cookin' in Next house dining tonight?"
"What is Victor's phone number?"
"How do I get to Symphony Hall safely?"
"What do you suggest we do tonight?"
Ask Baymax for safe activity suggestions.
"Is the weather outside nice today?"
"Is it Kwabena's bedtime yet?"
...
"Read Hamlet's soliloquy in a British accent."
"Download M.I.T. People Directory and lookup ..."
"What is the 100th prime number?"
"Should I punt my next 18.03 pset?"
"Baymax, learn to recognize my voice."
"Hide the twitter feed. Show public transportation info."
Baymax can remote control Infolounge!
"What board game should we play today?"
"How's the weather looking tomorrow?"
"Remind Safetythird of David's birthday at 11PM"
"Tell me about 2.009."
"Read us a funny haiku!"
"Do people like Big Hero 6?"
"When does 6.006 meet?"
"When is Mystery Hunt?"
"Is MIT better than Caltech?"
"When is Tiffany's birthday?"
"I am Baymax. Your personal safety companion."
"Talk with a British accent when you hear Shakespeare!"
"Baymax, learn to recognize my voice."

"Learn how to say Runpeng's name."
"Hey Baymax, I'm Zoe."
"Weee jumped out a window!"
"Send spam to Dean Colombo."
"E-mail President Reif."
"Hide twitter feed. Display lounge news."
Baymax can remotely control Infolounge.
"Where on earth is the Tech shuttle?"
"Tell me about Professor Lippard."
You can ask Baymax to dig up dirt on MIT professors and faculty members.
"Give me ratings for Professor Poonen."
"Download M.I.T. People Directory and lookup 'jfabi' "
"What is comforts serving tonight?"
"When is commencement?"
"When is the 18.02 final?"
"Notify Safetythird... 'Dinner at Harvard Square 6 p.m.'"
"Send an e-mail to Josh R.T."
"Where is Landon from?"
"Tell me about Posh Josh. What do you know about jfabi?"
Baymax knows Safetythird nicknames and aliases.
"What is Harlin's birthday?"

Baymax understands Safetythird inside jokes.
"When is Kwabena's bedtime?"
"On a scale of 1 to 10, how would you rate your happiness?"
"Sing us a healthy song!"
"Play me some nostalgic music."
"Play selections from Sound of Music."
"Play classical music by Beethoven."
"Sing happy birthday for Akwasi!"
"Sing 'Let it Go' to us in French!"
"Play karaoke for Don't Stop Believin'. Show lyrics on Infolounge."
"Play development section of Tchaikovsky violin concerto."


func GetPolicies(mspIDs ...string) (signedBy []*common.SignaturePolicy, identities []*mb.MSPPrincipal, err error)
GetPolicies creates a set of 'signed by' signature policies and corresponding identities for the given set of MSP IDs
func NewNOutOfPolicy(n int32, signedBy ...*common.SignaturePolicy) *common.SignaturePolicy
NewNOutOfPolicy creates an NOutOf signature policy
func NewPrincipal(name string, classification mb.MSPPrincipal_Classification) (*mb.MSPPrincipal, error)
NewPrincipal creates a new MSPPrincipal
func NewSignedByPolicy(index int32) *common.SignaturePolicy
NewSignedByPolicy creates a SignaturePolicy at the given index
Collapsable is implemented by any group that can collapse into a simple (non-hierarchical) Group
type Collapsable interface { // Collapse converts a hierarchical group into a single-level group (if possible). // For example, say G = (A and (B and C) and (D and E) and (F or G)) // then G.Collapse() = (A and B and C and D and E and (F or G)) Collapse() Group }
Group contains a group of Items
type Group interface { // Items returns all of the items Items() []Item // Equals returns true if this Group contains the same items as the given Group Equals(other Group) bool // Reduce reduces the group (which may be a hierarchy of groups) into a simple, non-hierarchical set of groups. // For example, given the group, G=(A and (B or C or D)) // then G.Reduce() = [(A and B) or (A and C) or (A and D)] Reduce() []Group }
func NewGroup(items []Item) Group
NewGroup creates a new Group
GroupOfGroups contains a set of groups.
type GroupOfGroups interface { // GroupOfGroups is also a Group Group // Groups returns all of the groups in this container Groups() []Group // Nof returns a set of groups that includes all possible combinations for the given threshold. // For example, given the group-of-groups, G=(G1, G2, G3), where G1=(A or B), G2=(C or D), G3=(E or F), // then: // - G.Nof(1) = (G1 or G2 or G3) // - G.Nof(2) = ((G1 and G2) or (G1 and G3) or (G2 and G3) // - G.Nof(3) = (G1 and G2 and G3) Nof(threshold int32) (GroupOfGroups, error) }
func NewGroupOfGroups(groups []Group) GroupOfGroups
NewGroupOfGroups returns a new group of groups
GroupRetriever is a function that returns groups of peers
type GroupRetriever func(peerRetriever MSPPeerRetriever) (GroupOfGroups, error)
func CompileSignaturePolicy(sigPolicyEnv *common.SignaturePolicyEnvelope) (GroupRetriever, error)
CompileSignaturePolicy compiles the given signature policy and returns a GroupRetriever
Item represents any item
type Item interface { }
LoadBalancePolicy is used to pick a peer group from a given set of peer groups
type LoadBalancePolicy interface { // Choose returns one of the peer groups from the given set of peer groups. // This method should never return nil but may return a PeerGroup that contains no peers. Choose(peerGroups []PeerGroup) PeerGroup }
func NewRandomLBP() LoadBalancePolicy
NewRandomLBP returns a random load-balance policy
func NewRoundRobinLBP() LoadBalancePolicy
NewRoundRobinLBP returns a round-robin load-balance policy
MSPPeerRetriever is a function that retrieves peers by MSPID
type MSPPeerRetriever func(mspID string) []fab.Peer
PeerGroup contains a group of Peers
type PeerGroup interface { Group Peers() []fab.Peer }
func NewMSPPeerGroup(mspID string, peerRetriever MSPPeerRetriever) PeerGroup
NewMSPPeerGroup returns a new MSP PeerGroup
func NewPeerGroup(peers ...fab.Peer) PeerGroup
NewPeerGroup returns a new PeerGroup
PeerGroupResolver resolves a group of peers that would (exactly) satisfy a chaincode's endorsement policy.
type PeerGroupResolver interface { // Resolve returns a PeerGroup ensuring that all of the peers in the group are // in the given set of available peers. Resolve(peers []fab.Peer) (PeerGroup, error) }
func NewPeerGroupResolver(groupRetriever GroupRetriever, lbp LoadBalancePolicy) (PeerGroupResolver, error)
NewPeerGroupResolver returns a new PeerGroupResolver
func NewRandomPeerGroupResolver(sigPolicyEnv *common.SignaturePolicyEnvelope) (PeerGroupResolver, error)
NewRandomPeerGroupResolver returns a PeerGroupResolver that chooses peers in a round-robin fashion
func NewRoundRobinPeerGroupResolver(sigPolicyEnv *common.SignaturePolicyEnvelope) (PeerGroupResolver, error)
NewRoundRobinPeerGroupResolver returns a PeerGroupResolver that chooses peers in a round-robin fashion


inputComponent Tests
html5 input types should bring up proper device keyboard
mobi input type is text
mobi input type is textfield
mobi input type is password
mobi input type is email
mobi input type is number no converter
mobi input type is number with converter
mobi input type is phone
mobi input type is Url
ActionListener for buttons will change following field to reflect which button was pressed
RESULTS
index page


#include "AppHdr.h"
#include "god-passive.h"
#include <algorithm>
#include <cmath>
#include "act-iter.h"
#include "areas.h"
#include "artefact.h"
#include "art-enum.h"
#include "branch.h"
#include "chardump.h"
#include "cloud.h"
#include "coordit.h"
#include "directn.h"
#include "env.h"
#include "eq-type-flags.h"
#include "fight.h"
#include "files.h"
#include "fprop.h"
#include "god-abil.h"
#include "god-prayer.h"
#include "invent.h" // in_inventory
#include "item-name.h"
#include "item-prop.h"
#include "item-status-flag-type.h"
#include "items.h"
#include "libutil.h"
#include "map-knowledge.h"
#include "melee-attack.h"
#include "message.h"
#include "mon-cast.h"
#include "mon-place.h"
#include "mon-util.h"
#include "output.h"
#include "religion.h"
#include "shout.h"
#include "skills.h"
#include "spl-clouds.h"
#include "state.h"
#include "stringutil.h"
#include "terrain.h"
#include "throw.h"
#include "unwind.h"
// TODO: template out the differences between this and god_power.
// TODO: use the display method rather than dummy powers in god_powers.
// TODO: finish using these for implementing passive abilities.
struct god_passive
{
// 1-6 means it unlocks at that many stars of piety;
// 0 means it is always present when in good standing with the god;
// -1 means it is present even under penance;
int rank;
passive_t pasv;
/** Message to be given on gain of this passive.
*
* If the string begins with an uppercase letter, it is treated as
* a complete sentence. Otherwise, if it contains the substring " NOW ",
* the string "You " is prepended. Otherwise, the string "You NOW " is
* prepended to the message, with the " NOW " then being replaced.
*
* The substring "GOD" is replaced with the name of the god.
* The substring " NOW " is replaced with " now " for messages about
* gaining the ability, or " " for messages about having the ability.
*
* Examples:
* "have super powers"
* => "You have super powers", "You now have super powers."
* "are NOW powerful"
* => "You are powerful", "You are now powerful."
* "Your power is NOW great"
* => "Your power is great", "Your power is now great"
* "GOD NOW makes you powerful"
* => "Moloch makes you powerful", "Moloch now makes you powerful"
* "GOD grants you a boon"
* => "Moloch grants you a boon" (in all situations)
*
* FIXME: This member is currently unused.
*
* @see god_passive::loss.
*/
const char* gain;
/** Message to be given on loss of this passive.
*
* If empty, use the gain message. This makes sense only if the message
* contains " NOW ", either explicitly or implicitly through not
* beginning with a capital letter.
*
* The substring "GOD" is replaced with the name of the god.
* The substring " NOW " is replaced with " no longer ".
*
* Examples:
* "have super powers"
* => "You no longer have super powers"
* "are NOW powerful"
* => "You are no longer powerful"
* "Your power is NOW great"
* => "Your power is no longer great"
* "GOD NOW makes you powerful"
* => "Moloch no longer makes you powerful"
* "GOD grants you a boon"
* => "Moloch grants you a boon" (probably incorrect)
*
* FIXME: This member is currently unused.
*
* @see god_passive::gain.
*/
const char* loss;
god_passive(int rank_, passive_t pasv_, const char* gain_,
const char* loss_ = "")
: rank{rank_}, pasv{pasv_}, gain{gain_}, loss{*loss_ ? loss_ : gain_}
{ }
god_passive(int rank_, const char* gain_, const char* loss_ = "")
: god_passive(rank_, passive_t::none, gain_, loss_)
{ }
void display(bool gaining, const char* fmt) const
{
const char * const str = gaining ? gain : loss;
if (isupper(str[0]))
god_speaks(you.religion, str);
else
god_speaks(you.religion, make_stringf(fmt, str).c_str());
}
};
static const vector<god_passive> god_passives[] =
{
// no god
{ },
// Zin
{
{ -1, passive_t::protect_from_harm,
"GOD sometimes watches over you",
"GOD no longer watches over you"
},
{ -1, passive_t::resist_mutation,
"GOD can shield you from mutations",
"GOD NOW you from mutations"
},
{ -1, passive_t::resist_polymorph,
"GOD can protect you from unnatural transformations",
"GOD NOW protects you from unnatural transformations",
},
{ -1, passive_t::resist_hell_effects,
"GOD can protect you from effects of Hell",
"GOD NOW protects you from effects of Hell"
},
{ -1, passive_t::warn_shapeshifter,
"GOD will NOW warn you about shapeshifters"
},
{
6, passive_t::cleanse_mut_potions,
"GOD cleanses your potions of mutation",
"GOD no longer cleanses your potions of mutation",
}
},
// TSO
{
{ -1, passive_t::protect_from_harm,
"GOD sometimes watches over you",
"GOD no longer watches over you"
},
{ -1, passive_t::abjuration_protection_hd,
"GOD NOW protects your summons from abjuration" },
{ -1, passive_t::bless_followers_vs_evil,
"GOD NOW blesses your followers when they kill evil beings" },
{ -1, passive_t::restore_hp_mp_vs_evil,
"gain health and magic from killing evil beings" },
{ -1, passive_t::no_stabbing,
"are NOW prevented from stabbing unaware creatures" },
{ 0, passive_t::halo, "are NOW surrounded by divine halo" },
},
// Kikubaaqudgha
{
{ 2, passive_t::miscast_protection_necromancy,
"GOD NOW protects you from necromancy miscasts"
" and mummy death curses"
},
{ 4, passive_t::resist_torment,
"GOD NOW protects you from torment" },
},
// Yredelemnul
{
{ 3, passive_t::nightvision, "can NOW see well in the dark" },
},
// Xom
{ },
// Vehumet
{
{ -1, passive_t::mp_on_kill,
"have a chance to gain magical power from killing" },
{ 3, passive_t::spells_success,
"are NOW less likely to miscast destructive spells" },
{ 4, passive_t::spells_range,
"can NOW cast destructive spells farther" },
},
// Okawaru
{
// None
},
// Makhleb
{
{ -1, passive_t::restore_hp, "gain health from killing" },
},
// Sif Muna
{ },
// Trog
{
{ -1, passive_t::abjuration_protection,
"GOD NOW protects your allies from abjuration"
},
{ 0, passive_t::extend_berserk,
"can NOW maintain berserk longer, and are less likely to pass out",
"can NOW maintain berserk as long, and are more likely to pass out"
},
},
// Nemelex
{
// None
},
// Elyvilon
{
{ -1, passive_t::protect_from_harm,
"GOD sometimes watches over you",
"GOD no longer watches over you"
},
{ -1, passive_t::protect_ally,
"GOD can protect the life of your allies",
"GOD NOW protects the life of your allies"
},
},
// Lugonu
{
{ -1, passive_t::safe_distortion,
"are NOW protected from distortion unwield effects" },
{ -1, passive_t::map_rot_res_abyss,
"remember the shape of the Abyss better" },
{ 5, passive_t::attract_abyssal_rune,
"GOD will NOW help you find the Abyssal rune" },
},
// Beogh
{
{ -1, passive_t::share_exp, "share experience with your followers" },
{ 3, passive_t::convert_orcs, "inspire orcs to join your side" },
{ 3, passive_t::bless_followers,
"GOD will bless your followers",
"GOD will no longer bless your followers"
},
{ 5, passive_t::water_walk, "walk on water" },
},
// Jiyva
{
{ -1, passive_t::neutral_slimes,
"Slimes and eye monsters are NOW neutral towards you" },
{ -1, passive_t::jellies_army,
"GOD NOW summons jellies to protect you" },
{ -1, passive_t::jelly_eating,
"GOD NOW allows jellies to devour items" },
{ -1, passive_t::fluid_stats,
"GOD NOW adjusts your attributes periodically" },
{ 0, passive_t::slime_wall_immune,
"are NOW immune to slime covered walls" },
{ 2, passive_t::slime_feed,
"Items consumed by your fellow slimes NOW feed you" },
{ 3, passive_t::resist_corrosion,
"GOD NOW protects you from corrosion" },
{ 4, passive_t::slime_mp,
"Items consumed by your fellow slimes NOW restore"
" your magical power"
},
{ 5, passive_t::slime_hp,
"Items consumed by your fellow slimes NOW restore"
" your health"
},
{ 6, passive_t::spawn_slimes_on_hit,
"spawn slimes when struck by massive blows" },
{ 6, passive_t::unlock_slime_vaults,
"GOD NOW grants you access to the hidden treasures"
" of the Slime Pits"
},
},
// Fedhas
{
{ -1, passive_t::pass_through_plants,
"can NOW walk through plants" },
{ -1, passive_t::shoot_through_plants,
"can NOW safely fire through allied plants" },
{ 0, passive_t::friendly_plants,
"Allied plants are NOW friendly towards you" },
},
// Cheibriados
{
{ -1, passive_t::no_haste,
"are NOW protected from inadvertent hurry" },
{ -1, passive_t::slowed, "move less quickly" },
{ 0, passive_t::slow_orb_run,
"GOD will NOW aid your escape with the Orb of Zot",
},
{ 0, passive_t::stat_boost,
"GOD NOW supports your attributes"
},
{ 0, passive_t::slow_abyss,
"GOD will NOW slow the Abyss"
},
// TODO: this one should work regardless of penance
{ 1, passive_t::slow_metabolism, "have a slowed metabolism" },
},
// Ashenzari
{
{ -1, passive_t::want_curses, "prefer cursed items" },
{ -1, passive_t::detect_portals, "sense portals" },
{ -1, passive_t::identify_items, "sense the properties of items" },
{ 0, passive_t::auto_map, "have improved mapping abilities" },
{ 0, passive_t::detect_montier, "sense threats" },
{ 0, passive_t::detect_items, "sense items" },
{ 0, passive_t::avoid_traps,
"avoid traps" },
{ 2, passive_t::bondage_skill_boost,
"get a skill boost from cursed items" },
{ 3, passive_t::sinv, "are NOW clear of vision" },
{ 4, passive_t::clarity, "are NOW clear of mind" },
},
// Dithmenos
{
{ 1, passive_t::nightvision, "can NOW see well in the dark" },
{ 1, passive_t::umbra, "are NOW surrounded by an umbra" },
// TODO: this one should work regardless of penance.
{ 3, passive_t::hit_smoke, "emit smoke when hit" },
{ 4, passive_t::shadow_attacks,
"Your attacks are NOW mimicked by a shadow" },
{ 4, passive_t::shadow_spells,
"Your attack spells are NOW mimicked by a shadow" },
},
// Gozag
{
{ -1, passive_t::detect_gold, "detect gold" },
{ 0, passive_t::goldify_corpses,
"GOD NOW turns all corpses to gold" },
{ 0, passive_t::gold_aura, "have a gold aura" },
},
// Qazlal
{
{ 0, passive_t::cloud_immunity, "and your divine allies are ADV immune to clouds" },
{ 1, passive_t::storm_shield,
"generate elemental clouds to protect yourself" },
{ 4, passive_t::upgraded_storm_shield,
"Your chances to be struck by projectiles are NOW reduced" },
{ 5, passive_t::elemental_adaptation,
"Elemental attacks NOW leave you somewhat more resistant"
" to them"
}
},
// Ru
{
{ 1, passive_t::aura_of_power,
"Your enemies will sometimes fail their attack or even hit themselves",
"Your enemies will NOW fail their attack or hit themselves"
},
{ 2, passive_t::upgraded_aura_of_power,
"Enemies that inflict damage upon you will sometimes receive"
" a detrimental status effect",
"Enemies that inflict damage upon you will NOW receive"
" a detrimental status effect"
},
},
#if TAG_MAJOR_VERSION == 34
// Pakellas
{
{ -1, passive_t::no_mp_regen,
"GOD NOW prevents you from regenerating your magical power" },
{ -1, passive_t::mp_on_kill, "have a chance to gain magical power from"
" killing" },
{ 1, passive_t::bottle_mp,
"GOD NOW collects and distills excess magic from your kills"
},
},
#endif
// Uskayaw
{ },
// Hepliaklqana
{
{ -1, passive_t::frail,
"GOD NOW siphons a part of your essence into your ancestor" },
{ 5, passive_t::transfer_drain,
"drain nearby creatures when transferring your ancestor" },
},
// Wu Jian
{
{ 0, passive_t::wu_jian_lunge, "perform damaging attacks by moving towards foes." },
{ 1, passive_t::wu_jian_whirlwind, "lightly attack monsters by moving around them." },
{ 2, passive_t::wu_jian_wall_jump, "perform airborne attacks in an area by jumping off a solid obstacle." },
},
};
COMPILE_CHECK(ARRAYSZ(god_passives) == NUM_GODS);
bool have_passive(passive_t passive)
{
const auto &pasvec = god_passives[you.religion];
return any_of(begin(pasvec), end(pasvec),
[passive] (const god_passive &p) -> bool
{
return p.pasv == passive
&& piety_rank() >= p.rank
&& (!player_under_penance() || p.rank < 0);
});
}
bool will_have_passive(passive_t passive)
{
const auto &pasvec = god_passives[you.religion];
return any_of(begin(pasvec), end(pasvec),
[passive] (const god_passive &p) -> bool
{
return p.pasv == passive;
});
}
// Returns a large number (10) if we will never get this passive.
int rank_for_passive(passive_t passive)
{
const auto &pasvec = god_passives[you.religion];
const auto found = find_if(begin(pasvec), end(pasvec),
[passive] (const god_passive &p) -> bool
{
return p.pasv == passive;
});
return found == end(pasvec) ? 10 : found->rank;
}
int chei_stat_boost(int piety)
{
if (!have_passive(passive_t::stat_boost))
return 0;
if (piety < piety_breakpoint(0)) // Since you've already begun to slow down.
return 1;
if (piety >= piety_breakpoint(5))
return 15;
return (piety - 10) / 10;
}
// Eat from one random off-level item stack.
void jiyva_eat_offlevel_items()
{
// For wizard mode 'J' command
if (!have_passive(passive_t::jelly_eating))
return;
if (crawl_state.game_is_sprint())
return;
while (true)
{
if (one_chance_in(200))
break;
const int branch = random2(NUM_BRANCHES);
// Choose level based on main dungeon depth so that levels of
// short branches aren't picked more often.
ASSERT(brdepth[branch] <= MAX_BRANCH_DEPTH);
const int level = random2(MAX_BRANCH_DEPTH) + 1;
const level_id lid(static_cast<branch_type>(branch), level);
if (lid == level_id::current() || !you.level_visited(lid))
continue;
dprf("Checking %s", lid.describe().c_str());
level_excursion le;
le.go_to(lid);
while (true)
{
if (one_chance_in(200))
break;
const coord_def p = random_in_bounds();
if (igrd(p) == NON_ITEM || testbits(env.pgrid(p), FPROP_NO_JIYVA))
continue;
for (stack_iterator si(p); si; ++si)
{
if (!item_is_jelly_edible(*si) || one_chance_in(4))
continue;
if (one_chance_in(4))
break;
dprf("Eating %s on %s",
si->name(DESC_PLAIN).c_str(), lid.describe().c_str());
// Needs a message now to explain possible hp or mp
// gain from jiyva_slurp_bonus()
mpr("You hear a distant slurping noise.");
jiyva_slurp_item_stack(*si);
item_was_destroyed(*si);
destroy_item(si.index());
}
return;
}
}
}
void ash_init_bondage(player *y)
{
y->bondage_level = 0;
for (int i = ET_WEAPON; i < NUM_ET; ++i)
y->bondage[i] = 0;
}
static bool _two_handed()
{
const item_def* wpn = you.slot_item(EQ_WEAPON, true);
if (!wpn)
return false;
hands_reqd_type wep_type = you.hands_reqd(*wpn, true);
return wep_type == HANDS_TWO;
}
void ash_check_bondage(bool msg)
{
if (!will_have_passive(passive_t::bondage_skill_boost))
return;
int cursed[NUM_ET] = {0}, slots[NUM_ET] = {0};
for (int j = EQ_FIRST_EQUIP; j < NUM_EQUIP; j++)
{
const equipment_type i = static_cast<equipment_type>(j);
eq_type s;
if (i == EQ_WEAPON)
s = ET_WEAPON;
else if (i == EQ_SHIELD)
s = ET_SHIELD;
else if (i <= EQ_MAX_ARMOUR)
s = ET_ARMOUR;
// Missing hands mean fewer rings
else if (you.species != SP_OCTOPODE && i == EQ_LEFT_RING
&& you.get_mutation_level(MUT_MISSING_HAND))
{
continue;
}
// Octopodes don't count these slots:
else if (you.species == SP_OCTOPODE
&& ((i == EQ_LEFT_RING || i == EQ_RIGHT_RING)
|| (i == EQ_RING_EIGHT
&& you.get_mutation_level(MUT_MISSING_HAND))))
{
continue;
}
// *Only* octopodes count these slots:
else if (you.species != SP_OCTOPODE
&& i >= EQ_RING_ONE && i <= EQ_RING_EIGHT)
{
continue;
}
// The macabre finger necklace's extra slot does count if equipped.
else if (!player_equip_unrand(UNRAND_FINGER_AMULET)
&& i == EQ_RING_AMULET)
{
continue;
}
else
s = ET_JEWELS;
// transformed away slots are still considered to be possibly bound
if (you_can_wear(i))
{
slots[s]++;
if (you.equip[i] != -1)
{
const item_def& item = you.inv[you.equip[i]];
if (item.cursed() && (i != EQ_WEAPON || is_weapon(item)))
{
if (s == ET_WEAPON
&& (_two_handed()
|| you.get_mutation_level(MUT_MISSING_HAND)))
{
cursed[ET_WEAPON] = 3;
cursed[ET_SHIELD] = 3;
}
else
{
cursed[s]++;
if (i == EQ_BODY_ARMOUR && is_unrandom_artefact(item, UNRAND_LEAR))
cursed[s] += 3;
}
}
}
}
}
int8_t new_bondage[NUM_ET];
int old_level = you.bondage_level;
for (int s = ET_WEAPON; s < NUM_ET; s++)
{
if (slots[s] == 0)
new_bondage[s] = -1;
// That's only for 2 handed weapons.
else if (cursed[s] > slots[s])
new_bondage[s] = 3;
else if (cursed[s] == slots[s])
new_bondage[s] = 2;
else if (cursed[s] > slots[s] / 2)
new_bondage[s] = 1;
else
new_bondage[s] = 0;
}
you.bondage_level = 0;
// kittehs don't obey hoomie rules!
if (you.species == SP_FELID)
{
for (int i = EQ_LEFT_RING; i <= EQ_AMULET; ++i)
if (you.equip[i] != -1 && you.inv[you.equip[i]].cursed())
++you.bondage_level;
// Allow full bondage when all available slots are cursed.
if (you.bondage_level == 3)
++you.bondage_level;
}
else
for (int i = ET_WEAPON; i < NUM_ET; ++i)
if (new_bondage[i] > 0)
++you.bondage_level;
int flags = 0;
if (msg)
{
for (int s = ET_WEAPON; s < NUM_ET; s++)
if (new_bondage[s] != you.bondage[s])
flags |= 1 << s;
}
you.skill_boost.clear();
for (int s = ET_WEAPON; s < NUM_ET; s++)
{
you.bondage[s] = new_bondage[s];
map<skill_type, int8_t> boosted_skills = ash_get_boosted_skills(eq_type(s));
for (const auto &entry : boosted_skills)
{
you.skill_boost[entry.first] += entry.second;
if (you.skill_boost[entry.first] > 3)
you.skill_boost[entry.first] = 3;
}
}
if (msg)
{
string desc = ash_describe_bondage(flags, you.bondage_level != old_level);
if (!desc.empty())
mprf(MSGCH_GOD, "%s", desc.c_str());
}
}
string ash_describe_bondage(int flags, bool level)
{
string desc;
if (flags & ETF_WEAPON && flags & ETF_SHIELD
&& you.bondage[ET_WEAPON] != -1)
{
if (you.bondage[ET_WEAPON] == you.bondage[ET_SHIELD])
{
const string verb = make_stringf("are%s",
you.bondage[ET_WEAPON] ? ""
: " not");
desc = you.hands_act(verb, "bound.\n");
}
else
{
// FIXME: what if you sacrificed a hand?
desc = make_stringf("Your %s %s is bound but not your %s %s.\n",
you.bondage[ET_WEAPON] ? "weapon" : "shield",
you.hand_name(false).c_str(),
you.bondage[ET_WEAPON] ? "shield" : "weapon",
you.hand_name(false).c_str());
}
}
else if (flags & ETF_WEAPON && you.bondage[ET_WEAPON] != -1)
{
desc = make_stringf("Your weapon %s is %sbound.\n",
you.hand_name(false).c_str(),
you.bondage[ET_WEAPON] ? "" : "not ");
}
else if (flags & ETF_SHIELD && you.bondage[ET_SHIELD] != -1)
{
desc = make_stringf("Your shield %s is %sbound.\n",
you.hand_name(false).c_str(),
you.bondage[ET_SHIELD] ? "" : "not ");
}
if (flags & ETF_ARMOUR && flags & ETF_JEWELS
&& you.bondage[ET_ARMOUR] == you.bondage[ET_JEWELS]
&& you.bondage[ET_ARMOUR] != -1)
{
desc += make_stringf("You are %s bound in armour %s jewellery.\n",
you.bondage[ET_ARMOUR] == 0 ? "not" :
you.bondage[ET_ARMOUR] == 1 ? "partially"
: "fully",
you.bondage[ET_ARMOUR] == 0 ? "or" : "and");
}
else
{
if (flags & ETF_ARMOUR && you.bondage[ET_ARMOUR] != -1)
{
desc += make_stringf("You are %s bound in armour.\n",
you.bondage[ET_ARMOUR] == 0 ? "not" :
you.bondage[ET_ARMOUR] == 1 ? "partially"
: "fully");
}
if (flags & ETF_JEWELS && you.bondage[ET_JEWELS] != -1)
{
desc += make_stringf("You are %s bound in jewellery.\n",
you.bondage[ET_JEWELS] == 0 ? "not" :
you.bondage[ET_JEWELS] == 1 ? "partially"
: "fully");
}
}
if (level)
{
desc += make_stringf("You are %s bound.",
you.bondage_level == 0 ? "not" :
you.bondage_level == 1 ? "slightly" :
you.bondage_level == 2 ? "moderately" :
you.bondage_level == 3 ? "seriously" :
you.bondage_level == 4 ? "fully"
: "buggily");
}
return trim_string(desc);
}
static bool _is_slot_cursed(equipment_type eq)
{
const item_def *worn = you.slot_item(eq, true);
if (!worn || !worn->cursed())
return false;
if (eq == EQ_WEAPON)
return is_weapon(*worn);
return true;
}
bool god_id_item(item_def& item, bool silent)
{
iflags_t old_ided = item.flags & ISFLAG_IDENT_MASK;
iflags_t ided = 0;
if (have_passive(passive_t::identify_items))
{
// Ashenzari (and other gods with both identify_items and want_curses)
// ties identification of weapon/armour plusses to cursed slots.
const bool ash = have_passive(passive_t::want_curses);
// Don't identify runes or the orb, since this has no gameplay purpose
// and might mess up other things.
if (item.base_type == OBJ_RUNES || item_is_orb(item))
return false;
ided = ISFLAG_KNOW_CURSE;
if ((item.base_type == OBJ_JEWELLERY || item.base_type == OBJ_STAVES)
&& item_needs_autopickup(item))
{
item.props["needs_autopickup"] = true;
}
if (is_weapon(item) || item.base_type == OBJ_ARMOUR)
ided |= ISFLAG_KNOW_PROPERTIES | ISFLAG_KNOW_TYPE;
if (item.base_type == OBJ_JEWELLERY)
ided |= ISFLAG_IDENT_MASK;
if (item.base_type == OBJ_ARMOUR
&& (!ash || _is_slot_cursed(get_armour_slot(item))))
{
ided |= ISFLAG_KNOW_PLUSES;
}
if (is_weapon(item)
&& (!ash || _is_slot_cursed(EQ_WEAPON)))
{
ided |= ISFLAG_KNOW_PLUSES;
}
}
if (ided & ~old_ided)
{
if (ided & ISFLAG_KNOW_TYPE)
set_ident_type(item, true);
set_ident_flags(item, ided);
if (item.props.exists("needs_autopickup") && is_useless_item(item))
item.props.erase("needs_autopickup");
if (&item == you.weapon())
you.wield_change = true;
if (!silent)
mprf_nocap("%s", item.name(DESC_INVENTORY_EQUIP).c_str());
seen_item(item);
if (in_inventory(item))
auto_assign_item_slot(item);
return true;
}
// nothing new
return false;
}
static bool is_ash_portal(dungeon_feature_type feat)
{
if (feat_is_portal_entrance(feat))
return true;
switch (feat)
{
case DNGN_ENTER_HELL:
case DNGN_ENTER_ABYSS: // for completeness
case DNGN_EXIT_THROUGH_ABYSS:
case DNGN_EXIT_ABYSS:
case DNGN_ENTER_PANDEMONIUM:
case DNGN_EXIT_PANDEMONIUM:
// DNGN_TRANSIT_PANDEMONIUM is too mundane
return true;
default:
return false;
}
}
// Yay for rectangle_iterator and radius_iterator not sharing a base type
static bool _check_portal(coord_def where)
{
const dungeon_feature_type feat = grd(where);
if (feat != env.map_knowledge(where).feat() && is_ash_portal(feat))
{
env.map_knowledge(where).set_feature(feat);
set_terrain_mapped(where);
if (!testbits(env.pgrid(where), FPROP_SEEN_OR_NOEXP))
{
env.pgrid(where) |= FPROP_SEEN_OR_NOEXP;
if (!you.see_cell(where))
return true;
}
}
return false;
}
int ash_detect_portals(bool all)
{
if (!have_passive(passive_t::detect_portals))
return 0;
int portals_found = 0;
const int map_radius = LOS_DEFAULT_RANGE + 1;
if (all)
{
for (rectangle_iterator ri(0); ri; ++ri)
{
if (_check_portal(*ri))
portals_found++;
}
}
else
{
for (radius_iterator ri(you.pos(), map_radius, C_SQUARE); ri; ++ri)
{
if (_check_portal(*ri))
portals_found++;
}
}
you.seen_portals += portals_found;
return portals_found;
}
monster_type ash_monster_tier(const monster *mon)
{
return monster_type(MONS_SENSED_TRIVIAL + monster_info(mon).threat);
}
map<skill_type, int8_t> ash_get_boosted_skills(eq_type type)
{
const int bondage = you.bondage[type];
map<skill_type, int8_t> boost;
if (bondage <= 0)
return boost;
// Include melded.
const item_def* wpn = you.slot_item(EQ_WEAPON, true);
const item_def* armour = you.slot_item(EQ_BODY_ARMOUR, true);
const int evp = armour ? -property(*armour, PARM_EVASION) / 10 : 0;
switch (type)
{
case (ET_WEAPON):
ASSERT(wpn);
// Boost weapon skill. Plain "staff" means an unrand magical staff,
// boosted later.
if (wpn->base_type == OBJ_WEAPONS
&& wpn->sub_type != WPN_STAFF)
{
boost[item_attack_skill(*wpn)] = bondage;
}
// Staves that have a melee effect, powered by evocations.
if (staff_uses_evocations(*wpn))
{
boost[SK_EVOCATIONS] = 1;
boost[SK_STAVES] = 1;
}
// Staves with an evokable ability but no melee effect.
else if (is_weapon(*wpn)
&& item_is_evokable(*wpn, false, false, false, false))
{
boost[SK_EVOCATIONS] = 2;
}
// Other magical staves.
else if (wpn->base_type == OBJ_STAVES)
boost[SK_SPELLCASTING] = 2;
break;
case (ET_SHIELD):
if (bondage == 2)
boost[SK_SHIELDS] = 1;
break;
// Bonus for bounded armour depends on body armour type.
case (ET_ARMOUR):
if (evp < 6)
{
boost[SK_STEALTH] = bondage;
boost[SK_DODGING] = bondage;
}
else if (evp < 12)
{
boost[SK_DODGING] = bondage;
boost[SK_ARMOUR] = bondage;
}
else
boost[SK_ARMOUR] = bondage + 1;
break;
// Boost all spell schools and evoc (to give some appeal to melee).
case (ET_JEWELS):
for (skill_type sk = SK_FIRST_MAGIC_SCHOOL; sk <= SK_LAST_MAGIC; ++sk)
boost[sk] = bondage;
boost[SK_EVOCATIONS] = bondage;
break;
default:
die("Unknown equipment type.");
}
return boost;
}
/**
* Does the player have an ash skill boost for a particular skill?
*/
bool ash_has_skill_boost(skill_type sk)
{
return have_passive(passive_t::bondage_skill_boost)
&& you.skill_boost.count(sk) && you.skill_boost.find(sk)->second;
}
/**
* Calculate the ash skill point boost for skill sk.
*
* @param scaled_skill the skill level to calculate it for, scaled by 10.
*
* @return the skill point bonus to use.
*/
unsigned int ash_skill_point_boost(skill_type sk, int scaled_skill)
{
unsigned int skill_points = 0;
skill_points += (you.skill_boost[sk] * 2 + 1) * (piety_rank() + 1)
* max(scaled_skill, 1) * species_apt_factor(sk);
return skill_points;
}
int ash_skill_boost(skill_type sk, int scale)
{
// It gives a bonus to skill points. The formula is:
// factor * (piety_rank + 1) * skill_level
// low bonus -> factor = 3
// medium bonus -> factor = 5
// high bonus -> factor = 7
unsigned int skill_points = you.skill_points[sk]
+ get_crosstrain_points(sk)
+ ash_skill_point_boost(sk, you.skill(sk, 10, true));
int level = you.skills[sk];
while (level < MAX_SKILL_LEVEL && skill_points >= skill_exp_needed(level + 1, sk))
++level;
level = level * scale + get_skill_progress(sk, level, skill_points, scale);
return min(level, MAX_SKILL_LEVEL * scale);
}
int gozag_gold_in_los(actor *whom)
{
if (!have_passive(passive_t::gold_aura))
return 0;
int gold_count = 0;
for (radius_iterator ri(whom->pos(), LOS_RADIUS, C_SQUARE, LOS_DEFAULT);
ri; ++ri)
{
for (stack_iterator j(*ri); j; ++j)
{
if (j->base_type == OBJ_GOLD)
++gold_count;
}
}
return gold_count;
}
void gozag_detect_level_gold(bool count)
{
vector<item_def *> gold_piles;
vector<coord_def> gold_places;
int gold = 0;
for (rectangle_iterator ri(0); ri; ++ri)
{
for (stack_iterator j(*ri); j; ++j)
{
if (j->base_type == OBJ_GOLD && !(j->flags & ISFLAG_UNOBTAINABLE))
{
gold += j->quantity;
gold_piles.push_back(&(*j));
gold_places.push_back(*ri);
}
}
}
if (!player_in_branch(BRANCH_ABYSS) && count)
you.attribute[ATTR_GOLD_GENERATED] += gold;
if (have_passive(passive_t::detect_gold))
{
for (unsigned int i = 0; i < gold_places.size(); i++)
{
bool detected = false;
int dummy = gold_piles[i]->index();
coord_def &pos = gold_places[i];
unlink_item(dummy);
move_item_to_grid(&dummy, pos, true);
if (!env.map_knowledge(pos).item()
|| env.map_knowledge(pos).item()->base_type != OBJ_GOLD)
{
detected = true;
update_item_at(pos, true);
}
// the pile can still remain undetected if it is not in
// you.visible_igrd, for example if it is under deep water and the
// player will not be able to see it.
if (detected && env.map_knowledge(pos).item())
{
env.map_knowledge(pos).flags |= MAP_DETECTED_ITEM;
#ifdef USE_TILE
// force an update for gold generated during Abyss shifts
tiles.update_minimap(pos);
#endif
}
}
}
}
int qazlal_sh_boost(int piety)
{
if (!have_passive(passive_t::storm_shield))
return 0;
return min(piety, piety_breakpoint(5)) / 10;
}
// Not actually passive, but placing it here so that it can be easily compared
// with Qazlal's boost.
int tso_sh_boost()
{
if (!you.duration[DUR_DIVINE_SHIELD])
return 0;
return you.attribute[ATTR_DIVINE_SHIELD];
}
void qazlal_storm_clouds()
{
if (!have_passive(passive_t::storm_shield))
return;
// You are a *storm*. You are pretty loud!
noisy(min((int)you.piety, piety_breakpoint(5)) / 10, you.pos());
const int radius = you.piety >= piety_breakpoint(3) ? 2 : 1;
vector<coord_def> candidates;
for (radius_iterator ri(you.pos(), radius, C_SQUARE, LOS_SOLID, true);
ri; ++ri)
{
int count = 0;
if (cell_is_solid(*ri) || cloud_at(*ri))
continue;
// Don't create clouds over firewood
const monster * mon = monster_at(*ri);
if (mon != nullptr && mons_is_firewood(*mon))
continue;
// No clouds in corridors.
for (adjacent_iterator ai(*ri); ai; ++ai)
if (!cell_is_solid(*ai))
count++;
if (count >= 5)
candidates.push_back(*ri);
}
const int count =
div_rand_round(min((int)you.piety, piety_breakpoint(5))
* candidates.size() * you.time_taken,
piety_breakpoint(5) * 7 * BASELINE_DELAY);
if (count < 0)
return;
shuffle_array(candidates);
int placed = 0;
for (unsigned int i = 0; placed < count && i < candidates.size(); i++)
{
bool water = false;
for (adjacent_iterator ai(candidates[i]); ai; ++ai)
{
if (feat_is_watery(grd(*ai)))
water = true;
}
// No flame clouds over water to avoid steam generation.
cloud_type ctype;
do
{
ctype = random_choose(CLOUD_FIRE, CLOUD_COLD, CLOUD_STORM,
CLOUD_DUST);
} while (water && ctype == CLOUD_FIRE);
place_cloud(ctype, candidates[i], random_range(3, 5), &you);
placed++;
}
}
/**
* Handle Qazlal's elemental adaptation.
* This should be called (exactly once) for physical, fire, cold, and electrical damage.
* Right now, it is called only from expose_player_to_element. This may merit refactoring.
*
* @param flavour the beam type.
* @param strength The adaptations will trigger strength in (11 - piety_rank()) times. In practice, this is mostly called with a value of 2.
*/
void qazlal_element_adapt(beam_type flavour, int strength)
{
if (strength <= 0
|| !have_passive(passive_t::elemental_adaptation)
|| !x_chance_in_y(strength, 11 - piety_rank()))
{
return;
}
beam_type what = BEAM_NONE;
duration_type dur = NUM_DURATIONS;
string descript = "";
switch (flavour)
{
case BEAM_FIRE:
case BEAM_LAVA:
case BEAM_STICKY_FLAME:
case BEAM_STEAM:
what = BEAM_FIRE;
dur = DUR_QAZLAL_FIRE_RES;
descript = "fire";
break;
case BEAM_COLD:
case BEAM_ICE:
what = BEAM_COLD;
dur = DUR_QAZLAL_COLD_RES;
descript = "cold";
break;
case BEAM_ELECTRICITY:
what = BEAM_ELECTRICITY;
dur = DUR_QAZLAL_ELEC_RES;
descript = "electricity";
break;
case BEAM_MMISSILE: // for LCS, iron shot
case BEAM_MISSILE:
case BEAM_FRAG:
what = BEAM_MISSILE;
dur = DUR_QAZLAL_AC;
descript = "physical attacks";
break;
default:
return;
}
if (what != BEAM_FIRE && you.duration[DUR_QAZLAL_FIRE_RES])
{
mprf(MSGCH_DURATION, "Your resistance to fire fades away.");
you.duration[DUR_QAZLAL_FIRE_RES] = 0;
}
if (what != BEAM_COLD && you.duration[DUR_QAZLAL_COLD_RES])
{
mprf(MSGCH_DURATION, "Your resistance to cold fades away.");
you.duration[DUR_QAZLAL_COLD_RES] = 0;
}
if (what != BEAM_ELECTRICITY && you.duration[DUR_QAZLAL_ELEC_RES])
{
mprf(MSGCH_DURATION, "Your resistance to electricity fades away.");
you.duration[DUR_QAZLAL_ELEC_RES] = 0;
}
if (what != BEAM_MISSILE && you.duration[DUR_QAZLAL_AC])
{
mprf(MSGCH_DURATION, "Your resistance to physical damage fades away.");
you.duration[DUR_QAZLAL_AC] = 0;
you.redraw_armour_class = true;
}
mprf(MSGCH_GOD, "You feel %sprotected from %s.",
you.duration[dur] > 0 ? "more " : "", descript.c_str());
// was scaled by 10 * strength. But the strength parameter is used so inconsistently that
// it seems like a constant would be better, based on the typical value of 2.
you.increase_duration(dur, 20, 80);
if (what == BEAM_MISSILE)
you.redraw_armour_class = true;
}
/**
* Determine whether a Ru worshipper will attempt to interfere with an attack
* against the player.
*
* @return bool Whether or not whether the worshipper will attempt to interfere.
*/
bool does_ru_wanna_redirect(monster* mon)
{
return have_passive(passive_t::aura_of_power)
&& !mon->friendly()
&& you.see_cell_no_trans(mon->pos())
&& !mons_is_firewood(*mon)
&& !mon->submerged()
&& !mons_is_projectile(mon->type);
}
/**
* Determine which, if any, action Ru takes on a possible attack.
*
* @return ru_interference
*/
ru_interference get_ru_attack_interference_level()
{
int r = random2(100);
int chance = div_rand_round(you.piety, 16);
// 10% chance of stopping any attack at max piety
if (r < chance)
return DO_BLOCK_ATTACK;
// 5% chance of redirect at max piety
else if (r < chance + div_rand_round(chance, 2))
return DO_REDIRECT_ATTACK;
else
return DO_NOTHING;
}
static bool _shadow_acts(bool spell)
{
const passive_t pasv = spell ? passive_t::shadow_spells
: passive_t::shadow_attacks;
if (!have_passive(pasv))
return false;
const int minpiety = piety_breakpoint(rank_for_passive(pasv) - 1);
// 10% chance at minimum piety; 50% chance at 200 piety.
const int range = MAX_PIETY - minpiety;
const int min = range / 5;
return x_chance_in_y(min + ((range - min)
* (you.piety - minpiety)
/ (MAX_PIETY - minpiety)),
2 * range);
}
monster* shadow_monster(bool equip)
{
if (monster_at(you.pos()))
return nullptr;
int wpn_index = NON_ITEM;
// Do a basic clone of the weapon.
item_def* wpn = you.weapon();
if (equip
&& wpn
&& is_weapon(*wpn))
{
wpn_index = get_mitm_slot(10);
if (wpn_index == NON_ITEM)
return nullptr;
item_def& new_item = mitm[wpn_index];
if (wpn->base_type == OBJ_STAVES)
{
new_item.base_type = OBJ_WEAPONS;
new_item.sub_type = WPN_STAFF;
}
else
{
new_item.base_type = wpn->base_type;
new_item.sub_type = wpn->sub_type;
}
new_item.quantity = 1;
new_item.rnd = 1;
new_item.flags |= ISFLAG_SUMMONED;
}
monster* mon = get_free_monster();
if (!mon)
{
if (wpn_index)
destroy_item(wpn_index);
return nullptr;
}
mon->type = MONS_PLAYER_SHADOW;
mon->behaviour = BEH_SEEK;
mon->attitude = ATT_FRIENDLY;
mon->flags = MF_NO_REWARD | MF_JUST_SUMMONED | MF_SEEN
| MF_WAS_IN_VIEW | MF_HARD_RESET;
mon->hit_points = you.hp;
mon->set_hit_dice(min(27, max(1,
you.skill_rdiv(wpn_index != NON_ITEM
? item_attack_skill(mitm[wpn_index])
: SK_UNARMED_COMBAT, 10, 20)
+ you.skill_rdiv(SK_FIGHTING, 10, 20))));
mon->set_position(you.pos());
mon->mid = MID_PLAYER;
mon->inv[MSLOT_WEAPON] = wpn_index;
mon->inv[MSLOT_MISSILE] = NON_ITEM;
mgrd(you.pos()) = mon->mindex();
return mon;
}
void shadow_monster_reset(monster *mon)
{
if (mon->inv[MSLOT_WEAPON] != NON_ITEM)
destroy_item(mon->inv[MSLOT_WEAPON]);
// in case the shadow unwields for some reason, e.g. you clumsily bash with
// a ranged weapon:
if (mon->inv[MSLOT_ALT_WEAPON] != NON_ITEM)
destroy_item(mon->inv[MSLOT_ALT_WEAPON]);
if (mon->inv[MSLOT_MISSILE] != NON_ITEM)
destroy_item(mon->inv[MSLOT_MISSILE]);
mon->reset();
}
/**
* Check if the player is in melee range of the target.
*
* Certain effects, e.g. distortion blink, can cause monsters to leave melee
* range between the initial hit & the shadow mimic.
*
* XXX: refactor this with attack/fight code!
*
* @param target The creature to be struck.
* @return Whether the player is melee range of the target, using
* their current weapon.
*/
static bool _in_melee_range(actor* target)
{
const int dist = (you.pos() - target->pos()).rdist();
return dist <= you.reach_range();
}
void dithmenos_shadow_melee(actor* target)
{
if (!target
|| !target->alive()
|| !_in_melee_range(target)
|| !_shadow_acts(false))
{
return;
}
monster* mon = shadow_monster();
if (!mon)
return;
mon->target = target->pos();
mon->foe = target->mindex();
fight_melee(mon, target);
shadow_monster_reset(mon);
}
void dithmenos_shadow_throw(const dist &d, const item_def &item)
{
ASSERT(d.isValid);
if (!_shadow_acts(false))
return;
monster* mon = shadow_monster();
if (!mon)
return;
int ammo_index = get_mitm_slot(10);
if (ammo_index != NON_ITEM)
{
item_def& new_item = mitm[ammo_index];
new_item.base_type = item.base_type;
new_item.sub_type = item.sub_type;
new_item.quantity = 1;
new_item.rnd = 1;
new_item.flags |= ISFLAG_SUMMONED;
mon->inv[MSLOT_MISSILE] = ammo_index;
mon->target = clamp_in_bounds(d.target);
bolt beem;
beem.set_target(d);
setup_monster_throw_beam(mon, beem);
beem.item = &mitm[mon->inv[MSLOT_MISSILE]];
mons_throw(mon, beem, mon->inv[MSLOT_MISSILE]);
}
shadow_monster_reset(mon);
}
void dithmenos_shadow_spell(bolt* orig_beam, spell_type spell)
{
if (!orig_beam)
return;
const coord_def target = orig_beam->target;
if (orig_beam->target.origin()
|| (orig_beam->is_enchantment() && !is_valid_mon_spell(spell))
|| orig_beam->flavour == BEAM_ENSLAVE
&& monster_at(target) && monster_at(target)->friendly()
|| !_shadow_acts(true))
{
return;
}
monster* mon = shadow_monster();
if (!mon)
return;
// Don't let shadow spells get too powerful.
mon->set_hit_dice(max(1,
min(3 * spell_difficulty(spell),
you.experience_level) / 2));
mon->target = clamp_in_bounds(target);
if (actor_at(target))
mon->foe = actor_at(target)->mindex();
spell_type shadow_spell = spell;
if (!orig_beam->is_enchantment())
{
shadow_spell = (orig_beam->pierce) ? SPELL_SHADOW_BOLT
: SPELL_SHADOW_SHARD;
}
bolt beem;
beem.target = target;
beem.aimed_at_spot = orig_beam->aimed_at_spot;
mprf(MSGCH_FRIEND_SPELL, "%s mimicks your spell!",
mon->name(DESC_THE).c_str());
mons_cast(mon, beem, shadow_spell, MON_SPELL_WIZARD, false);
shadow_monster_reset(mon);
}
static void _wu_jian_trigger_serpents_lash(const coord_def& old_pos,
bool wall_jump)
{
if (you.attribute[ATTR_SERPENTS_LASH] == 0)
return;
if (wall_jump && you.attribute[ATTR_SERPENTS_LASH] == 1)
{
// No turn manipulation, since we are only refunding half a wall jump's
// time (the walk speed modifier for this special case is already
// factored in main.cc)
you.attribute[ATTR_SERPENTS_LASH] = 0;
}
else
{
you.turn_is_over = false;
you.elapsed_time_at_last_input = you.elapsed_time;
you.attribute[ATTR_SERPENTS_LASH] -= wall_jump ? 2 : 1;
you.redraw_status_lights = true;
update_turn_count();
}
if (you.attribute[ATTR_SERPENTS_LASH] == 0)
{
you.increase_duration(DUR_EXHAUSTED, 12 + random2(5));
mpr("Your supernatural speed expires.");
}
if (!cell_is_solid(old_pos))
check_place_cloud(CLOUD_DUST, old_pos, 2 + random2(3) , &you, 1, -1);
}
static void _wu_jian_increment_heavenly_storm()
{
int storm = you.props[WU_JIAN_HEAVENLY_STORM_KEY].get_int();
if (storm < WU_JIAN_HEAVENLY_STORM_MAX)
you.props[WU_JIAN_HEAVENLY_STORM_KEY].get_int()++;
}
void wu_jian_heaven_tick()
{
for (radius_iterator ai(you.pos(), 2, C_SQUARE, LOS_SOLID); ai; ++ai)
if (!cell_is_solid(*ai))
place_cloud(CLOUD_GOLD_DUST, *ai, 5 + random2(5), &you);
noisy(15, you.pos());
}
void wu_jian_decrement_heavenly_storm()
{
int storm = you.props[WU_JIAN_HEAVENLY_STORM_KEY].get_int();
if (storm > 1)
{
you.props[WU_JIAN_HEAVENLY_STORM_KEY].get_int()--;
you.set_duration(DUR_HEAVENLY_STORM, random_range(2, 3));
}
else
wu_jian_end_heavenly_storm();
}
void wu_jian_end_heavenly_storm()
{
you.props.erase(WU_JIAN_HEAVENLY_STORM_KEY);
you.duration[DUR_HEAVENLY_STORM] = 0;
invalidate_agrid(true);
mprf(MSGCH_GOD, "The heavenly storm settles.");
}
bool wu_jian_has_momentum(wu_jian_attack_type attack_type)
{
return you.attribute[ATTR_SERPENTS_LASH]
&& attack_type != WU_JIAN_ATTACK_NONE
&& attack_type != WU_JIAN_ATTACK_TRIGGERED_AUX;
}
static bool _can_attack_martial(const monster* mons)
{
return !(mons->wont_attack()
|| mons_is_firewood(*mons)
|| mons_is_projectile(mons->type)
|| !you.can_see(*mons));
}
// A mismatch between attack speed and move speed may cause any particular
// martial attack to be doubled, tripled, or not happen at all. Given enough
// time moving, you would have made the same amount of attacks as tabbing.
static int _wu_jian_number_of_attacks(bool wall_jump)
{
// Under the effect of serpent's lash, move delay is normalized to
// 10 aut for every character, to avoid punishing fast races.
const int move_delay = you.attribute[ATTR_SERPENTS_LASH]
? 100
: player_movement_speed() * player_speed();
int attack_delay;
{
// attack_delay() is dependent on you.time_taken, which won't be set
// appropriately during a movement turn. This temporarily resets
// you.time_taken to the initial value (see `_prep_input`) used for
// basic, simple, melee attacks.
// TODO: can `attack_delay` be changed to not depend on you.time_taken?
unwind_var<int> reset_speed(you.time_taken, player_speed());
attack_delay = you.attack_delay().roll();
}
return div_rand_round(wall_jump ? 2 * move_delay : move_delay,
attack_delay * BASELINE_DELAY);
}
static bool _wu_jian_lunge(const coord_def& old_pos)
{
coord_def lunge_direction = (you.pos() - old_pos).sgn();
coord_def potential_target = you.pos() + lunge_direction;
monster* mons = monster_at(potential_target);
if (!mons || !_can_attack_martial(mons) || !mons->alive())
return false;
if (you.props.exists(WU_JIAN_HEAVENLY_STORM_KEY))
_wu_jian_increment_heavenly_storm();
you.apply_berserk_penalty = false;
const int number_of_attacks = _wu_jian_number_of_attacks(false);
if (number_of_attacks == 0)
{
mprf("You lunge at %s, but your attack speed is too slow for a blow "
"to land.", mons->name(DESC_THE).c_str());
return false;
}
else
{
mprf("You lunge%s at %s%s.",
wu_jian_has_momentum(WU_JIAN_ATTACK_LUNGE) ?
" with incredible momentum" : "",
mons->name(DESC_THE).c_str(),
number_of_attacks > 1 ? ", in a flurry of attacks" : "");
}
count_action(CACT_INVOKE, ABIL_WU_JIAN_LUNGE);
for (int i = 0; i < number_of_attacks; i++)
{
if (!mons->alive())
break;
melee_attack lunge(&you, mons);
lunge.wu_jian_attack = WU_JIAN_ATTACK_LUNGE;
lunge.attack();
}
return true;
}
// Monsters adjacent to the given pos that are valid targets for whirlwind.
static vector<monster*> _get_whirlwind_targets(coord_def pos)
{
vector<monster*> targets;
for (adjacent_iterator ai(pos, true); ai; ++ai)
if (monster_at(*ai) && _can_attack_martial(monster_at(*ai)))
targets.push_back(monster_at(*ai));
sort(targets.begin(), targets.end());
return targets;
}
static bool _wu_jian_whirlwind(const coord_def& old_pos)
{
bool did_at_least_one_attack = false;
const vector<monster*> targets = _get_whirlwind_targets(you.pos());
if (targets.empty())
return did_at_least_one_attack;
const vector<monster*> old_targets = _get_whirlwind_targets(old_pos);
vector<monster*> common_targets;
set_intersection(targets.begin(), targets.end(),
old_targets.begin(), old_targets.end(),
back_inserter(common_targets));
for (auto mons : common_targets)
{
if (!mons->alive())
continue;
if (you.props.exists(WU_JIAN_HEAVENLY_STORM_KEY))
_wu_jian_increment_heavenly_storm();
you.apply_berserk_penalty = false;
const int number_of_attacks = _wu_jian_number_of_attacks(false);
if (number_of_attacks == 0)
{
mprf("You spin to attack %s, but your attack speed is too slow for "
"a blow to land.", mons->name(DESC_THE).c_str());
continue;
}
else
{
mprf("You spin and attack %s%s%s.",
mons->name(DESC_THE).c_str(),
number_of_attacks > 1 ? " repeatedly" : "",
wu_jian_has_momentum(WU_JIAN_ATTACK_WHIRLWIND) ?
", with incredible momentum" : "");
}
count_action(CACT_INVOKE, ABIL_WU_JIAN_WHIRLWIND);
for (int i = 0; i < number_of_attacks; i++)
{
if (!mons->alive())
break;
melee_attack whirlwind(&you, mons);
whirlwind.wu_jian_attack = WU_JIAN_ATTACK_WHIRLWIND;
whirlwind.wu_jian_number_of_targets = common_targets.size();
whirlwind.attack();
if (!did_at_least_one_attack)
did_at_least_one_attack = true;
}
}
return did_at_least_one_attack;
}
static bool _wu_jian_trigger_martial_arts(const coord_def& old_pos)
{
bool did_wu_jian_attacks = false;
if (you.pos() == old_pos || you.duration[DUR_CONF])
return did_wu_jian_attacks;
if (have_passive(passive_t::wu_jian_lunge))
did_wu_jian_attacks = _wu_jian_lunge(old_pos);
if (have_passive(passive_t::wu_jian_whirlwind))
did_wu_jian_attacks |= _wu_jian_whirlwind(old_pos);
return did_wu_jian_attacks;
}
void wu_jian_wall_jump_effects()
{
vector<monster*> targets;
for (adjacent_iterator ai(you.pos(), true); ai; ++ai)
{
monster* target = monster_at(*ai);
if (target && _can_attack_martial(target) && target->alive())
targets.push_back(target);
if (!cell_is_solid(*ai))
check_place_cloud(CLOUD_DUST, *ai, 1 + random2(3) , &you, 0, -1);
}
for (auto target : targets)
{
if (!target->alive())
continue;
if (you.props.exists(WU_JIAN_HEAVENLY_STORM_KEY))
_wu_jian_increment_heavenly_storm();
you.apply_berserk_penalty = false;
// Twice the attacks as Wall Jump spends twice the time
const int number_of_attacks = _wu_jian_number_of_attacks(true);
if (number_of_attacks == 0)
{
mprf("You attack %s from above, but your attack speed is too slow"
" for a blow to land.", target->name(DESC_THE).c_str());
continue;
}
else
{
mprf("You %sattack %s from above%s.",
number_of_attacks > 1 ? "repeatedly " : "",
target->name(DESC_THE).c_str(),
wu_jian_has_momentum(WU_JIAN_ATTACK_WALL_JUMP) ?
", with incredible momentum" : "");
}
for (int i = 0; i < number_of_attacks; i++)
{
if (!target->alive())
break;
melee_attack aerial(&you, target);
aerial.wu_jian_attack = WU_JIAN_ATTACK_WALL_JUMP;
aerial.wu_jian_number_of_targets = targets.size();
aerial.attack();
}
}
}
bool wu_jian_post_move_effects(bool did_wall_jump,
const coord_def& initial_position)
{
bool did_wu_jian_attacks = false;
if (!did_wall_jump)
did_wu_jian_attacks = _wu_jian_trigger_martial_arts(initial_position);
if (you.turn_is_over)
_wu_jian_trigger_serpents_lash(initial_position, did_wall_jump);
return did_wu_jian_attacks;
}
/**
* check if the monster in this cell exists and is a valid target for Uskayaw
*/
static int _check_for_uskayaw_targets(coord_def where)
{
if (!cell_has_valid_target(where))
return 0;
monster* mons = monster_at(where);
ASSERT(mons);
if (mons_is_firewood(*mons))
return 0;
return 1;
}
/**
* Paralyse the monster in this cell, assuming one exists.
*
* Duration increases with invocations and experience level, and decreases
* with target HD. The duration is pretty low, maxing out at 40 AUT.
*/
static int _prepare_audience(coord_def where)
{
if (!_check_for_uskayaw_targets(where))
return 0;
monster* mons = monster_at(where);
int power = max(1, random2(1 + you.skill(SK_INVOCATIONS, 2))
+ you.experience_level - mons->get_hit_dice());
int duration = min(max(10, 5 + power), 40);
mons->add_ench(mon_enchant(ENCH_PARALYSIS, 1, &you, duration));
return 1;
}
/**
* On hitting *** piety, all the monsters are paralysed by their appreciation
* for your dance.
*/
void uskayaw_prepares_audience()
{
int count = apply_area_visible(_check_for_uskayaw_targets, you.pos());
if (count > 0)
{
simple_god_message(" prepares the audience for your solo!");
apply_area_visible(_prepare_audience, you.pos());
// Increment a delay timer to prevent players from spamming this ability
// via piety loss and gain. Timer is in AUT.
you.props[USKAYAW_AUDIENCE_TIMER] = 300 + random2(201);
}
else // Reset the timer because we didn't actually execute.
you.props[USKAYAW_AUDIENCE_TIMER] = 0;
}
/**
* Apply pain bond to the monster in this cell.
*/
static int _bond_audience(coord_def where)
{
if (!_check_for_uskayaw_targets(where))
return 0;
monster* mons = monster_at(where);
// Don't pain bond monsters that aren't invested in fighting the player
if (mons->wont_attack())
return 0;
int power = you.skill(SK_INVOCATIONS, 7) + you.experience_level
- mons->get_hit_dice();
int duration = 20 + random2avg(power, 2);
mons->add_ench(mon_enchant(ENCH_PAIN_BOND, 1, &you, duration));
return 1;
}
/**
* On hitting **** piety, all the monsters are pain bonded.
*/
void uskayaw_bonds_audience()
{
int count = apply_area_visible(_check_for_uskayaw_targets, you.pos());
if (count > 1)
{
simple_god_message(" links your audience in an emotional bond!");
apply_area_visible(_bond_audience, you.pos());
// Increment a delay timer to prevent players from spamming this ability
// via piety loss and gain. Timer is in AUT.
you.props[USKAYAW_BOND_TIMER] = 300 + random2(201);
}
else // Reset the timer because we didn't actually execute.
you.props[USKAYAW_BOND_TIMER] = 0;
}
↑ V1051 Consider checking for misprints. It's possible that the 'mon->target' should be used inside 'actor_at' function.


I will first start telling you the meaning of my name, lol i know this is extremely funny. Bannette is a doll pokeman that was thrown by the owneram sure you dont believe that but heloo! thats what my parents told me. thats according to my parents.Now ask me what bannette means? I surely dont know, maybe a great Author, yeah or is it script writter? anyway I can leave it to you to define me by interacting with me.
Am sure right now you are notsure if you really want to now much about me.
Here is a link to my gallery.
My name is Bannette Aloo,I am hardworking, self-driven, committed, goal oriented and also able to work under minimal or no supervision.
I pride myself to cope up with changes easily.
In addition my written and verbal communication skills are impeccable as are my team building and problem solving abilities. Am also able to work to details and meet deadlines.
I love culture, AEISEC GROUP OF KENYA has natured my cultural skills from diffent ethics and am glad I can mingle with different people, different environment and society
This my education Background;
Degree in Business Information Technology- Multimedia University of Kenya; January 2015-June 2017
Diploma in Business Information Technology- Multimedia University of Kenya; July 2012- December 2014
Secondry level: Keveye Girls High School(2008-2011)
Primary School; Busia Ebenezer Academy;class of 2007
RESEARCH WITH HEALTH STRAT KENYA: November 14 th 2018-December 14 th 2018:Position: Research Assistant
RESEARCH WITH THE UNFAP: September 2018- October 2018:Position: Research Assistant
KENYA LANDS COMMISSION: (Internship): September 2017 to February 2018:Position: IT Specialist/ DBMs personnel
UNIVERSAL CUISINE KENYA: November 2016 to March 2017:Position:Position: DBMs personnel, Digital Marketing
About my hobbies I think am going to talk of a few but literally I have so many hobbies;
In total I have done two projects; which am still learning and working on them to be perfect


The World Wide Web is a collection of HTML documents. The browser on your computer makes requests to servers. Servers are computers that host the files that make up the web. They communicate using HTTP, the main protocol of the web.
HTML stands for Hyper Text Markup Language. HTML consists of the text or content of the page, the markup or what it looks like/how it's arranged, references to other documents such as images or videos, and lastly links to other pages on the internet. For example, here is a link to the Udacity Course Catalog.
In Lesson 1 we learned a lot about different tags and their attributes. Tags are usually made up of opening and closing tags. Void tags, however, do not need a closing tag as they do not contain content. Examples of void tags include the < br > tag. It's a good idea to make your closing tags as soon as you have typed your opening tags. If you forget, the computer won't know to fix your mistake and the webpage will not display correctly.
We also learned about the difference between inline and block elements. Inline elements are simply text elements, such as the img or br tags whereas block elements, such as the paragraph tag, make an invisible block around the content.
The span and div tags are important because we can attach styles to them. The span tag is an inline element and the div tag is a block element.1. A webpage is a text document written in HTML. Web browsers read these documents, interpret, and display them.
2. Coding is the language the computer understands
3.  Programmers need to be exact with their language. A simple typo could prevent the webpage from displaying correctly or at all.
4. Programmers can not remember everything. It is okay to look up bits of code.
5. Basic HTML vocabulary, including tags and elements.


{% extends "email-base.html" %}{% block content %}Hi.
Your upload of the package '{{ args.upload.package.name }}' to {{ args.settings.SITE_NAME}} was
successful. Others can now see it. The URL of your package is:
{{ args.settings.SITE_URL }}{% url 'package' args.upload.package.name %}
The respective dsc file can be found at:
{{ args.settings.SITE_URL }}{{ args.upload.get_dsc_url }}
If you do not yet have a sponsor for your package you may want to go to:
{{ args.settings.SITE_URL }}{% url 'package_rfs' args.upload.package.name %}
and set the "Seeking a sponsor" option to highlight your package on the
welcome page.
You can also send an RFS (request for sponsorship) to the debian-mentors
mailing list. Your package page will give your suggestions on how to
send that mail.
Good luck in finding a sponsor!
Thanks,{% endblock %}


The three new things that I learned about myself and my ego as a result of the core learning were my persistence through the challenges I had faced, being brave enough to ask for help when I needed it (even if it was just one person), and being more open and grateful for the satisfaction from the little victories.
The role that values, empathy and self-awareness play in learning and programming are vital in that it gives someone a solid foundation of what that person deems important to them, whether that is family-oriented thinking in a potential employer, the values of being responsible for ones' own self, having transparency (to name a few), being supportive towards others in your cohort, or in your job, and also just in life. The connection of these roles to learning is made when you know what you want to achieve and aspire to be able to learn in a way that doesn't compromise your own views, or , also in programming when you form, hopefully, positive relationships throughout your career that are based on the values you have, your empathy towards others and self-awareness in how you are a human being and indiviual.
What surprised me the most about core learning were the opportunities to look deeper into how shifting our mindset towards how we learn, that played a huge part during the learning of the technical skills - and thus boosting that self-confidence. I think also being able to practice an introspective mindset also surprised me as well, because then how do we learn from our reflections?
One of the most challenging aspects of the core learning had to be getting used to the idea that our introspection while learning was just as important than learning without. It's hard to write that much about yourself *especially* when you know that there are others who are in the boat with you.
I think that EDA spends this much time on focusing on core learning skills as sometimes when learning is just focusing on the content related, it's hard to keep a track on how you are growing as a person.
I feel as though the time I spent studying the core learning side was well spent, because it adds another skill-set that contributes to your technical knowledge as well.


Provides APIs for key-value Object CRUD operation on KiiCloud.
| Example |
// example 1. Create new object on KiiCloud. KiiObject obj = Kii.Bucket("hiscore").NewKiiObject(); obj["name"] = "John"; obj["score"] = 95; obj.Save(); // example 2. Update an object. KiiObject obj = KiiObject.CreateByUri(uri); obj.Refresh(); obj["score"] = 100; obj.Save(); |
See Also: Inherited members from KiiBaseObject.
| [read-only] | BodyContentType | string . Gets the ContentType of the body. |
| [read-only] | CreatedTime | long . Gets the created time on KiiCloud. |
|
default property
|
Item (string) | object . Gets or sets the object with the specified key. (Inherited from KiiBaseObject.) |
| [read-only] | ModifedTime | long . Gets the modifed time on KiiCloud. |
| [read-only] | Uri | Uri . Gets the URI of this instance. |
|
|
Acl
(ObjectAction)Gets the acl for this object |
|
|
static
|
CreateByUri
(Uri)Creates KiiObject by Uri |
|
|
|
Delete
()Delete KiiObject from KiiCloud |
|
|
|
Delete
(KiiObjectCallback)Delete KiiObject from KiiCloud |
|
|
|
DeleteBody
()Delete the body of the KiiObject from KiiCloud. |
|
|
|
DeleteBody
(KiiObjectCallback)Delete the body of the KiiObject from KiiCloud. |
|
|
|
DownloadBody
(System.IO.Stream)Download the body of the KiiObject from KiiCloud. |
|
|
|
DownloadBody
(System.IO.Stream, KiiObjectBodyDownloadCallback)Download the body of the KiiObject from KiiCloud. This API will be executed asynchronously. |
|
|
|
DownloadBody
(System.IO.Stream, KiiObjectBodyDownloadCallback, KiiObjectBodyProgressCallback)Download the body of the KiiObject from KiiCloud. This API will be executed asynchronously. |
|
|
|
DownloadBody
(System.IO.Stream, KiiObjectBodyDownloadCallback, KiiObjectBodyProgressPercentageCallback)Download the body of the KiiObject from KiiCloud. This API will be executed asynchronously. |
|
|
|
GetBoolean
(string)Gets the boolean in KiiBaseObject. (Inherited from KiiBaseObject.) |
|
|
|
GetBoolean
(string, bool)Gets the boolean. If key is not found, returns fallback. (Inherited from KiiBaseObject.) |
|
|
|
GetByteArray
(string)Gets the byte array with the specified key. (Inherited from KiiBaseObject.) |
|
|
|
GetDouble
(string)Gets the double in KiiBaseObject. (Inherited from KiiBaseObject.) |
|
|
|
GetDouble
(string, double)Gets the double. If key is not found, returns fallback. (Inherited from KiiBaseObject.) |
|
|
|
GetGeoPoint
(string)Gets the GeoPoint associated with the given key. |
|
|
|
GetGeoPoint
(string, KiiGeoPoint)Get the GeoPoint of this object tied to the specified key. If KiiGeoPoint can not be returned for specified key, fallback will be returned. |
|
|
|
GetInt
(string)Gets the integer in KiiBaseObject. (Inherited from KiiBaseObject.) |
|
|
|
GetInt
(string, int)Gets the integer. If key is not found, returns fallback. (Inherited from KiiBaseObject.) |
|
|
|
GetJsonArray
(string)Gets the Json array with the specified key. (Inherited from KiiBaseObject.) |
|
|
|
GetJsonObject
(string)Gets the JSON object with the specified key. (Inherited from KiiBaseObject.) |
|
|
|
GetLong
(string)Gets the long in KiiBaseObject. (Inherited from KiiBaseObject.) |
|
|
|
GetLong
(string, long)Gets the long. If key is not found, returns fallback. (Inherited from KiiBaseObject.) |
|
|
|
GetString
(string)Gets the string in KiiBaseObject. (Inherited from KiiBaseObject.) |
|
|
|
GetString
(string, string)Gets the string. If key is not found, returns fallback. (Inherited from KiiBaseObject.) |
|
|
|
GetUri
(string)Gets the Uri with the specified key. (Inherited from KiiBaseObject.) |
|
|
|
Has
(string)Determine if this instance has the specified key. (Inherited from KiiBaseObject.) |
|
|
|
Keys
()Gets the list of keys (Inherited from KiiBaseObject.) |
|
|
|
ListAclEntries
()Lists the acl entries of this object |
|
|
|
ListAclEntries
(KiiACLListCallback<KiiObject, ObjectAction>)Lists the acl entries of this object |
|
|
|
PublishBody
()Publishes the KiiObject attached file and return the file URL. URL will not be expired. |
|
|
|
PublishBody
(KiiObjectPublishCallback)Publishes the KiiObject attached file and return the file URL. URL will not be expired. |
|
|
|
PublishBodyExpiresAt
(DateTime)Publishes the KiiObject attached file and return the file URL. URL will be expired on the specified expire time. |
|
|
|
PublishBodyExpiresAt
(DateTime, KiiObjectPublishCallback)Publishes the KiiObject attached file and return the file URL. URL will be expired on the specified expire time. |
|
|
|
PublishBodyExpiresIn
(long)Publishes the KiiObject attached file and return the file URL. URL will be expired on the specified expire time. |
|
|
|
PublishBodyExpiresIn
(long, KiiObjectPublishCallback)Publishes the KiiObject attached file and return the file URL. URL will be expired on the specified expire time. |
|
|
|
Refresh
()Get latest KiiObject form KiiCloud and refresh properties. |
|
|
|
Refresh
(KiiObjectCallback)Get latest KiiObject form KiiCloud and refresh properties. |
|
|
|
Remove
(string)Remove the specified key and value. (Inherited from KiiBaseObject.) |
|
|
|
Save
()Create or update the KiiObject on KiiCloud. |
|
|
|
Save
(KiiObjectCallback)Create or update the KiiObject on KiiCloud. |
|
|
|
Save
(bool)Create or update the KiiObject on KiiCloud. |
|
|
|
Save
(bool, KiiObjectCallback)Create or update the KiiObject on KiiCloud. |
|
|
|
SaveAllFields
(bool)Create or update the KiiObject on KiiCloud. |
|
|
|
SaveAllFields
(bool, KiiObjectCallback)Create or update the KiiObject on KiiCloud. |
|
|
|
SetGeoPoint
(string, KiiGeoPoint)Sets the geo point to this object with the specified key. |
|
|
|
UploadBody
(string, System.IO.Stream)Upload the body of the KiiObject to KiiCloud. |
|
|
|
UploadBody
(string, System.IO.Stream, KiiObjectCallback)Upload the body of the KiiObject to KiiCloud. This API will be executed asynchronously. |
|
|
|
UploadBody
(string, System.IO.Stream, KiiObjectCallback, KiiObjectBodyProgressCallback)Upload the body of the KiiObject to KiiCloud. This API will be executed asynchronously. |
|
|
|
UploadBody
(string, System.IO.Stream, KiiObjectCallback, KiiObjectBodyProgressPercentageCallback)Upload the body of the KiiObject to KiiCloud. This API will be executed asynchronously. |
Gets the acl for this objectSyntax
public KiiObjectAcl Acl (ObjectAction action)Parameters
- action
- Object ACL action.
Returns
KiiObjectAcl instance.Remarks
Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Gets the ContentType of the body.Syntax
public string BodyContentType { get; }Value
The type of the body content.Remarks
This property will be set after KiiObject.UploadBody(string, System.IO.Stream) / KiiObject.DownloadBody(System.IO.Stream) and clear after KiiObject.DeleteBodyRequirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Creates KiiObject by UriSyntax
Parameters
- uri
- Uri of KiiObject
Returns
KiiObject instance.Remarks
Please use Uri property for an argument.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Gets the created time on KiiCloud.Syntax
public long CreatedTime { get; }Value
The created time.Remarks
If this instance is not saved or refreshed, return -1Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Delete KiiObject from KiiCloudSyntax
public void Delete ()Exceptions
Type Reason InvalidOperationException Is thrown when this instance doesn't have id or bucket. KiiCorp.Cloud.Storage.CloudException Is thrown when server sends error response. Remarks
Do not use this instance after this API is called.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Delete KiiObject from KiiCloudSyntax
public void Delete (KiiObjectCallback callback)Parameters
- callback
- Callback.
Remarks
Do not use this instance after this API is called.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Delete the body of the KiiObject from KiiCloud.Syntax
public void DeleteBody ()Exceptions
Type Reason InvalidOperationException Thrown if this object has not saved to the Kii Cloud. KiiCorp.Cloud.Storage.NotFoundException Thrown if object body,object,bucket or bucket owner not exists in Kii Cloud. KiiCorp.Cloud.Storage.UnauthorizedException Thrown if current user has no permission to delete the KiiObject body. Remarks
NOTE: This api access to server. Should not be executed in UI/Main thread.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Delete the body of the KiiObject from KiiCloud.Syntax
public void DeleteBody (KiiObjectCallback callback)Parameters
- callback
- KiiObjectCallback.
Remarks
This API sends a request to KiiCloud.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Download the body of the KiiObject from KiiCloud.Syntax
public void DownloadBody (System.IO.Stream outStream)Parameters
- outStream
- The stream to be written. This stream is NOT closed after execution.
Exceptions
Type Reason KiiCorp.Cloud.Storage.NotFoundException Is thrown when KiiObject or body is not in KiiCloud. KiiCorp.Cloud.Storage.UnauthorizedException Is thrown when current user cannot access this KiiObject. Remarks
The stream will NOT be closed after executon.
NOTE: This api access to server. Should not be executed in UI/Main thread.
Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Download the body of the KiiObject from KiiCloud. This API will be executed asynchronously.Syntax
Parameters
- outStream
- The stream to be written. This stream is NOT closed after execution.
- callback
- Callback.
Remarks
The stream will NOT be closed after executon.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Download the body of the KiiObject from KiiCloud. This API will be executed asynchronously.Syntax
public void DownloadBody (System.IO.Stream outStream, KiiObjectBodyDownloadCallback callback, KiiObjectBodyProgressCallback progressCallback)Parameters
- outStream
- The stream to be written. This stream is NOT closed after execution.
- callback
- Callback.
- progressCallback
- This callback will be called when API will tell a progress.
Remarks
KiiObjectBodyProgressCallback doesn't work properly when use KiiInitializeBehaviour in order to initialize the KiiCloudSDK. Use KiiObject.DownloadBody(System.IO.Stream, KiiObjectBodyDownloadCallback, KiiObjectBodyProgressPercentageCallback) instead. The stream will NOT be closed after executon.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Download the body of the KiiObject from KiiCloud. This API will be executed asynchronously.Syntax
public void DownloadBody (System.IO.Stream outStream, KiiObjectBodyDownloadCallback callback, KiiObjectBodyProgressPercentageCallback progressCallback)Parameters
- outStream
- The stream to be written. This stream is NOT closed after execution.
- callback
- Callback.
- progressCallback
- This callback will be called when API will tell a progress.
Remarks
The stream will NOT be closed after executon.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Gets the GeoPoint associated with the given key.Syntax
public KiiGeoPoint GetGeoPoint (string key)Parameters
- key
- The key to retrieve. Must not null or empty string.
Returns
An instance of KiiGeoPoint tied to the key.Exceptions
Type Reason ArgumentException Is thrown when an argument is invalid. Please see parameter explanation. KiiCorp.Cloud.Storage.IllegalKiiBaseObjectFormatException Throw IllegalKiiBaseObjectFormatException if can not get KiiGeoPoint object with specified key. Remarks
Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Get the GeoPoint of this object tied to the specified key. If KiiGeoPoint can not be returned for specified key, fallback will be returned.Syntax
Parameters
- key
- The key to retrieve.
- fallBack
- return if geo point can not be returned for the specified key.
Returns
An instance of KiiGeoPoint tied to the key.Remarks
Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Lists the acl entries of this objectSyntax
public IList<KiiACLEntry<KiiObject, ObjectAction>> ListAclEntries ()Returns
The list of acl entries.Remarks
This API sends a request to KiiCloud.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Lists the acl entries of this objectSyntax
public void ListAclEntries (KiiACLListCallback<KiiObject, ObjectAction> callback)Parameters
- callback
- Callback.
Returns
The list of acl entries.Remarks
This API sends a request to KiiCloud.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Gets the modifed time on KiiCloud.Syntax
public long ModifedTime { get; }Value
The modifed time.Remarks
If this instance is not saved or refreshed, return -1Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Publishes the KiiObject attached file and return the file URL. URL will not be expired.Syntax
public string PublishBody ()Returns
The file URL.Exceptions
Type Reason InvalidOperationException Is thrown when this object is not uploaded in Kii Cloud. KiiCorp.Cloud.Storage.NotFoundException Is thrown when Object / Bucket / Bucket owner is not in Kii Cloud. KiiCorp.Cloud.Storage.UnauthorizedException Is throwns when current user cannot access this KiiObject. Remarks
NOTE: This api access to server. Should not be executed in UI/Main thread.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Publishes the KiiObject attached file and return the file URL. URL will not be expired.Syntax
public void PublishBody (KiiObjectPublishCallback callback)Parameters
- callback
- Callback.
Remarks
This API sends a request to KiiCloud.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Publishes the KiiObject attached file and return the file URL. URL will be expired on the specified expire time.Syntax
Parameters
- expiresAt
- A time of expired date in milliseconds (Since January 1, 1970 00:00:00 UTC).
Returns
The file URL.Exceptions
Type Reason InvalidOperationException Is thrown when this object is not uploaded in Kii Cloud. KiiCorp.Cloud.Storage.NotFoundException Is thrown when Object / Bucket / Bucket owner is not in Kii Cloud. KiiCorp.Cloud.Storage.UnauthorizedException Is throwns when current user cannot access this KiiObject. Remarks
NOTE: This api access to server. Should not be executed in UI/Main thread.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Publishes the KiiObject attached file and return the file URL. URL will be expired on the specified expire time.Syntax
Parameters
- expiresAt
- A time of expired date in milliseconds (Since January 1, 1970 00:00:00 UTC).
- callback
- Callback.
Remarks
This API sends a request to KiiCloud.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Publishes the KiiObject attached file and return the file URL. URL will be expired on the specified expire time.Syntax
Parameters
- expiresIn
- The period time in seconds the publication URL has to be available, after that it will expire.
Returns
The file URL.Exceptions
Type Reason InvalidOperationException Is thrown when this object is not uploaded in Kii Cloud. ArgumentException Is thrown when expiresIn <= 0 KiiCorp.Cloud.Storage.NotFoundException Is thrown when Object / Bucket / Bucket owner is not in Kii Cloud. KiiCorp.Cloud.Storage.UnauthorizedException Is throwns when current user cannot access this KiiObject. Remarks
NOTE: This api access to server. Should not be executed in UI/Main thread.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Publishes the KiiObject attached file and return the file URL. URL will be expired on the specified expire time.Syntax
Parameters
- expiresIn
- The period time in seconds the publication URL has to be available, after that it will expire.
- callback
- Callback.
Remarks
This API sends a request to KiiCloud.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Get latest KiiObject form KiiCloud and refresh properties.Syntax
public void Refresh ()Exceptions
Type Reason InvalidOperationException Is thrown when this instance doesn't have id or bucket. KiiCorp.Cloud.Storage.IllegalKiiBaseObjectFormatException Is thrown when server sends broken Json. KiiCorp.Cloud.Storage.CloudException Is thrown when server sends error response. Remarks
Please call this API to the object created by KiiObject.CreateByUri(Uri)Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Get latest KiiObject form KiiCloud and refresh properties.Syntax
public void Refresh (KiiObjectCallback callback)Parameters
- callback
- Callback.
Remarks
Please call this API to the object created by KiiObject.CreateByUri(Uri)Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Create or update the KiiObject on KiiCloud.Syntax
public void Save ()Remarks
This API uploads only modified fields. This call is same as KiiObject.Save(true)Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Create or update the KiiObject on KiiCloud.Syntax
public void Save (KiiObjectCallback callback)Parameters
- callback
- Callback.
Remarks
This API uploads only modified fields. This call is same as KiiObject.Save(true)Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Create or update the KiiObject on KiiCloud.Syntax
Parameters
- overWrite
- Over write.
Remarks
This API uploads only modified fields.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Create or update the KiiObject on KiiCloud.Syntax
Parameters
- overWrite
- Over write.
- callback
- Callback.
Remarks
This API uploads only modified fields.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Create or update the KiiObject on KiiCloud.Syntax
Parameters
- overWrite
- If
and object in KiiCloud is updated, KiiCorp.Cloud.Storage.CloudException is thrown.
Example falseRemarks
When this API updates object in KiiCloud, object's all fields in KiiCloud are replaced by fields in this instance.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Create or update the KiiObject on KiiCloud.Syntax
Parameters
- overWrite
- If
and object in KiiCloud is updated, KiiCorp.Cloud.Storage.CloudException is thrown.
Example false- callback
- Callback.
Remarks
When this API updates object in KiiCloud, object's all fields in KiiCloud are replaced by fields in this instance.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Sets the geo point to this object with the specified key.Syntax
Parameters
- key
- Key, name of the field. Must not null or empty string.
- geoObj
- Geo object to be tied to the specified key. Must not null.
Exceptions
Type Reason ArgumentException Is thrown when an argument is invalid. Please see parameter explanation. Remarks
Documentation for this section has not yet been entered.Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Upload the body of the KiiObject to KiiCloud.Syntax
Parameters
- contentType
- Content type of body.
- stream
- The object body to be uploaded. This stream will be closed after execution.
Exceptions
Type Reason KiiCorp.Cloud.Storage.NotFoundException Is thrown when KiiObject is not in KiiCloud. KiiCorp.Cloud.Storage.UnauthorizedException Is thrown when current user cannot access this KiiObject. Remarks
The stream will be closed after execution.
NOTE: This api access to server. Should not be executed in UI/Main thread.
NOTE: After this operation, KiiObject version on cloud will be updated. If you want to use KiiObject.Save(bool) with overwrite=false argument, please do KiiObject.Refresh before saving.
Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Upload the body of the KiiObject to KiiCloud. This API will be executed asynchronously.Syntax
Parameters
- contentType
- Content type of body.
- stream
- The object body to be uploaded.
- callback
- Callback.
Remarks
The stream will be closed after execution.
NOTE: After this operation, KiiObject version on cloud will be updated. If you want to use KiiObject.Save(bool) with overwrite=false argument, please do KiiObject.Refresh before saving.
Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Upload the body of the KiiObject to KiiCloud. This API will be executed asynchronously.Syntax
public void UploadBody (string contentType, System.IO.Stream stream, KiiObjectCallback callback, KiiObjectBodyProgressCallback progressCallback)Parameters
- contentType
- Content type of body.
- stream
- The object body to be uploaded.
- callback
- Callback.
- progressCallback
- This callback will be called when API will tell a progress.
Remarks
KiiObjectBodyProgressCallback doesn't work properly when use KiiInitializeBehaviour in order to initialize the KiiCloudSDK. Use KiiObject.UploadBody(string, System.IO.Stream, KiiObjectCallback, KiiObjectBodyProgressPercentageCallback) instead.The stream will be closed after execution.
NOTE: After this operation, KiiObject version on cloud will be updated. If you want to use KiiObject.Save(bool) with overwrite=false argument, please do KiiObject.Refresh before saving.
Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Upload the body of the KiiObject to KiiCloud. This API will be executed asynchronously.Syntax
public void UploadBody (string contentType, System.IO.Stream stream, KiiObjectCallback callback, KiiObjectBodyProgressPercentageCallback progressCallback)Parameters
- contentType
- Content type of body.
- stream
- The object body to be uploaded.
- callback
- Callback.
- progressCallback
- This callback will be called when API will tell a progress.
Remarks
The stream will be closed after execution.
NOTE: After this operation, KiiObject version on cloud will be updated. If you want to use KiiObject.Save(bool) with overwrite=false argument, please do KiiObject.Refresh before saving.
Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Gets the URI of this instance.Syntax
public Uri Uri { get; }Value
The URI of this instance.Exceptions
Type Reason InvalidOperationException Is thrown when this object doesn't have ID Remarks
Format is the following:
- Application scope object: kiicloud://buckets/{name of bucket}/objects/{id of the object}
- User scope object: kiicloud://users/{id of the user}/buckets/{name of bucket}/objects/{id of the object}
- Group scope object: kiicloud://groups/{id of the group}/buckets/{name of bucket}/objects/{id of the object}
Requirements
Namespace: KiiCorp.Cloud.Storage
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>


Text from [[${gcsDocumentUrl}]]
Back to Status Page
First 50 words of on page [[${pageNumber}]]:
[[${text}]]


--- title: Page not found layout: layouts/page.njk permalink: /404.html ---
The page you requested could not be found.